@a5c-ai/agent-mux-gateway 0.0.0 → 0.4.2
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/README.md +10 -3
- package/dist/auth/hashing.d.ts +3 -0
- package/dist/auth/hashing.d.ts.map +1 -0
- package/dist/auth/hashing.js +25 -0
- package/dist/auth/hashing.js.map +1 -0
- package/dist/auth/middleware.d.ts +4 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +17 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/tokens.d.ts +45 -0
- package/dist/auth/tokens.d.ts.map +1 -0
- package/dist/auth/tokens.js +182 -0
- package/dist/auth/tokens.js.map +1 -0
- package/dist/builtin-adapters.d.ts +15 -0
- package/dist/builtin-adapters.d.ts.map +1 -0
- package/dist/builtin-adapters.js +110 -0
- package/dist/builtin-adapters.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -1
- package/dist/fanout/client-conn.d.ts +21 -0
- package/dist/fanout/client-conn.d.ts.map +1 -0
- package/dist/fanout/client-conn.js +53 -0
- package/dist/fanout/client-conn.js.map +1 -0
- package/dist/fanout/subscriber.d.ts +13 -0
- package/dist/fanout/subscriber.d.ts.map +1 -0
- package/dist/fanout/subscriber.js +40 -0
- package/dist/fanout/subscriber.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +1 -12
- package/dist/logging.js.map +1 -1
- package/dist/notifications/types.d.ts +19 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +2 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/webhook-out.d.ts +4 -0
- package/dist/notifications/webhook-out.d.ts.map +1 -0
- package/dist/notifications/webhook-out.js +55 -0
- package/dist/notifications/webhook-out.js.map +1 -0
- package/dist/pairing/short-code.d.ts +21 -0
- package/dist/pairing/short-code.d.ts.map +1 -0
- package/dist/pairing/short-code.js +50 -0
- package/dist/pairing/short-code.js.map +1 -0
- package/dist/protocol/errors.d.ts +11 -0
- package/dist/protocol/errors.d.ts.map +1 -0
- package/dist/protocol/errors.js +15 -0
- package/dist/protocol/errors.js.map +1 -0
- package/dist/protocol/frames.d.ts +93 -0
- package/dist/protocol/frames.d.ts.map +1 -0
- package/dist/protocol/frames.js +139 -0
- package/dist/protocol/frames.js.map +1 -0
- package/dist/protocol/v1.d.ts +104 -0
- package/dist/protocol/v1.d.ts.map +1 -0
- package/dist/protocol/v1.js +2 -0
- package/dist/protocol/v1.js.map +1 -0
- package/dist/runs/event-log-index.d.ts +29 -0
- package/dist/runs/event-log-index.d.ts.map +1 -0
- package/dist/runs/event-log-index.js +195 -0
- package/dist/runs/event-log-index.js.map +1 -0
- package/dist/runs/event-log.d.ts +26 -0
- package/dist/runs/event-log.d.ts.map +1 -0
- package/dist/runs/event-log.js +104 -0
- package/dist/runs/event-log.js.map +1 -0
- package/dist/runs/hook-broker.d.ts +19 -0
- package/dist/runs/hook-broker.d.ts.map +1 -0
- package/dist/runs/hook-broker.js +97 -0
- package/dist/runs/hook-broker.js.map +1 -0
- package/dist/runs/manager.d.ts +51 -0
- package/dist/runs/manager.d.ts.map +1 -0
- package/dist/runs/manager.js +575 -0
- package/dist/runs/manager.js.map +1 -0
- package/dist/runs/types.d.ts +49 -0
- package/dist/runs/types.d.ts.map +1 -0
- package/dist/runs/types.js +2 -0
- package/dist/runs/types.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +500 -0
- package/dist/server.js.map +1 -0
- package/dist/static/webui-server.d.ts +3 -0
- package/dist/static/webui-server.d.ts.map +1 -0
- package/dist/static/webui-server.js +97 -0
- package/dist/static/webui-server.js.map +1 -0
- package/package.json +10 -1
package/README.md
CHANGED
|
@@ -7,7 +7,14 @@ Current scope:
|
|
|
7
7
|
|
|
8
8
|
- `GatewayConfig` and default configuration helpers
|
|
9
9
|
- `createGateway(config)` returning a start/stop gateway handle
|
|
10
|
-
-
|
|
10
|
+
- token auth, HTTP/WS server, run manager, fanout replay, and runtime hook brokering
|
|
11
|
+
- optional static webui hosting from `@a5c-ai/agent-mux-webui/dist`
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
Service templates:
|
|
14
|
+
|
|
15
|
+
- `examples/systemd/amux-gateway.service`
|
|
16
|
+
- `examples/launchd/ai.a5c.amux.gateway.plist`
|
|
17
|
+
|
|
18
|
+
If the web UI package is not installed, `/` returns a helpful 404. Install
|
|
19
|
+
`@a5c-ai/agent-mux-webui` alongside this package or start the CLI with
|
|
20
|
+
`amux gateway serve --webui /path/to/dist`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../src/auth/hashing.ts"],"names":[],"mappings":"AAaA,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKlE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMvF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import argon2 from 'argon2';
|
|
3
|
+
const ARGON2_OPTIONS = Object.freeze({
|
|
4
|
+
type: argon2.argon2id,
|
|
5
|
+
saltLength: 16,
|
|
6
|
+
hashLength: 32,
|
|
7
|
+
parallelism: 1,
|
|
8
|
+
memoryCost: 64 * 1024,
|
|
9
|
+
timeCost: 3,
|
|
10
|
+
});
|
|
11
|
+
export async function hashToken(plaintext) {
|
|
12
|
+
return await argon2.hash(plaintext, {
|
|
13
|
+
...ARGON2_OPTIONS,
|
|
14
|
+
salt: randomBytes(ARGON2_OPTIONS.saltLength),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export async function verifyTokenHash(hash, plaintext) {
|
|
18
|
+
try {
|
|
19
|
+
return await argon2.verify(hash, plaintext);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=hashing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hashing.js","sourceRoot":"","sources":["../../src/auth/hashing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC,QAAQ;IACrB,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,EAAE;IACd,WAAW,EAAE,CAAC;IACd,UAAU,EAAE,EAAE,GAAG,IAAI;IACrB,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE;QAClC,GAAG,cAAc;QACjB,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC;KAC7C,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,SAAiB;IACnE,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TokenStore, TokenRecord } from './tokens.js';
|
|
2
|
+
export declare function parseBearerToken(headerValue: string | null | undefined): string | null;
|
|
3
|
+
export declare function authenticateBearerToken(tokenStore: TokenStore, headerValue: string | null | undefined): Promise<TokenRecord | null>;
|
|
4
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAItF;AAED,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACrC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAO7B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function parseBearerToken(headerValue) {
|
|
2
|
+
if (!headerValue)
|
|
3
|
+
return null;
|
|
4
|
+
const match = headerValue.match(/^Bearer\s+(.+)$/i);
|
|
5
|
+
return match?.[1]?.trim() ?? null;
|
|
6
|
+
}
|
|
7
|
+
export async function authenticateBearerToken(tokenStore, headerValue) {
|
|
8
|
+
const token = parseBearerToken(headerValue);
|
|
9
|
+
if (!token)
|
|
10
|
+
return null;
|
|
11
|
+
const record = await tokenStore.verify(token);
|
|
12
|
+
if (!record)
|
|
13
|
+
return null;
|
|
14
|
+
await tokenStore.touch(record.id);
|
|
15
|
+
return record;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,WAAsC;IACrE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACpD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,UAAsB,EACtB,WAAsC;IAEtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface TokenRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
createdAt: number;
|
|
5
|
+
updatedAt: number;
|
|
6
|
+
lastUsedAt: number | null;
|
|
7
|
+
expiresAt: number | null;
|
|
8
|
+
revokedAt: number | null;
|
|
9
|
+
}
|
|
10
|
+
export interface TokenIssueResult {
|
|
11
|
+
id: string;
|
|
12
|
+
plaintext: string;
|
|
13
|
+
record: TokenRecord;
|
|
14
|
+
}
|
|
15
|
+
export interface TokenCreateInput {
|
|
16
|
+
name: string;
|
|
17
|
+
ttlMs?: number | null;
|
|
18
|
+
}
|
|
19
|
+
export interface TokenStore {
|
|
20
|
+
create(input: TokenCreateInput): Promise<TokenIssueResult>;
|
|
21
|
+
verify(plaintext: string): Promise<TokenRecord | null>;
|
|
22
|
+
revoke(id: string): Promise<boolean>;
|
|
23
|
+
list(): Promise<TokenRecord[]>;
|
|
24
|
+
touch(id: string): Promise<boolean>;
|
|
25
|
+
}
|
|
26
|
+
export declare class MemoryTokenStore implements TokenStore {
|
|
27
|
+
private readonly records;
|
|
28
|
+
create(input: TokenCreateInput): Promise<TokenIssueResult>;
|
|
29
|
+
verify(plaintext: string): Promise<TokenRecord | null>;
|
|
30
|
+
revoke(id: string): Promise<boolean>;
|
|
31
|
+
list(): Promise<TokenRecord[]>;
|
|
32
|
+
touch(id: string): Promise<boolean>;
|
|
33
|
+
}
|
|
34
|
+
export declare class SqliteTokenStore implements TokenStore {
|
|
35
|
+
private readonly db;
|
|
36
|
+
constructor(dbPath?: string);
|
|
37
|
+
create(input: TokenCreateInput): Promise<TokenIssueResult>;
|
|
38
|
+
verify(plaintext: string): Promise<TokenRecord | null>;
|
|
39
|
+
revoke(id: string): Promise<boolean>;
|
|
40
|
+
list(): Promise<TokenRecord[]>;
|
|
41
|
+
touch(id: string): Promise<boolean>;
|
|
42
|
+
close(): void;
|
|
43
|
+
private rowToRecord;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC3D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrC;AA6BD,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAE1D,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqB1D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAWtD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAI9B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAO1C;AAED,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAM;gBAEb,MAAM,GAAE,MAA4B;IAiB1C,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiC1D,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAiBtD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpC,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAS9B,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUzC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,WAAW;CAYpB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import * as os from 'node:os';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { randomBytes, randomUUID } from 'node:crypto';
|
|
4
|
+
import { mkdirSync } from 'node:fs';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import { hashToken, verifyTokenHash } from './hashing.js';
|
|
7
|
+
const require = createRequire(import.meta.url);
|
|
8
|
+
const { DatabaseSync } = require('node:sqlite');
|
|
9
|
+
function defaultSqlitePath() {
|
|
10
|
+
return path.join(os.homedir(), '.amux', 'gateway', 'tokens.db');
|
|
11
|
+
}
|
|
12
|
+
function now() {
|
|
13
|
+
return Date.now();
|
|
14
|
+
}
|
|
15
|
+
function issuePlaintextToken() {
|
|
16
|
+
return randomBytes(32).toString('base64url');
|
|
17
|
+
}
|
|
18
|
+
function toPublicRecord(record) {
|
|
19
|
+
const { hash: _hash, ...publicRecord } = record;
|
|
20
|
+
return publicRecord;
|
|
21
|
+
}
|
|
22
|
+
function isUsable(record, currentTime) {
|
|
23
|
+
if (record.revokedAt !== null)
|
|
24
|
+
return false;
|
|
25
|
+
if (record.expiresAt !== null && record.expiresAt <= currentTime)
|
|
26
|
+
return false;
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
export class MemoryTokenStore {
|
|
30
|
+
records = new Map();
|
|
31
|
+
async create(input) {
|
|
32
|
+
const plaintext = issuePlaintextToken();
|
|
33
|
+
const createdAt = now();
|
|
34
|
+
const record = {
|
|
35
|
+
id: randomUUID(),
|
|
36
|
+
name: input.name,
|
|
37
|
+
hash: await hashToken(plaintext),
|
|
38
|
+
createdAt,
|
|
39
|
+
updatedAt: createdAt,
|
|
40
|
+
lastUsedAt: null,
|
|
41
|
+
expiresAt: input.ttlMs ? createdAt + input.ttlMs : null,
|
|
42
|
+
revokedAt: null,
|
|
43
|
+
};
|
|
44
|
+
this.records.set(record.id, record);
|
|
45
|
+
return {
|
|
46
|
+
id: record.id,
|
|
47
|
+
plaintext,
|
|
48
|
+
record: toPublicRecord(record),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
async verify(plaintext) {
|
|
52
|
+
const currentTime = now();
|
|
53
|
+
for (const record of this.records.values()) {
|
|
54
|
+
if (!isUsable(record, currentTime))
|
|
55
|
+
continue;
|
|
56
|
+
if (await verifyTokenHash(record.hash, plaintext)) {
|
|
57
|
+
return toPublicRecord(record);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
async revoke(id) {
|
|
63
|
+
const record = this.records.get(id);
|
|
64
|
+
if (!record || record.revokedAt !== null)
|
|
65
|
+
return false;
|
|
66
|
+
record.revokedAt = now();
|
|
67
|
+
record.updatedAt = record.revokedAt;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
async list() {
|
|
71
|
+
return Array.from(this.records.values()).map(toPublicRecord);
|
|
72
|
+
}
|
|
73
|
+
async touch(id) {
|
|
74
|
+
const record = this.records.get(id);
|
|
75
|
+
if (!record)
|
|
76
|
+
return false;
|
|
77
|
+
record.lastUsedAt = now();
|
|
78
|
+
record.updatedAt = record.lastUsedAt;
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export class SqliteTokenStore {
|
|
83
|
+
db;
|
|
84
|
+
constructor(dbPath = defaultSqlitePath()) {
|
|
85
|
+
mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
86
|
+
this.db = new DatabaseSync(dbPath);
|
|
87
|
+
this.db.exec(`
|
|
88
|
+
CREATE TABLE IF NOT EXISTS gateway_tokens (
|
|
89
|
+
id TEXT PRIMARY KEY,
|
|
90
|
+
name TEXT NOT NULL,
|
|
91
|
+
hash TEXT NOT NULL,
|
|
92
|
+
created_at INTEGER NOT NULL,
|
|
93
|
+
updated_at INTEGER NOT NULL,
|
|
94
|
+
last_used_at INTEGER,
|
|
95
|
+
expires_at INTEGER,
|
|
96
|
+
revoked_at INTEGER
|
|
97
|
+
);
|
|
98
|
+
`);
|
|
99
|
+
}
|
|
100
|
+
async create(input) {
|
|
101
|
+
const plaintext = issuePlaintextToken();
|
|
102
|
+
const createdAt = now();
|
|
103
|
+
const record = {
|
|
104
|
+
id: randomUUID(),
|
|
105
|
+
name: input.name,
|
|
106
|
+
hash: await hashToken(plaintext),
|
|
107
|
+
createdAt,
|
|
108
|
+
updatedAt: createdAt,
|
|
109
|
+
lastUsedAt: null,
|
|
110
|
+
expiresAt: input.ttlMs ? createdAt + input.ttlMs : null,
|
|
111
|
+
revokedAt: null,
|
|
112
|
+
};
|
|
113
|
+
this.db.prepare(`
|
|
114
|
+
INSERT INTO gateway_tokens (id, name, hash, created_at, updated_at, last_used_at, expires_at, revoked_at)
|
|
115
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
116
|
+
`).run(record.id, record.name, record.hash, record.createdAt, record.updatedAt, record.lastUsedAt, record.expiresAt, record.revokedAt);
|
|
117
|
+
return {
|
|
118
|
+
id: record.id,
|
|
119
|
+
plaintext,
|
|
120
|
+
record: toPublicRecord(record),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async verify(plaintext) {
|
|
124
|
+
const rows = this.db.prepare(`
|
|
125
|
+
SELECT id, name, hash, created_at, updated_at, last_used_at, expires_at, revoked_at
|
|
126
|
+
FROM gateway_tokens
|
|
127
|
+
ORDER BY created_at DESC
|
|
128
|
+
`).all();
|
|
129
|
+
const currentTime = now();
|
|
130
|
+
for (const row of rows) {
|
|
131
|
+
const record = this.rowToRecord(row);
|
|
132
|
+
if (!isUsable(record, currentTime))
|
|
133
|
+
continue;
|
|
134
|
+
if (await verifyTokenHash(record.hash, plaintext)) {
|
|
135
|
+
return toPublicRecord(record);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
async revoke(id) {
|
|
141
|
+
const updatedAt = now();
|
|
142
|
+
const result = this.db.prepare(`
|
|
143
|
+
UPDATE gateway_tokens
|
|
144
|
+
SET revoked_at = ?, updated_at = ?
|
|
145
|
+
WHERE id = ? AND revoked_at IS NULL
|
|
146
|
+
`).run(updatedAt, updatedAt, id);
|
|
147
|
+
return result.changes > 0;
|
|
148
|
+
}
|
|
149
|
+
async list() {
|
|
150
|
+
const rows = this.db.prepare(`
|
|
151
|
+
SELECT id, name, hash, created_at, updated_at, last_used_at, expires_at, revoked_at
|
|
152
|
+
FROM gateway_tokens
|
|
153
|
+
ORDER BY created_at DESC
|
|
154
|
+
`).all();
|
|
155
|
+
return rows.map((row) => toPublicRecord(this.rowToRecord(row)));
|
|
156
|
+
}
|
|
157
|
+
async touch(id) {
|
|
158
|
+
const updatedAt = now();
|
|
159
|
+
const result = this.db.prepare(`
|
|
160
|
+
UPDATE gateway_tokens
|
|
161
|
+
SET last_used_at = ?, updated_at = ?
|
|
162
|
+
WHERE id = ?
|
|
163
|
+
`).run(updatedAt, updatedAt, id);
|
|
164
|
+
return result.changes > 0;
|
|
165
|
+
}
|
|
166
|
+
close() {
|
|
167
|
+
this.db.close();
|
|
168
|
+
}
|
|
169
|
+
rowToRecord(row) {
|
|
170
|
+
return {
|
|
171
|
+
id: String(row['id']),
|
|
172
|
+
name: String(row['name']),
|
|
173
|
+
hash: String(row['hash']),
|
|
174
|
+
createdAt: Number(row['created_at']),
|
|
175
|
+
updatedAt: Number(row['updated_at']),
|
|
176
|
+
lastUsedAt: row['last_used_at'] == null ? null : Number(row['last_used_at']),
|
|
177
|
+
expiresAt: row['expires_at'] == null ? null : Number(row['expires_at']),
|
|
178
|
+
revokedAt: row['revoked_at'] == null ? null : Number(row['revoked_at']),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/auth/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GatewayRunClient } from './config.js';
|
|
2
|
+
export declare function createGatewayRunClient(): GatewayRunClient;
|
|
3
|
+
export declare function listBuiltInAgentNames(): string[];
|
|
4
|
+
export interface RunnableGatewayAgent {
|
|
5
|
+
agent: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
adapterType: string;
|
|
8
|
+
structuredSessionTransport: 'none' | 'restart-per-turn' | 'persistent';
|
|
9
|
+
sessionControlPlane: 'self-managed' | 'external-host' | 'mcp-mediated';
|
|
10
|
+
supportsInteractiveMode: boolean;
|
|
11
|
+
canResume: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function listRunnableGatewayAgents(client?: GatewayRunClient): Promise<RunnableGatewayAgent[]>;
|
|
14
|
+
export declare function listRunnableGatewayAgentNames(client?: GatewayRunClient): Promise<string[]>;
|
|
15
|
+
//# sourceMappingURL=builtin-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-adapters.d.ts","sourceRoot":"","sources":["../src/builtin-adapters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA2BpD,wBAAgB,sBAAsB,IAAI,gBAAgB,CAuCzD;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAGhD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B,EAAE,MAAM,GAAG,kBAAkB,GAAG,YAAY,CAAC;IACvE,mBAAmB,EAAE,cAAc,GAAG,eAAe,GAAG,cAAc,CAAC;IACvE,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,OAAO,CAAC;CACpB;AAkBD,wBAAsB,yBAAyB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA+D1G;AAED,wBAAsB,6BAA6B,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAGhG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createClient } from '@a5c-ai/agent-mux-core';
|
|
2
|
+
import { AgentMuxRemoteAdapter, AmpAdapter, ClaudeAdapter, ClaudeAgentSdkAdapter, ClaudeRemoteControlAdapter, CodexAdapter, CodexSdkAdapter, CodexWebSocketAdapter, CopilotAdapter, CursorAdapter, DroidAdapter, GeminiAdapter, HermesAdapter, OmpAdapter, OpenClawAdapter, OpenCodeAdapter, OpenCodeHttpAdapter, PiAdapter, PiSdkAdapter, QwenAdapter, BabysitterAdapter, } from '@a5c-ai/agent-mux-adapters';
|
|
3
|
+
export function createGatewayRunClient() {
|
|
4
|
+
const client = createClient();
|
|
5
|
+
const registry = client.adapters;
|
|
6
|
+
const adapters = [
|
|
7
|
+
new ClaudeAdapter(),
|
|
8
|
+
new ClaudeAgentSdkAdapter(),
|
|
9
|
+
new ClaudeRemoteControlAdapter(),
|
|
10
|
+
new CodexAdapter(),
|
|
11
|
+
new CodexSdkAdapter(),
|
|
12
|
+
new CodexWebSocketAdapter(),
|
|
13
|
+
new DroidAdapter(),
|
|
14
|
+
new AmpAdapter(),
|
|
15
|
+
new GeminiAdapter(),
|
|
16
|
+
new CopilotAdapter(),
|
|
17
|
+
new CursorAdapter(),
|
|
18
|
+
new OpenCodeAdapter(),
|
|
19
|
+
new OpenCodeHttpAdapter(),
|
|
20
|
+
new PiAdapter(),
|
|
21
|
+
new PiSdkAdapter(),
|
|
22
|
+
new OmpAdapter(),
|
|
23
|
+
new OpenClawAdapter(),
|
|
24
|
+
new HermesAdapter(),
|
|
25
|
+
new AgentMuxRemoteAdapter(),
|
|
26
|
+
new QwenAdapter(),
|
|
27
|
+
new BabysitterAdapter(),
|
|
28
|
+
];
|
|
29
|
+
for (const adapter of adapters) {
|
|
30
|
+
if (typeof registry.registerBuiltIn === 'function') {
|
|
31
|
+
registry.registerBuiltIn(adapter);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
registry.register(adapter);
|
|
35
|
+
}
|
|
36
|
+
return client;
|
|
37
|
+
}
|
|
38
|
+
export function listBuiltInAgentNames() {
|
|
39
|
+
const client = createGatewayRunClient();
|
|
40
|
+
return client.adapters.list().map((entry) => entry.agent);
|
|
41
|
+
}
|
|
42
|
+
export async function listRunnableGatewayAgents(client) {
|
|
43
|
+
const detectable = client;
|
|
44
|
+
if (!detectable?.adapters) {
|
|
45
|
+
return listBuiltInAgentNames().map((agent) => ({
|
|
46
|
+
agent,
|
|
47
|
+
displayName: agent,
|
|
48
|
+
adapterType: 'subprocess',
|
|
49
|
+
structuredSessionTransport: 'none',
|
|
50
|
+
sessionControlPlane: 'self-managed',
|
|
51
|
+
supportsInteractiveMode: false,
|
|
52
|
+
canResume: false,
|
|
53
|
+
}));
|
|
54
|
+
}
|
|
55
|
+
const [entries, installed] = await Promise.all([
|
|
56
|
+
Promise.resolve(detectable.adapters.list()),
|
|
57
|
+
detectable.adapters.installed(),
|
|
58
|
+
]);
|
|
59
|
+
const installMap = new Map(installed.map((entry) => [entry.agent, entry]));
|
|
60
|
+
const runnable = entries.flatMap((entry) => {
|
|
61
|
+
const adapter = detectable.adapters?.get(entry.agent);
|
|
62
|
+
const status = installMap.get(entry.agent);
|
|
63
|
+
if (!status?.installed || !status.meetsMinVersion) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
return [{
|
|
67
|
+
agent: entry.agent,
|
|
68
|
+
displayName: entry.displayName,
|
|
69
|
+
adapterType: adapter?.adapterType ?? 'subprocess',
|
|
70
|
+
structuredSessionTransport: adapter?.capabilities?.structuredSessionTransport ?? 'none',
|
|
71
|
+
sessionControlPlane: adapter?.capabilities?.sessionControlPlane ?? 'self-managed',
|
|
72
|
+
supportsInteractiveMode: adapter?.capabilities?.supportsInteractiveMode ?? false,
|
|
73
|
+
canResume: adapter?.capabilities?.canResume ?? false,
|
|
74
|
+
}];
|
|
75
|
+
});
|
|
76
|
+
if (runnable.length > 0) {
|
|
77
|
+
return runnable.sort((left, right) => {
|
|
78
|
+
const score = (candidate) => {
|
|
79
|
+
if (candidate.structuredSessionTransport === 'persistent' && candidate.supportsInteractiveMode)
|
|
80
|
+
return 4;
|
|
81
|
+
if (candidate.supportsInteractiveMode)
|
|
82
|
+
return 3;
|
|
83
|
+
if (candidate.structuredSessionTransport === 'persistent')
|
|
84
|
+
return 2;
|
|
85
|
+
if (candidate.canResume)
|
|
86
|
+
return 1;
|
|
87
|
+
return 0;
|
|
88
|
+
};
|
|
89
|
+
const delta = score(right) - score(left);
|
|
90
|
+
if (delta !== 0) {
|
|
91
|
+
return delta;
|
|
92
|
+
}
|
|
93
|
+
return left.displayName.localeCompare(right.displayName);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return listBuiltInAgentNames().map((agent) => ({
|
|
97
|
+
agent,
|
|
98
|
+
displayName: agent,
|
|
99
|
+
adapterType: 'subprocess',
|
|
100
|
+
structuredSessionTransport: 'none',
|
|
101
|
+
sessionControlPlane: 'self-managed',
|
|
102
|
+
supportsInteractiveMode: false,
|
|
103
|
+
canResume: false,
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
export async function listRunnableGatewayAgentNames(client) {
|
|
107
|
+
const runnable = await listRunnableGatewayAgents(client);
|
|
108
|
+
return runnable.map((entry) => entry.agent);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=builtin-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtin-adapters.js","sourceRoot":"","sources":["../src/builtin-adapters.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,8 +1,28 @@
|
|
|
1
|
+
import type { RunHandle, RunOptions } from '@a5c-ai/agent-mux-core';
|
|
2
|
+
import type { TokenStore } from './auth/tokens.js';
|
|
3
|
+
import type { NotificationWebhookConfig } from './notifications/types.js';
|
|
4
|
+
export interface GatewayRunClient {
|
|
5
|
+
run(options: RunOptions): RunHandle;
|
|
6
|
+
}
|
|
1
7
|
export interface GatewayConfig {
|
|
2
8
|
host: string;
|
|
3
9
|
port: number;
|
|
4
10
|
webuiRoot?: string | null;
|
|
5
11
|
enableWebui: boolean;
|
|
12
|
+
serverVersion: string;
|
|
13
|
+
unauthenticatedTimeoutMs: number;
|
|
14
|
+
maxPendingFrames: number;
|
|
15
|
+
tokenStore?: TokenStore;
|
|
16
|
+
tokenStoreKind: 'sqlite' | 'memory';
|
|
17
|
+
tokenDbPath: string;
|
|
18
|
+
eventLogDir: string;
|
|
19
|
+
maxEventsPerRun: number;
|
|
20
|
+
replayBufferSize: number;
|
|
21
|
+
maxConcurrentRuns: number;
|
|
22
|
+
shutdownGraceMs: number;
|
|
23
|
+
hookDecisionTimeoutMs: number;
|
|
24
|
+
notificationWebhook?: NotificationWebhookConfig | null;
|
|
25
|
+
client?: GatewayRunClient;
|
|
6
26
|
}
|
|
7
27
|
export declare const DEFAULT_GATEWAY_CONFIG: Readonly<GatewayConfig>;
|
|
8
28
|
export declare function resolveGatewayConfig(config?: Partial<GatewayConfig>): GatewayConfig;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB,EAAE,MAAM,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IACvD,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,aAAa,CAiBzD,CAAC;AAEH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM,GAAG,aAAa,CAKvF"}
|
package/dist/config.js
CHANGED
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
import * as os from 'node:os';
|
|
2
|
+
import * as path from 'node:path';
|
|
1
3
|
export const DEFAULT_GATEWAY_CONFIG = Object.freeze({
|
|
2
4
|
host: '127.0.0.1',
|
|
3
5
|
port: 7878,
|
|
4
6
|
webuiRoot: null,
|
|
5
7
|
enableWebui: true,
|
|
8
|
+
serverVersion: '0.0.0',
|
|
9
|
+
unauthenticatedTimeoutMs: 5000,
|
|
10
|
+
maxPendingFrames: 1024,
|
|
11
|
+
tokenStoreKind: 'sqlite',
|
|
12
|
+
tokenDbPath: path.join(os.homedir(), '.amux', 'gateway', 'tokens.db'),
|
|
13
|
+
eventLogDir: path.join(os.homedir(), '.amux', 'gateway', 'events'),
|
|
14
|
+
maxEventsPerRun: 100_000,
|
|
15
|
+
replayBufferSize: 512,
|
|
16
|
+
maxConcurrentRuns: 16,
|
|
17
|
+
shutdownGraceMs: 5000,
|
|
18
|
+
hookDecisionTimeoutMs: 30_000,
|
|
19
|
+
notificationWebhook: null,
|
|
6
20
|
});
|
|
7
21
|
export function resolveGatewayConfig(config = {}) {
|
|
8
22
|
return {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAgClC,MAAM,CAAC,MAAM,sBAAsB,GAA4B,MAAM,CAAC,MAAM,CAAC;IAC3E,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,OAAO;IACtB,wBAAwB,EAAE,IAAI;IAC9B,gBAAgB,EAAE,IAAI;IACtB,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC;IACrE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;IAClE,eAAe,EAAE,OAAO;IACxB,gBAAgB,EAAE,GAAG;IACrB,iBAAiB,EAAE,EAAE;IACrB,eAAe,EAAE,IAAI;IACrB,qBAAqB,EAAE,MAAM;IAC7B,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,SAAiC,EAAE;IACtE,OAAO;QACL,GAAG,sBAAsB;QACzB,GAAG,MAAM;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WebSocket } from 'ws';
|
|
2
|
+
import type { TokenRecord } from '../auth/tokens.js';
|
|
3
|
+
import type { GatewayFrame } from '../protocol/v1.js';
|
|
4
|
+
export declare class ClientConn {
|
|
5
|
+
private readonly maxPendingFrames;
|
|
6
|
+
readonly id: `${string}-${string}-${string}-${string}-${string}`;
|
|
7
|
+
readonly socket: WebSocket;
|
|
8
|
+
readonly subscriptions: Set<string>;
|
|
9
|
+
readonly sessionSubscriptions: Set<string>;
|
|
10
|
+
readonly connectedAt: number;
|
|
11
|
+
tokenId: string | null;
|
|
12
|
+
authenticated: boolean;
|
|
13
|
+
private pendingFrames;
|
|
14
|
+
constructor(socket: WebSocket, maxPendingFrames: number, tokenRecord?: TokenRecord | null);
|
|
15
|
+
authenticate(record: TokenRecord): void;
|
|
16
|
+
send(frame: GatewayFrame): void;
|
|
17
|
+
sendJson(payload: Record<string, unknown>): void;
|
|
18
|
+
private sendEncoded;
|
|
19
|
+
close(code: number, reason: string): void;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=client-conn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-conn.d.ts","sourceRoot":"","sources":["../../src/fanout/client-conn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,qBAAa,UAAU;IAanB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAZnC,QAAQ,CAAC,EAAE,sDAAgB;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,aAAa,cAAqB;IAC3C,QAAQ,CAAC,oBAAoB,cAAqB;IAClD,QAAQ,CAAC,WAAW,SAAc;IAClC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,UAAS;IAEtB,OAAO,CAAC,aAAa,CAAK;gBAGxB,MAAM,EAAE,SAAS,EACA,gBAAgB,EAAE,MAAM,EACzC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAOlC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKvC,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAI/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAIhD,OAAO,CAAC,WAAW;IAcnB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAS1C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { encodeFrame } from '../protocol/frames.js';
|
|
3
|
+
import { GATEWAY_CLOSE_CODES } from '../protocol/errors.js';
|
|
4
|
+
export class ClientConn {
|
|
5
|
+
maxPendingFrames;
|
|
6
|
+
id = randomUUID();
|
|
7
|
+
socket;
|
|
8
|
+
subscriptions = new Set();
|
|
9
|
+
sessionSubscriptions = new Set();
|
|
10
|
+
connectedAt = Date.now();
|
|
11
|
+
tokenId;
|
|
12
|
+
authenticated = false;
|
|
13
|
+
pendingFrames = 0;
|
|
14
|
+
constructor(socket, maxPendingFrames, tokenRecord) {
|
|
15
|
+
this.maxPendingFrames = maxPendingFrames;
|
|
16
|
+
this.socket = socket;
|
|
17
|
+
this.tokenId = tokenRecord?.id ?? null;
|
|
18
|
+
this.authenticated = tokenRecord != null;
|
|
19
|
+
}
|
|
20
|
+
authenticate(record) {
|
|
21
|
+
this.tokenId = record.id;
|
|
22
|
+
this.authenticated = true;
|
|
23
|
+
}
|
|
24
|
+
send(frame) {
|
|
25
|
+
this.sendEncoded(encodeFrame(frame));
|
|
26
|
+
}
|
|
27
|
+
sendJson(payload) {
|
|
28
|
+
this.sendEncoded(JSON.stringify(payload));
|
|
29
|
+
}
|
|
30
|
+
sendEncoded(payload) {
|
|
31
|
+
if (this.socket.readyState !== this.socket.OPEN) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.pendingFrames += 1;
|
|
35
|
+
if (this.pendingFrames > this.maxPendingFrames) {
|
|
36
|
+
this.socket.close(GATEWAY_CLOSE_CODES.backpressure, 'backpressure');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.socket.send(payload, () => {
|
|
40
|
+
this.pendingFrames = Math.max(0, this.pendingFrames - 1);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
close(code, reason) {
|
|
44
|
+
if (this.socket.readyState === this.socket.CLOSED) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const normalizedReason = Buffer.from(reason, 'utf8').byteLength <= 123
|
|
48
|
+
? reason
|
|
49
|
+
: `${reason.slice(0, 120)}...`;
|
|
50
|
+
this.socket.close(code, normalizedReason);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client-conn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-conn.js","sourceRoot":"","sources":["../../src/fanout/client-conn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,OAAO,UAAU;IAaF;IAZV,EAAE,GAAG,UAAU,EAAE,CAAC;IAClB,MAAM,CAAY;IAClB,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAClC,OAAO,CAAgB;IACvB,aAAa,GAAG,KAAK,CAAC;IAEd,aAAa,GAAG,CAAC,CAAC;IAE1B,YACE,MAAiB,EACA,gBAAwB,EACzC,WAAgC;QADf,qBAAgB,GAAhB,gBAAgB,CAAQ;QAGzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,WAAW,IAAI,IAAI,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,MAAmB;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,KAAmB;QACtB,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,QAAQ,CAAC,OAAgC;QACvC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAY,EAAE,MAAc;QAChC,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,UAAU,IAAI,GAAG;YACpE,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC5C,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ClientConn } from './client-conn.js';
|
|
2
|
+
import type { LoggedRunEvent } from '../runs/event-log.js';
|
|
3
|
+
export declare class RunSubscriber {
|
|
4
|
+
readonly conn: ClientConn;
|
|
5
|
+
readonly runId: string;
|
|
6
|
+
private readonly queuedLiveEvents;
|
|
7
|
+
private catchUpTailSeq;
|
|
8
|
+
constructor(conn: ClientConn, runId: string, catchUpTailSeq: number);
|
|
9
|
+
replay(events: readonly LoggedRunEvent[]): void;
|
|
10
|
+
sendLive(event: LoggedRunEvent): void;
|
|
11
|
+
finishCatchUp(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=subscriber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriber.d.ts","sourceRoot":"","sources":["../../src/fanout/subscriber.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAY3D,qBAAa,aAAa;IAKtB,QAAQ,CAAC,IAAI,EAAE,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM;IALxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAwB;IACzD,OAAO,CAAC,cAAc,CAAgB;gBAG3B,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM;IAKxB,MAAM,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,GAAG,IAAI;IAM/C,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQrC,aAAa,IAAI,IAAI;CAOtB"}
|