@alpic-ai/sdk 0.0.0-dev.ge2abcc8 → 0.0.0-dev.ge52b305
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/auth-scope.d.ts +2 -0
- package/dist/api/auth-scope.js +7 -0
- package/dist/api/auth-scope.js.map +1 -0
- package/dist/api/client.d.ts +5 -1
- package/dist/api/client.js +11 -8
- package/dist/api/client.js.map +1 -1
- package/dist/auth/index.d.ts +9 -0
- package/dist/auth/index.js +14 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/client.d.ts +4 -9
- package/dist/client.js +7 -24
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/emitter.d.ts +7 -0
- package/dist/lib/emitter.js +29 -0
- package/dist/lib/emitter.js.map +1 -0
- package/dist/tunnel/tunnel.d.ts +15 -11
- package/dist/tunnel/tunnel.js +126 -45
- package/dist/tunnel/tunnel.js.map +1 -1
- package/dist/vendor/pipenet.js +6 -6
- package/dist/vendor/pipenet.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,7 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
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
|
+
};
|
|
4
8
|
export declare function createApiClient(opts: {
|
|
5
9
|
apiBaseUrl: string;
|
|
6
|
-
|
|
10
|
+
auth: ApiAuth;
|
|
7
11
|
}): AlpicApi;
|
package/dist/api/client.js
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
import { contract } from "@alpic-ai/api";
|
|
1
|
+
import { AUTH_SCOPE_USER, 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";
|
|
5
6
|
export function createApiClient(opts) {
|
|
6
7
|
const link = new OpenAPILink(contract, {
|
|
7
8
|
url: opts.apiBaseUrl,
|
|
8
|
-
headers: async (
|
|
9
|
-
const headers = context
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
headers: async (options, path) => {
|
|
10
|
+
const headers = options.context?.request?.headers ?? {};
|
|
11
|
+
if (headers.Authorization) {
|
|
12
|
+
return headers;
|
|
13
|
+
}
|
|
14
|
+
const scope = getAuthScopeForPath(path);
|
|
15
|
+
const token = scope === AUTH_SCOPE_USER ? await opts.auth.getUserAccessToken() : await opts.auth.getToken();
|
|
16
|
+
if (token) {
|
|
17
|
+
headers.Authorization = `Bearer ${token}`;
|
|
15
18
|
}
|
|
16
19
|
return headers;
|
|
17
20
|
},
|
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,QAAQ,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAStD,MAAM,UAAU,eAAe,CAAC,IAA2C;IACzE,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE;QACrC,GAAG,EAAE,IAAI,CAAC,UAAU;QACpB,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;YACxD,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,KAAK,GAAG,KAAK,KAAK,eAAe,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAE5G,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;YAC5C,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
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { type LoginOptions } from "./login.js";
|
|
2
2
|
import { type Credentials } from "./store.js";
|
|
3
3
|
export type { Credentials, LoginOptions };
|
|
4
|
+
export type AuthEvents = {
|
|
5
|
+
authenticated: {
|
|
6
|
+
sub: string;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
4
9
|
export declare class AlpicAuth {
|
|
10
|
+
private readonly events;
|
|
11
|
+
on<K extends keyof AuthEvents>(event: K, listener: (payload: AuthEvents[K]) => void): void;
|
|
12
|
+
off<K extends keyof AuthEvents>(event: K, listener: (payload: AuthEvents[K]) => void): void;
|
|
5
13
|
getValidAccessToken(): Promise<Credentials | null>;
|
|
6
14
|
isAuthenticated(): Promise<boolean>;
|
|
7
15
|
getToken(): Promise<string | undefined>;
|
|
16
|
+
getUserAccessToken(): Promise<string | undefined>;
|
|
8
17
|
login(opts?: LoginOptions): Promise<{
|
|
9
18
|
sub: string;
|
|
10
19
|
}>;
|
package/dist/auth/index.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
+
import { TypedEventEmitter } from "../lib/emitter.js";
|
|
1
2
|
import { oauthLogin } from "./login.js";
|
|
2
3
|
import { getOAuthClient } from "./oauth-client.js";
|
|
3
4
|
import { globalStore } from "./store.js";
|
|
4
5
|
export class AlpicAuth {
|
|
6
|
+
events = new TypedEventEmitter();
|
|
7
|
+
on(event, listener) {
|
|
8
|
+
this.events.on(event, listener);
|
|
9
|
+
}
|
|
10
|
+
off(event, listener) {
|
|
11
|
+
this.events.off(event, listener);
|
|
12
|
+
}
|
|
5
13
|
async getValidAccessToken() {
|
|
6
14
|
return getOAuthClient().getValidAccessToken();
|
|
7
15
|
}
|
|
@@ -11,8 +19,13 @@ export class AlpicAuth {
|
|
|
11
19
|
async getToken() {
|
|
12
20
|
return process.env.ALPIC_API_KEY ?? (await getOAuthClient().getValidAccessToken())?.access_token;
|
|
13
21
|
}
|
|
22
|
+
async getUserAccessToken() {
|
|
23
|
+
return (await getOAuthClient().getValidAccessToken())?.access_token;
|
|
24
|
+
}
|
|
14
25
|
async login(opts) {
|
|
15
|
-
|
|
26
|
+
const result = await oauthLogin(opts);
|
|
27
|
+
this.events.emit("authenticated", { sub: result.sub });
|
|
28
|
+
return result;
|
|
16
29
|
}
|
|
17
30
|
async logout() {
|
|
18
31
|
globalStore.clearCredentials();
|
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,EAAqB,UAAU,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,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;IACH,MAAM,GAAG,IAAI,iBAAiB,EAAc,CAAC;IAE9D,EAAE,CAA6B,KAAQ,EAAE,QAA0C;QACjF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAA6B,KAAQ,EAAE,QAA0C;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,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,kBAAkB;QACtB,OAAO,CAAC,MAAM,cAAc,EAAE,CAAC,mBAAmB,EAAE,CAAC,EAAE,YAAY,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAmB;QAC7B,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACvD,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,14 +1,9 @@
|
|
|
1
1
|
import { type AlpicApi } from "./api/client.js";
|
|
2
2
|
import { AlpicAuth } from "./auth/index.js";
|
|
3
|
-
import {
|
|
4
|
-
export
|
|
5
|
-
apiBaseUrl?: string;
|
|
6
|
-
configDir?: string;
|
|
7
|
-
};
|
|
8
|
-
export declare class AlpicClient {
|
|
3
|
+
import { Tunnel } from "./tunnel/tunnel.js";
|
|
4
|
+
export declare class Alpic {
|
|
9
5
|
readonly auth: AlpicAuth;
|
|
10
6
|
readonly api: AlpicApi;
|
|
11
|
-
readonly tunnel:
|
|
12
|
-
constructor(
|
|
7
|
+
readonly tunnel: Tunnel;
|
|
8
|
+
constructor();
|
|
13
9
|
}
|
|
14
|
-
export type { TunnelHandle };
|
package/dist/client.js
CHANGED
|
@@ -1,37 +1,20 @@
|
|
|
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 { Tunnel } from "./tunnel/tunnel.js";
|
|
5
|
+
export class Alpic {
|
|
6
6
|
auth;
|
|
7
7
|
api;
|
|
8
8
|
tunnel;
|
|
9
|
-
constructor(
|
|
10
|
-
if (opts?.configDir) {
|
|
11
|
-
// Pilot: globalStore is a module singleton initialized at import time, so
|
|
12
|
-
// this only takes effect if set before the first SDK import. Instance-scoped
|
|
13
|
-
// config is a tracked follow-up.
|
|
14
|
-
process.env.ALPIC_GLOBAL_CONFIG_DIR = opts.configDir;
|
|
15
|
-
}
|
|
16
|
-
const apiBaseUrl = opts?.apiBaseUrl ?? env.ALPIC_API_BASE_URL;
|
|
9
|
+
constructor() {
|
|
17
10
|
this.auth = new AlpicAuth();
|
|
18
11
|
this.api = createApiClient({
|
|
19
|
-
apiBaseUrl,
|
|
20
|
-
|
|
12
|
+
apiBaseUrl: env.ALPIC_API_BASE_URL,
|
|
13
|
+
auth: this.auth,
|
|
21
14
|
});
|
|
22
|
-
this.tunnel =
|
|
15
|
+
this.tunnel = new Tunnel({
|
|
23
16
|
api: this.api,
|
|
24
|
-
|
|
25
|
-
let token = await this.auth.getValidAccessToken();
|
|
26
|
-
if (!token && autoLogin) {
|
|
27
|
-
await this.auth.login({ onLoginUrl });
|
|
28
|
-
token = await this.auth.getValidAccessToken();
|
|
29
|
-
}
|
|
30
|
-
if (!token) {
|
|
31
|
-
throw new Error("Not authenticated. Run `alpic login` first.");
|
|
32
|
-
}
|
|
33
|
-
return token.access_token;
|
|
34
|
-
},
|
|
17
|
+
auth: this.auth,
|
|
35
18
|
});
|
|
36
19
|
}
|
|
37
20
|
}
|
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,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,OAAO,KAAK;IACP,IAAI,CAAY;IAChB,GAAG,CAAW;IACd,MAAM,CAAS;IAExB;QACE,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,eAAe,CAAC;YACzB,UAAU,EAAE,GAAG,CAAC,kBAAkB;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export type { AlpicApi } from "./api/client.js";
|
|
2
|
-
export type { Credentials, LoginOptions } from "./auth/index.js";
|
|
2
|
+
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
|
|
7
|
-
export {
|
|
8
|
-
export type { OpenTunnelOptions, TunnelRequest } from "./tunnel/tunnel.js";
|
|
6
|
+
export { Alpic } from "./client.js";
|
|
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 { Alpic } 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;
|
|
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,KAAK,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type Listener<T> = (payload: T) => void;
|
|
2
|
+
export declare class TypedEventEmitter<EventMap extends Record<string, unknown>> {
|
|
3
|
+
private readonly listeners;
|
|
4
|
+
on<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void;
|
|
5
|
+
off<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void;
|
|
6
|
+
emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void;
|
|
7
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Minimal typed emitter for SDK lifecycle hooks. Unlike node's EventEmitter it
|
|
2
|
+
// never throws on an unlistened "error" event, and swallows listener errors so
|
|
3
|
+
// observability can never break the operation that emitted the event.
|
|
4
|
+
export class TypedEventEmitter {
|
|
5
|
+
listeners = new Map();
|
|
6
|
+
on(event, listener) {
|
|
7
|
+
const set = this.listeners.get(event) ?? new Set();
|
|
8
|
+
set.add(listener);
|
|
9
|
+
this.listeners.set(event, set);
|
|
10
|
+
}
|
|
11
|
+
off(event, listener) {
|
|
12
|
+
this.listeners.get(event)?.delete(listener);
|
|
13
|
+
}
|
|
14
|
+
emit(event, payload) {
|
|
15
|
+
const set = this.listeners.get(event);
|
|
16
|
+
if (!set) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
for (const listener of set) {
|
|
20
|
+
try {
|
|
21
|
+
listener(payload);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Listener errors must never break the emitting operation.
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=emitter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.js","sourceRoot":"","sources":["../../src/lib/emitter.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,+EAA+E;AAC/E,sEAAsE;AACtE,MAAM,OAAO,iBAAiB;IACX,SAAS,GAAG,IAAI,GAAG,EAA0C,CAAC;IAE/E,EAAE,CAA2B,KAAQ,EAAE,QAA+B;QACpE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAqB,CAAC;QACtE,GAAG,CAAC,GAAG,CAAC,QAA6B,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,GAAG,CAA2B,KAAQ,EAAE,QAA+B;QACrE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAA6B,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,CAA2B,KAAQ,EAAE,OAAoB;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACF,QAAkC,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,2DAA2D;YAC7D,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|
package/dist/tunnel/tunnel.d.ts
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
|
-
import type { AlpicApi } from "../api/client.js";
|
|
1
|
+
import type { AlpicApi, ApiAuth } from "../api/client.js";
|
|
2
2
|
export type TunnelRequest = {
|
|
3
3
|
method: string;
|
|
4
4
|
path: string;
|
|
5
5
|
};
|
|
6
|
+
export type TunnelCloseInfo = {
|
|
7
|
+
displaced?: boolean;
|
|
8
|
+
};
|
|
6
9
|
export type TunnelHandle = {
|
|
7
10
|
readonly url: string;
|
|
8
11
|
on(event: "request", listener: (req: TunnelRequest) => void): void;
|
|
9
12
|
on(event: "error", listener: (err: Error) => void): void;
|
|
10
|
-
on(event: "close", listener: () => void): void;
|
|
13
|
+
on(event: "close", listener: (info?: TunnelCloseInfo) => void): void;
|
|
11
14
|
close(): void;
|
|
12
15
|
};
|
|
13
16
|
export type OpenTunnelOptions = {
|
|
14
17
|
port: number;
|
|
15
|
-
autoLogin?: boolean;
|
|
16
|
-
onLoginUrl?: (url: string) => void;
|
|
17
18
|
};
|
|
18
19
|
type PipenetSocket = {
|
|
19
20
|
on(event: string, listener: (...args: unknown[]) => void): void;
|
|
21
|
+
tunnelCluster?: {
|
|
22
|
+
on(event: string, listener: (...args: unknown[]) => void): void;
|
|
23
|
+
};
|
|
20
24
|
close(): void;
|
|
21
25
|
};
|
|
22
26
|
type Pipenet = (opts: {
|
|
@@ -27,14 +31,14 @@ type Pipenet = (opts: {
|
|
|
27
31
|
keepAliveDelayMs: number;
|
|
28
32
|
offlineTimeoutMs: number;
|
|
29
33
|
}) => Promise<PipenetSocket>;
|
|
30
|
-
export
|
|
34
|
+
export type TunnelDeps = {
|
|
31
35
|
api: AlpicApi;
|
|
32
|
-
|
|
33
|
-
autoLogin?: boolean;
|
|
34
|
-
onLoginUrl?: (url: string) => void;
|
|
35
|
-
}) => Promise<string>;
|
|
36
|
+
auth: Pick<ApiAuth, "getUserAccessToken">;
|
|
36
37
|
pipenet?: Pipenet;
|
|
37
|
-
}): {
|
|
38
|
-
open(opts: OpenTunnelOptions): Promise<TunnelHandle>;
|
|
39
38
|
};
|
|
39
|
+
export declare class Tunnel {
|
|
40
|
+
private readonly deps;
|
|
41
|
+
constructor(deps: TunnelDeps);
|
|
42
|
+
open(opts: OpenTunnelOptions): Promise<TunnelHandle>;
|
|
43
|
+
}
|
|
40
44
|
export {};
|
package/dist/tunnel/tunnel.js
CHANGED
|
@@ -1,50 +1,131 @@
|
|
|
1
|
-
import { pipenet as defaultPipenet } from "../vendor/pipenet.js";
|
|
2
1
|
const CONNECT_TIMEOUT_MS = 10_000;
|
|
3
2
|
const KEEPALIVE_DELAY_MS = 30_000;
|
|
4
3
|
const OFFLINE_TIMEOUT_MS = 30_000;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
4
|
+
// Takeover detection thresholds — see the "dead" listener in open().
|
|
5
|
+
const FLAP_WINDOW_MS = 5_000;
|
|
6
|
+
const FLAP_MIN_SPAN_MS = 2_000;
|
|
7
|
+
const FLAP_THRESHOLD = 15;
|
|
8
|
+
export class Tunnel {
|
|
9
|
+
deps;
|
|
10
|
+
constructor(deps) {
|
|
11
|
+
this.deps = deps;
|
|
12
|
+
}
|
|
13
|
+
async open(opts) {
|
|
14
|
+
// Load the patched pipenet bundle lazily so non-tunnel consumers (every
|
|
15
|
+
// `alpic` command, the skybridge dev server) don't pay its ~500KB load
|
|
16
|
+
// cost at startup — only when a tunnel is actually opened.
|
|
17
|
+
const pipenet = this.deps.pipenet ?? (await import("../vendor/pipenet.js")).pipenet;
|
|
18
|
+
// Tunnels require a user OAuth token; the API client selects it via contract metadata.
|
|
19
|
+
if (!(await this.deps.auth.getUserAccessToken())) {
|
|
20
|
+
throw new Error("Not authenticated. Run `alpic login` first.");
|
|
21
|
+
}
|
|
22
|
+
const ticket = await this.deps.api.tunnels.getTicket.v1();
|
|
23
|
+
// ALPIC_TUNNEL_HOST points a real ticket at a locally-run tunnel server. It's a dev
|
|
24
|
+
// override for a local (plain-HTTP) server, so default to http regardless of the host;
|
|
25
|
+
// pass an explicit https:// to force TLS.
|
|
26
|
+
const hostOverride = process.env.ALPIC_TUNNEL_HOST;
|
|
27
|
+
let tunnelHost;
|
|
28
|
+
let proto;
|
|
29
|
+
if (hostOverride) {
|
|
30
|
+
proto = hostOverride.startsWith("https://") ? "https" : "http";
|
|
31
|
+
tunnelHost = hostOverride.replace(/^https?:\/\//, "");
|
|
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);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
socket.on("error", (err) => {
|
|
69
|
+
for (const listener of errorListeners) {
|
|
70
|
+
listener(err);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
socket.on("close", () => {
|
|
74
|
+
closed = true;
|
|
75
|
+
const info = displaced ? { displaced: true } : undefined;
|
|
76
|
+
for (const listener of closeListeners) {
|
|
77
|
+
listener(info);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Detect being displaced by a newer tunnel. When another tunnel takes over this
|
|
81
|
+
// account's subdomain, the server closes our tunnel and rejects our reconnections
|
|
82
|
+
// (they target a session id that no longer exists), so each one connects and is
|
|
83
|
+
// dropped within milliseconds. pipenet's offlineTimeoutMs never fires for this — it
|
|
84
|
+
// only triggers when the server is unreachable entirely (failed connects emit no
|
|
85
|
+
// "dead"). A "dead" with a prior "open" means a socket reached the server and was
|
|
86
|
+
// dropped, so a sustained storm of them is the takeover signature.
|
|
87
|
+
//
|
|
88
|
+
// Normal serving also churns sockets: with the server's small keep-alive pool, most
|
|
89
|
+
// concurrent requests get their socket destroyed right after serving, emitting a
|
|
90
|
+
// "dead" each. A heavy page load can fire 15+ in a few seconds and look identical to
|
|
91
|
+
// a takeover. The discriminator: a real takeover routes all traffic to the new
|
|
92
|
+
// tunnel, so we serve zero requests during the storm. Ignore it while requests flow.
|
|
93
|
+
let drops = [];
|
|
94
|
+
socket.tunnelCluster?.on("dead", () => {
|
|
95
|
+
if (displaced || closed) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const now = Date.now();
|
|
99
|
+
if (now - lastRequestAt < FLAP_WINDOW_MS) {
|
|
100
|
+
drops = [];
|
|
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);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
closeListeners.add(listener);
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
close() {
|
|
125
|
+
closed = true;
|
|
126
|
+
socket.close();
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
49
130
|
}
|
|
50
131
|
//# sourceMappingURL=tunnel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel/tunnel.ts"],"names":[],"mappings":"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"}
|
package/dist/vendor/pipenet.js
CHANGED
|
@@ -16571,18 +16571,18 @@ var {
|
|
|
16571
16571
|
create
|
|
16572
16572
|
} = axios_default;
|
|
16573
16573
|
|
|
16574
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16574
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/Tunnel.js
|
|
16575
16575
|
var import_debug2 = __toESM(require_src(), 1);
|
|
16576
16576
|
import { EventEmitter as EventEmitter3 } from "events";
|
|
16577
16577
|
|
|
16578
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16578
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/TunnelCluster.js
|
|
16579
16579
|
var import_debug = __toESM(require_src(), 1);
|
|
16580
16580
|
import { EventEmitter as EventEmitter2 } from "events";
|
|
16581
16581
|
import fs from "fs";
|
|
16582
16582
|
import net from "net";
|
|
16583
16583
|
import tls from "tls";
|
|
16584
16584
|
|
|
16585
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16585
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/HeaderHostTransformer.js
|
|
16586
16586
|
import { Transform } from "stream";
|
|
16587
16587
|
var HeaderHostTransformer = class extends Transform {
|
|
16588
16588
|
host;
|
|
@@ -16600,7 +16600,7 @@ var HeaderHostTransformer = class extends Transform {
|
|
|
16600
16600
|
}
|
|
16601
16601
|
};
|
|
16602
16602
|
|
|
16603
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16603
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/TunnelCluster.js
|
|
16604
16604
|
var log = (0, import_debug.default)("pipenet:client");
|
|
16605
16605
|
var TunnelCluster = class extends EventEmitter2 {
|
|
16606
16606
|
opts;
|
|
@@ -16708,7 +16708,7 @@ var TunnelCluster = class extends EventEmitter2 {
|
|
|
16708
16708
|
}
|
|
16709
16709
|
};
|
|
16710
16710
|
|
|
16711
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16711
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/Tunnel.js
|
|
16712
16712
|
var log2 = (0, import_debug2.default)("pipenet:client");
|
|
16713
16713
|
var Tunnel = class extends EventEmitter3 {
|
|
16714
16714
|
cachedUrl;
|
|
@@ -16856,7 +16856,7 @@ var Tunnel = class extends EventEmitter3 {
|
|
|
16856
16856
|
}
|
|
16857
16857
|
};
|
|
16858
16858
|
|
|
16859
|
-
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=
|
|
16859
|
+
// ../../node_modules/.pnpm/pipenet@1.4.0_patch_hash=24bd89f8b5bea6a63243b7a7d4ad888dcf7049e36eac19b10006403b29758c35/node_modules/pipenet/dist/pipenet.js
|
|
16860
16860
|
function pipenet(arg1, arg2, arg3) {
|
|
16861
16861
|
const options = typeof arg1 === "object" ? arg1 : { ...arg2, port: arg1 };
|
|
16862
16862
|
const callback = typeof arg1 === "object" ? arg2 : arg3;
|