@alpic-ai/sdk 0.0.0-dev.g6d7c5c7 → 0.0.0-dev.g99a887e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.d.ts +1 -5
- package/dist/api/client.js +8 -11
- package/dist/api/client.js.map +1 -1
- package/dist/auth/index.d.ts +3 -4
- package/dist/auth/index.js +5 -12
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +3 -3
- package/dist/client.js +15 -5
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/emitter.d.ts +3 -3
- package/dist/lib/emitter.js +24 -22
- package/dist/lib/emitter.js.map +1 -1
- package/dist/tunnel/tunnel.d.ts +10 -8
- package/dist/tunnel/tunnel.js +119 -117
- package/dist/tunnel/tunnel.js.map +1 -1
- package/package.json +2 -2
- package/dist/api/auth-scope.d.ts +0 -2
- package/dist/api/auth-scope.js +0 -7
- package/dist/api/auth-scope.js.map +0 -1
package/dist/api/client.d.ts
CHANGED
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
import { contract } from "@alpic-ai/api";
|
|
2
2
|
import type { ContractRouterClient } from "@orpc/contract";
|
|
3
3
|
export type AlpicApi = ContractRouterClient<typeof contract>;
|
|
4
|
-
export type ApiAuth = {
|
|
5
|
-
getToken: () => Promise<string | undefined>;
|
|
6
|
-
getUserAccessToken: () => Promise<string | undefined>;
|
|
7
|
-
};
|
|
8
4
|
export declare function createApiClient(opts: {
|
|
9
5
|
apiBaseUrl: string;
|
|
10
|
-
|
|
6
|
+
getToken: () => Promise<string | undefined>;
|
|
11
7
|
}): AlpicApi;
|
package/dist/api/client.js
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { contract } from "@alpic-ai/api";
|
|
2
2
|
import { createORPCClient } from "@orpc/client";
|
|
3
3
|
import { ResponseValidationPlugin } from "@orpc/contract/plugins";
|
|
4
4
|
import { OpenAPILink } from "@orpc/openapi-client/fetch";
|
|
5
|
-
import { getAuthScopeForPath } from "./auth-scope.js";
|
|
6
5
|
export function createApiClient(opts) {
|
|
7
6
|
const link = new OpenAPILink(contract, {
|
|
8
7
|
url: opts.apiBaseUrl,
|
|
9
|
-
headers: async (
|
|
10
|
-
const headers =
|
|
11
|
-
if (headers.Authorization) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if (token) {
|
|
17
|
-
headers.Authorization = `Bearer ${token}`;
|
|
8
|
+
headers: async ({ context }) => {
|
|
9
|
+
const headers = context.request?.headers || {};
|
|
10
|
+
if (!headers.Authorization) {
|
|
11
|
+
const token = await opts.getToken();
|
|
12
|
+
if (token) {
|
|
13
|
+
headers.Authorization = `Bearer ${token}`;
|
|
14
|
+
}
|
|
18
15
|
}
|
|
19
16
|
return headers;
|
|
20
17
|
},
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAIzD,MAAM,UAAU,eAAe,CAAC,IAAyE;IACvG,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;QACrC,GAAG,EAAE,IAAI,CAAC,UAAU;QACpB,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;KAClD,CAAC,CAAC;IACH,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -7,13 +7,12 @@ export type AuthEvents = {
|
|
|
7
7
|
};
|
|
8
8
|
};
|
|
9
9
|
export declare class AlpicAuth {
|
|
10
|
-
private
|
|
11
|
-
on<K extends
|
|
12
|
-
off<K extends
|
|
10
|
+
#private;
|
|
11
|
+
on: <K extends "authenticated">(event: K, listener: import("../lib/emitter.js").Listener<AuthEvents[K]>) => void;
|
|
12
|
+
off: <K extends "authenticated">(event: K, listener: import("../lib/emitter.js").Listener<AuthEvents[K]>) => void;
|
|
13
13
|
getValidAccessToken(): Promise<Credentials | null>;
|
|
14
14
|
isAuthenticated(): Promise<boolean>;
|
|
15
15
|
getToken(): Promise<string | undefined>;
|
|
16
|
-
getUserAccessToken(): Promise<string | undefined>;
|
|
17
16
|
login(opts?: LoginOptions): Promise<{
|
|
18
17
|
sub: string;
|
|
19
18
|
}>;
|
package/dist/auth/index.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createEmitter } from "../lib/emitter.js";
|
|
2
2
|
import { oauthLogin } from "./login.js";
|
|
3
3
|
import { getOAuthClient } from "./oauth-client.js";
|
|
4
4
|
import { globalStore } from "./store.js";
|
|
5
5
|
export class AlpicAuth {
|
|
6
|
-
events =
|
|
7
|
-
on
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
off(event, listener) {
|
|
11
|
-
this.events.off(event, listener);
|
|
12
|
-
}
|
|
6
|
+
#events = createEmitter();
|
|
7
|
+
on = this.#events.on;
|
|
8
|
+
off = this.#events.off;
|
|
13
9
|
async getValidAccessToken() {
|
|
14
10
|
return getOAuthClient().getValidAccessToken();
|
|
15
11
|
}
|
|
@@ -19,12 +15,9 @@ export class AlpicAuth {
|
|
|
19
15
|
async getToken() {
|
|
20
16
|
return process.env.ALPIC_API_KEY ?? (await getOAuthClient().getValidAccessToken())?.access_token;
|
|
21
17
|
}
|
|
22
|
-
async getUserAccessToken() {
|
|
23
|
-
return (await getOAuthClient().getValidAccessToken())?.access_token;
|
|
24
|
-
}
|
|
25
18
|
async login(opts) {
|
|
26
19
|
const result = await oauthLogin(opts);
|
|
27
|
-
this
|
|
20
|
+
this.#events.emit("authenticated", { sub: result.sub });
|
|
28
21
|
return result;
|
|
29
22
|
}
|
|
30
23
|
async logout() {
|
package/dist/auth/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAqB,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ3D,MAAM,OAAO,SAAS;IACpB,OAAO,GAA6B,aAAa,EAAc,CAAC;IAEhE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACrB,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;IAEvB,KAAK,CAAC,mBAAmB;QACvB,OAAO,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,SAAS,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,WAAW,CAAC,gBAAgB,EAAE,CAAC;IACjC,CAAC;CACF"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type AlpicApi } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
|
-
import {
|
|
4
|
-
export declare class
|
|
3
|
+
import { createTunnel } from "./tunnel/tunnel.js";
|
|
4
|
+
export declare class AlpicClient {
|
|
5
5
|
readonly auth: AlpicAuth;
|
|
6
6
|
readonly api: AlpicApi;
|
|
7
|
-
readonly tunnel:
|
|
7
|
+
readonly tunnel: ReturnType<typeof createTunnel>;
|
|
8
8
|
constructor();
|
|
9
9
|
}
|
package/dist/client.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createApiClient } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
3
|
import { env } from "./env.js";
|
|
4
|
-
import {
|
|
5
|
-
export class
|
|
4
|
+
import { createTunnel } from "./tunnel/tunnel.js";
|
|
5
|
+
export class AlpicClient {
|
|
6
6
|
auth;
|
|
7
7
|
api;
|
|
8
8
|
tunnel;
|
|
@@ -10,11 +10,21 @@ export class Alpic {
|
|
|
10
10
|
this.auth = new AlpicAuth();
|
|
11
11
|
this.api = createApiClient({
|
|
12
12
|
apiBaseUrl: env.ALPIC_API_BASE_URL,
|
|
13
|
-
|
|
13
|
+
getToken: () => this.auth.getToken(),
|
|
14
14
|
});
|
|
15
|
-
this.tunnel =
|
|
15
|
+
this.tunnel = createTunnel({
|
|
16
16
|
api: this.api,
|
|
17
|
-
|
|
17
|
+
ensureToken: async ({ autoLogin = true, onLoginUrl }) => {
|
|
18
|
+
let token = await this.auth.getValidAccessToken();
|
|
19
|
+
if (!token && autoLogin) {
|
|
20
|
+
await this.auth.login({ onLoginUrl });
|
|
21
|
+
token = await this.auth.getValidAccessToken();
|
|
22
|
+
}
|
|
23
|
+
if (!token) {
|
|
24
|
+
throw new Error("Not authenticated. Run `alpic login` first.");
|
|
25
|
+
}
|
|
26
|
+
return token.access_token;
|
|
27
|
+
},
|
|
18
28
|
});
|
|
19
29
|
}
|
|
20
30
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,OAAO,WAAW;IACb,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAkC;IAEjD;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,kBAAkB;YAClC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;SACrC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;YACzB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;gBACtD,IAAI,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAClD,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;oBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;oBACtC,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAChD,CAAC;gBACD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO,KAAK,CAAC,YAAY,CAAC;YAC5B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,5 +3,5 @@ export type { AuthEvents, Credentials, LoginOptions } from "./auth/index.js";
|
|
|
3
3
|
export { AlpicAuth } from "./auth/index.js";
|
|
4
4
|
export { getOAuthClient } from "./auth/oauth-client.js";
|
|
5
5
|
export { GlobalStore, globalStore } from "./auth/store.js";
|
|
6
|
-
export {
|
|
6
|
+
export { AlpicClient } from "./client.js";
|
|
7
7
|
export type { OpenTunnelOptions, TunnelCloseInfo, TunnelHandle, TunnelRequest } from "./tunnel/tunnel.js";
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { AlpicAuth } from "./auth/index.js";
|
|
2
2
|
export { getOAuthClient } from "./auth/oauth-client.js";
|
|
3
3
|
export { GlobalStore, globalStore } from "./auth/store.js";
|
|
4
|
-
export {
|
|
4
|
+
export { AlpicClient } from "./client.js";
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/lib/emitter.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type Listener<T> = (payload: T) => void;
|
|
2
|
-
export
|
|
3
|
-
private readonly listeners;
|
|
2
|
+
export type TypedEmitter<EventMap extends Record<string, unknown>> = {
|
|
4
3
|
on<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void;
|
|
5
4
|
off<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void;
|
|
6
5
|
emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void;
|
|
7
|
-
}
|
|
6
|
+
};
|
|
7
|
+
export declare function createEmitter<EventMap extends Record<string, unknown>>(): TypedEmitter<EventMap>;
|
package/dist/lib/emitter.js
CHANGED
|
@@ -1,29 +1,31 @@
|
|
|
1
1
|
// Minimal typed emitter for SDK lifecycle hooks. Unlike node's EventEmitter it
|
|
2
2
|
// never throws on an unlistened "error" event, and swallows listener errors so
|
|
3
3
|
// observability can never break the operation that emitted the event.
|
|
4
|
-
export
|
|
5
|
-
listeners = new Map();
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
for (const listener of set) {
|
|
20
|
-
try {
|
|
21
|
-
listener(payload);
|
|
4
|
+
export function createEmitter() {
|
|
5
|
+
const listeners = new Map();
|
|
6
|
+
return {
|
|
7
|
+
on(event, listener) {
|
|
8
|
+
const set = listeners.get(event) ?? new Set();
|
|
9
|
+
set.add(listener);
|
|
10
|
+
listeners.set(event, set);
|
|
11
|
+
},
|
|
12
|
+
off(event, listener) {
|
|
13
|
+
listeners.get(event)?.delete(listener);
|
|
14
|
+
},
|
|
15
|
+
emit(event, payload) {
|
|
16
|
+
const set = listeners.get(event);
|
|
17
|
+
if (!set) {
|
|
18
|
+
return;
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
for (const listener of set) {
|
|
21
|
+
try {
|
|
22
|
+
listener(payload);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Listener errors must never break the emitting operation.
|
|
26
|
+
}
|
|
25
27
|
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
+
},
|
|
29
|
+
};
|
|
28
30
|
}
|
|
29
31
|
//# sourceMappingURL=emitter.js.map
|
package/dist/lib/emitter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/lib/emitter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/lib/emitter.ts"],"names":[],"mappings":"AAQA,+EAA+E;AAC/E,+EAA+E;AAC/E,sEAAsE;AACtE,MAAM,UAAU,aAAa;IAC3B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAEpE,OAAO;QACL,EAAE,CAAC,KAAK,EAAE,QAAQ;YAChB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAqB,CAAC;YACjE,GAAG,CAAC,GAAG,CAAC,QAA6B,CAAC,CAAC;YACvC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,CAAC,KAAK,EAAE,QAAQ;YACjB,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAA6B,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,KAAK,EAAE,OAAO;YACjB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO;YACT,CAAC;YACD,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,QAAQ,CAAC,OAAkB,CAAC,CAAC;gBAC/B,CAAC;gBAAC,MAAM,CAAC;oBACP,2DAA2D;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/tunnel/tunnel.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AlpicApi
|
|
1
|
+
import type { AlpicApi } from "../api/client.js";
|
|
2
2
|
export type TunnelRequest = {
|
|
3
3
|
method: string;
|
|
4
4
|
path: string;
|
|
@@ -15,6 +15,8 @@ export type TunnelHandle = {
|
|
|
15
15
|
};
|
|
16
16
|
export type OpenTunnelOptions = {
|
|
17
17
|
port: number;
|
|
18
|
+
autoLogin?: boolean;
|
|
19
|
+
onLoginUrl?: (url: string) => void;
|
|
18
20
|
};
|
|
19
21
|
type PipenetSocket = {
|
|
20
22
|
on(event: string, listener: (...args: unknown[]) => void): void;
|
|
@@ -31,14 +33,14 @@ type Pipenet = (opts: {
|
|
|
31
33
|
keepAliveDelayMs: number;
|
|
32
34
|
offlineTimeoutMs: number;
|
|
33
35
|
}) => Promise<PipenetSocket>;
|
|
34
|
-
export
|
|
36
|
+
export declare function createTunnel(deps: {
|
|
35
37
|
api: AlpicApi;
|
|
36
|
-
|
|
38
|
+
ensureToken: (opts: {
|
|
39
|
+
autoLogin?: boolean;
|
|
40
|
+
onLoginUrl?: (url: string) => void;
|
|
41
|
+
}) => Promise<string>;
|
|
37
42
|
pipenet?: Pipenet;
|
|
38
|
-
}
|
|
39
|
-
export declare class Tunnel {
|
|
40
|
-
private readonly deps;
|
|
41
|
-
constructor(deps: TunnelDeps);
|
|
43
|
+
}): {
|
|
42
44
|
open(opts: OpenTunnelOptions): Promise<TunnelHandle>;
|
|
43
|
-
}
|
|
45
|
+
};
|
|
44
46
|
export {};
|
package/dist/tunnel/tunnel.js
CHANGED
|
@@ -5,127 +5,129 @@ const OFFLINE_TIMEOUT_MS = 30_000;
|
|
|
5
5
|
const FLAP_WINDOW_MS = 5_000;
|
|
6
6
|
const FLAP_MIN_SPAN_MS = 2_000;
|
|
7
7
|
const FLAP_THRESHOLD = 15;
|
|
8
|
-
export
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
else {
|
|
34
|
-
tunnelHost = ticket.tunnelHost;
|
|
35
|
-
proto = tunnelHost.startsWith("localhost") ? "http" : "https";
|
|
36
|
-
}
|
|
37
|
-
let timeoutId;
|
|
38
|
-
const socket = await Promise.race([
|
|
39
|
-
pipenet({
|
|
40
|
-
port: opts.port,
|
|
41
|
-
host: `${proto}://${tunnelHost}`,
|
|
42
|
-
subdomain: ticket.subdomain,
|
|
43
|
-
headers: { Authorization: `Bearer ${ticket.ticket}` },
|
|
44
|
-
keepAliveDelayMs: KEEPALIVE_DELAY_MS,
|
|
45
|
-
offlineTimeoutMs: OFFLINE_TIMEOUT_MS,
|
|
46
|
-
}).then((socket) => {
|
|
47
|
-
clearTimeout(timeoutId);
|
|
48
|
-
return socket;
|
|
49
|
-
}),
|
|
50
|
-
new Promise((_, reject) => {
|
|
51
|
-
timeoutId = setTimeout(() => reject(new Error("Failed to connect to tunnel server")), CONNECT_TIMEOUT_MS);
|
|
52
|
-
timeoutId.unref?.();
|
|
53
|
-
}),
|
|
54
|
-
]);
|
|
55
|
-
const url = `${proto}://${ticket.subdomain}.${tunnelHost}`;
|
|
56
|
-
const requestListeners = new Set();
|
|
57
|
-
const errorListeners = new Set();
|
|
58
|
-
const closeListeners = new Set();
|
|
59
|
-
let lastRequestAt = 0;
|
|
60
|
-
let displaced = false;
|
|
61
|
-
let closed = false;
|
|
62
|
-
socket.on("request", (req) => {
|
|
63
|
-
lastRequestAt = Date.now();
|
|
64
|
-
for (const listener of requestListeners) {
|
|
65
|
-
listener(req);
|
|
8
|
+
export function createTunnel(deps) {
|
|
9
|
+
return {
|
|
10
|
+
async open(opts) {
|
|
11
|
+
// Load the patched pipenet bundle lazily so non-tunnel consumers (every
|
|
12
|
+
// `alpic` command, the skybridge dev server) don't pay its ~500KB load
|
|
13
|
+
// cost at startup — only when a tunnel is actually opened.
|
|
14
|
+
const pipenet = deps.pipenet ?? (await import("../vendor/pipenet.js")).pipenet;
|
|
15
|
+
const accessToken = await deps.ensureToken({
|
|
16
|
+
autoLogin: opts.autoLogin,
|
|
17
|
+
onLoginUrl: opts.onLoginUrl,
|
|
18
|
+
});
|
|
19
|
+
const ticket = await deps.api.tunnels.getTicket.v1(undefined, {
|
|
20
|
+
context: {
|
|
21
|
+
request: { headers: { Authorization: `Bearer ${accessToken}` } },
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
// ALPIC_TUNNEL_HOST points a real ticket at a locally-run tunnel server. It's a dev
|
|
25
|
+
// override for a local (plain-HTTP) server, so default to http regardless of the host;
|
|
26
|
+
// pass an explicit https:// to force TLS.
|
|
27
|
+
const hostOverride = process.env.ALPIC_TUNNEL_HOST;
|
|
28
|
+
let tunnelHost;
|
|
29
|
+
let proto;
|
|
30
|
+
if (hostOverride) {
|
|
31
|
+
proto = hostOverride.startsWith("https://") ? "https" : "http";
|
|
32
|
+
tunnelHost = hostOverride.replace(/^https?:\/\//, "");
|
|
66
33
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
listener(err);
|
|
34
|
+
else {
|
|
35
|
+
tunnelHost = ticket.tunnelHost;
|
|
36
|
+
proto = tunnelHost.startsWith("localhost") ? "http" : "https";
|
|
71
37
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
drops.push(now);
|
|
104
|
-
drops = drops.filter((at) => now - at < FLAP_WINDOW_MS);
|
|
105
|
-
const oldest = drops[0] ?? now;
|
|
106
|
-
if (drops.length >= FLAP_THRESHOLD && now - oldest >= FLAP_MIN_SPAN_MS) {
|
|
107
|
-
displaced = true;
|
|
108
|
-
socket.close();
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
return {
|
|
112
|
-
url,
|
|
113
|
-
on(event, listener) {
|
|
114
|
-
if (event === "request") {
|
|
115
|
-
requestListeners.add(listener);
|
|
116
|
-
}
|
|
117
|
-
else if (event === "error") {
|
|
118
|
-
errorListeners.add(listener);
|
|
38
|
+
let timeoutId;
|
|
39
|
+
const socket = await Promise.race([
|
|
40
|
+
pipenet({
|
|
41
|
+
port: opts.port,
|
|
42
|
+
host: `${proto}://${tunnelHost}`,
|
|
43
|
+
subdomain: ticket.subdomain,
|
|
44
|
+
headers: { Authorization: `Bearer ${ticket.ticket}` },
|
|
45
|
+
keepAliveDelayMs: KEEPALIVE_DELAY_MS,
|
|
46
|
+
offlineTimeoutMs: OFFLINE_TIMEOUT_MS,
|
|
47
|
+
}).then((socket) => {
|
|
48
|
+
clearTimeout(timeoutId);
|
|
49
|
+
return socket;
|
|
50
|
+
}),
|
|
51
|
+
new Promise((_, reject) => {
|
|
52
|
+
timeoutId = setTimeout(() => reject(new Error("Failed to connect to tunnel server")), CONNECT_TIMEOUT_MS);
|
|
53
|
+
timeoutId.unref?.();
|
|
54
|
+
}),
|
|
55
|
+
]);
|
|
56
|
+
const url = `${proto}://${ticket.subdomain}.${tunnelHost}`;
|
|
57
|
+
const requestListeners = new Set();
|
|
58
|
+
const errorListeners = new Set();
|
|
59
|
+
const closeListeners = new Set();
|
|
60
|
+
let lastRequestAt = 0;
|
|
61
|
+
let displaced = false;
|
|
62
|
+
let closed = false;
|
|
63
|
+
socket.on("request", (req) => {
|
|
64
|
+
lastRequestAt = Date.now();
|
|
65
|
+
for (const listener of requestListeners) {
|
|
66
|
+
listener(req);
|
|
119
67
|
}
|
|
120
|
-
|
|
121
|
-
|
|
68
|
+
});
|
|
69
|
+
socket.on("error", (err) => {
|
|
70
|
+
for (const listener of errorListeners) {
|
|
71
|
+
listener(err);
|
|
122
72
|
}
|
|
123
|
-
}
|
|
124
|
-
close() {
|
|
73
|
+
});
|
|
74
|
+
socket.on("close", () => {
|
|
125
75
|
closed = true;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
76
|
+
const info = displaced ? { displaced: true } : undefined;
|
|
77
|
+
for (const listener of closeListeners) {
|
|
78
|
+
listener(info);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
// Detect being displaced by a newer tunnel. When another tunnel takes over this
|
|
82
|
+
// account's subdomain, the server closes our tunnel and rejects our reconnections
|
|
83
|
+
// (they target a session id that no longer exists), so each one connects and is
|
|
84
|
+
// dropped within milliseconds. pipenet's offlineTimeoutMs never fires for this — it
|
|
85
|
+
// only triggers when the server is unreachable entirely (failed connects emit no
|
|
86
|
+
// "dead"). A "dead" with a prior "open" means a socket reached the server and was
|
|
87
|
+
// dropped, so a sustained storm of them is the takeover signature.
|
|
88
|
+
//
|
|
89
|
+
// Normal serving also churns sockets: with the server's small keep-alive pool, most
|
|
90
|
+
// concurrent requests get their socket destroyed right after serving, emitting a
|
|
91
|
+
// "dead" each. A heavy page load can fire 15+ in a few seconds and look identical to
|
|
92
|
+
// a takeover. The discriminator: a real takeover routes all traffic to the new
|
|
93
|
+
// tunnel, so we serve zero requests during the storm. Ignore it while requests flow.
|
|
94
|
+
let drops = [];
|
|
95
|
+
socket.tunnelCluster?.on("dead", () => {
|
|
96
|
+
if (displaced || closed) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const now = Date.now();
|
|
100
|
+
if (now - lastRequestAt < FLAP_WINDOW_MS) {
|
|
101
|
+
drops = [];
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
drops.push(now);
|
|
105
|
+
drops = drops.filter((at) => now - at < FLAP_WINDOW_MS);
|
|
106
|
+
const oldest = drops[0] ?? now;
|
|
107
|
+
if (drops.length >= FLAP_THRESHOLD && now - oldest >= FLAP_MIN_SPAN_MS) {
|
|
108
|
+
displaced = true;
|
|
109
|
+
socket.close();
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
url,
|
|
114
|
+
on(event, listener) {
|
|
115
|
+
if (event === "request") {
|
|
116
|
+
requestListeners.add(listener);
|
|
117
|
+
}
|
|
118
|
+
else if (event === "error") {
|
|
119
|
+
errorListeners.add(listener);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
closeListeners.add(listener);
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
close() {
|
|
126
|
+
closed = true;
|
|
127
|
+
socket.close();
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
};
|
|
130
132
|
}
|
|
131
133
|
//# sourceMappingURL=tunnel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"AAEA,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,qEAAqE;AACrE,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,cAAc,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alpic-ai/sdk",
|
|
3
|
-
"version": "0.0.0-dev.
|
|
3
|
+
"version": "0.0.0-dev.g99a887e",
|
|
4
4
|
"description": "Programmatic SDK for Alpic (auth, API, tunnel)",
|
|
5
5
|
"homepage": "https://alpic.ai",
|
|
6
6
|
"repository": {
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"open": "^11.0.0",
|
|
35
35
|
"openid-client": "^6.8.4",
|
|
36
36
|
"zod": "^4.4.3",
|
|
37
|
-
"@alpic-ai/api": "0.0.0-dev.
|
|
37
|
+
"@alpic-ai/api": "0.0.0-dev.g99a887e"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@total-typescript/tsconfig": "^1.0.4",
|
package/dist/api/auth-scope.d.ts
DELETED
package/dist/api/auth-scope.js
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AUTH_SCOPE_ANY, contract } from "@alpic-ai/api";
|
|
2
|
-
import { getContractRouter } from "@orpc/contract";
|
|
3
|
-
export function getAuthScopeForPath(path) {
|
|
4
|
-
const procedure = getContractRouter(contract, path);
|
|
5
|
-
return procedure?.["~orpc"]?.meta?.authScope ?? AUTH_SCOPE_ANY;
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=auth-scope.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-scope.js","sourceRoot":"","sources":["../../src/api/auth-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,QAAQ,EAAsB,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQnD,MAAM,UAAU,mBAAmB,CAAC,IAAuB;IACzD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACpD,OAAQ,SAA2C,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,IAAI,cAAc,CAAC;AACpG,CAAC"}
|