|
| 1 | +import * as apiv2 from "@metal-stack/api/js/metalstack/api/v2/ip_pb"; |
| 2 | +import { createClient } from "@connectrpc/connect"; |
| 3 | +import { createConnectTransport } from "@connectrpc/connect-web"; |
| 4 | + |
| 5 | +import { Code, ConnectError, Interceptor } from "@connectrpc/connect"; |
| 6 | + |
| 7 | +class AuthInterceptor { |
| 8 | + private authToken: string; |
| 9 | + |
| 10 | + constructor(authToken: string) { |
| 11 | + this.authToken = authToken; |
| 12 | + } |
| 13 | + |
| 14 | + interceptor: Interceptor = (next) => async (req) => { |
| 15 | + if (!this.authToken) { |
| 16 | + throw new ConnectError("Missing auth token", Code.Unauthenticated); |
| 17 | + } |
| 18 | + |
| 19 | + req.header.append("Authorization", `Bearer ${this.authToken}`); |
| 20 | + |
| 21 | + try { |
| 22 | + const res = await next(req); |
| 23 | + return res; |
| 24 | + } catch (e) { |
| 25 | + if (e instanceof ConnectError && e.code === Code.Unauthenticated) { |
| 26 | + // e.g. message: "token has expired" |
| 27 | + console.error("unauthenticated", e); |
| 28 | + } |
| 29 | + throw e; |
| 30 | + } |
| 31 | + }; |
| 32 | +} |
| 33 | + |
| 34 | +async function main() { |
| 35 | + const token = process.env["API_TOKEN"]; |
| 36 | + const project = process.env["PROJECT_ID"]; |
| 37 | + const baseUrl = process.env["METAL_APISERVER_URL"]; |
| 38 | + |
| 39 | + const auth = new AuthInterceptor(token!); |
| 40 | + const client = createClient( |
| 41 | + apiv2.IPService, |
| 42 | + createConnectTransport({ |
| 43 | + baseUrl: baseUrl!, |
| 44 | + interceptors: [auth.interceptor], |
| 45 | + }), |
| 46 | + ); |
| 47 | + |
| 48 | + const listResp = await client.list({ project }); |
| 49 | + |
| 50 | + for (const ip of listResp.ips) { |
| 51 | + console.log("ip", ip); |
| 52 | + } |
| 53 | +} |
| 54 | + |
| 55 | +main(); |
0 commit comments