@nority/bridge-sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +164 -0
- package/dist/agent.d.ts +101 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +6 -0
- package/dist/agent.js.map +1 -0
- package/dist/auth/jwt.d.ts +38 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +83 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/pairing.d.ts +14 -0
- package/dist/auth/pairing.d.ts.map +1 -0
- package/dist/auth/pairing.js +34 -0
- package/dist/auth/pairing.js.map +1 -0
- package/dist/auth/reconnect.d.ts +28 -0
- package/dist/auth/reconnect.d.ts.map +1 -0
- package/dist/auth/reconnect.js +110 -0
- package/dist/auth/reconnect.js.map +1 -0
- package/dist/bridge.d.ts +44 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +311 -0
- package/dist/bridge.js.map +1 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/conversation/replay.d.ts +30 -0
- package/dist/conversation/replay.d.ts.map +1 -0
- package/dist/conversation/replay.js +85 -0
- package/dist/conversation/replay.js.map +1 -0
- package/dist/conversation/runtime.d.ts +43 -0
- package/dist/conversation/runtime.d.ts.map +1 -0
- package/dist/conversation/runtime.js +481 -0
- package/dist/conversation/runtime.js.map +1 -0
- package/dist/conversation/state.d.ts +25 -0
- package/dist/conversation/state.d.ts.map +1 -0
- package/dist/conversation/state.js +130 -0
- package/dist/conversation/state.js.map +1 -0
- package/dist/crypto/conversation.d.ts +20 -0
- package/dist/crypto/conversation.d.ts.map +1 -0
- package/dist/crypto/conversation.js +134 -0
- package/dist/crypto/conversation.js.map +1 -0
- package/dist/crypto/hkdf-sha3.d.ts +5 -0
- package/dist/crypto/hkdf-sha3.d.ts.map +1 -0
- package/dist/crypto/hkdf-sha3.js +8 -0
- package/dist/crypto/hkdf-sha3.js.map +1 -0
- package/dist/crypto/identity.d.ts +21 -0
- package/dist/crypto/identity.d.ts.map +1 -0
- package/dist/crypto/identity.js +70 -0
- package/dist/crypto/identity.js.map +1 -0
- package/dist/crypto/payload.d.ts +10 -0
- package/dist/crypto/payload.d.ts.map +1 -0
- package/dist/crypto/payload.js +28 -0
- package/dist/crypto/payload.js.map +1 -0
- package/dist/crypto/x25519.d.ts +16 -0
- package/dist/crypto/x25519.d.ts.map +1 -0
- package/dist/crypto/x25519.js +44 -0
- package/dist/crypto/x25519.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/frames.d.ts +27 -0
- package/dist/protocol/frames.d.ts.map +1 -0
- package/dist/protocol/frames.js +43 -0
- package/dist/protocol/frames.js.map +1 -0
- package/dist/protocol/validation.d.ts +6 -0
- package/dist/protocol/validation.d.ts.map +1 -0
- package/dist/protocol/validation.js +33 -0
- package/dist/protocol/validation.js.map +1 -0
- package/dist/runtime/proactive.d.ts +14 -0
- package/dist/runtime/proactive.d.ts.map +1 -0
- package/dist/runtime/proactive.js +36 -0
- package/dist/runtime/proactive.js.map +1 -0
- package/dist/storage/conversation-store.d.ts +15 -0
- package/dist/storage/conversation-store.d.ts.map +1 -0
- package/dist/storage/conversation-store.js +75 -0
- package/dist/storage/conversation-store.js.map +1 -0
- package/dist/storage/state-store.d.ts +20 -0
- package/dist/storage/state-store.d.ts.map +1 -0
- package/dist/storage/state-store.js +74 -0
- package/dist/storage/state-store.js.map +1 -0
- package/dist/transport/outbound-queue.d.ts +18 -0
- package/dist/transport/outbound-queue.d.ts.map +1 -0
- package/dist/transport/outbound-queue.js +37 -0
- package/dist/transport/outbound-queue.js.map +1 -0
- package/dist/transport/websocket.d.ts +109 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +346 -0
- package/dist/transport/websocket.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ContentPart } from "../agent.js";
|
|
2
|
+
import { type BridgeFrame } from "../protocol/frames.js";
|
|
3
|
+
export interface ProactiveTurnRequest {
|
|
4
|
+
requestId: string;
|
|
5
|
+
idempotencyKey: string;
|
|
6
|
+
input: ContentPart[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Proactive turn runtime surface.
|
|
10
|
+
*
|
|
11
|
+
* Enables bridge-initiated assistant turns for existing conversations.
|
|
12
|
+
*/
|
|
13
|
+
export declare function createProactiveTurnFrame(conversationId: string, request: ProactiveTurnRequest): BridgeFrame<"assistant_turn_start">;
|
|
14
|
+
//# sourceMappingURL=proactive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proactive.d.ts","sourceRoot":"","sources":["../../src/runtime/proactive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,oBAAoB,GAC5B,WAAW,CAAC,sBAAsB,CAAC,CAqCrC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createFrame } from "../protocol/frames.js";
|
|
2
|
+
/**
|
|
3
|
+
* Proactive turn runtime surface.
|
|
4
|
+
*
|
|
5
|
+
* Enables bridge-initiated assistant turns for existing conversations.
|
|
6
|
+
*/
|
|
7
|
+
export function createProactiveTurnFrame(conversationId, request) {
|
|
8
|
+
if (!conversationId) {
|
|
9
|
+
throw new Error("createProactiveTurnFrame: conversationId is required");
|
|
10
|
+
}
|
|
11
|
+
if (!request) {
|
|
12
|
+
throw new Error("createProactiveTurnFrame: request is required");
|
|
13
|
+
}
|
|
14
|
+
if (!request.requestId) {
|
|
15
|
+
throw new Error("createProactiveTurnFrame: requestId is required");
|
|
16
|
+
}
|
|
17
|
+
if (!request.idempotencyKey) {
|
|
18
|
+
throw new Error("createProactiveTurnFrame: idempotencyKey is required");
|
|
19
|
+
}
|
|
20
|
+
if (!Array.isArray(request.input) || request.input.length === 0) {
|
|
21
|
+
throw new Error("createProactiveTurnFrame: input must be a non-empty array");
|
|
22
|
+
}
|
|
23
|
+
return createFrame("assistant_turn_start", {
|
|
24
|
+
request_id: request.requestId,
|
|
25
|
+
idempotency_key: request.idempotencyKey,
|
|
26
|
+
input: request.input.map((part) => part.kind === "text"
|
|
27
|
+
? { kind: "text", text: part.text }
|
|
28
|
+
: {
|
|
29
|
+
kind: "media",
|
|
30
|
+
media_id: part.media.mediaId,
|
|
31
|
+
media_type: part.media.mediaType,
|
|
32
|
+
size: part.media.size,
|
|
33
|
+
}),
|
|
34
|
+
}, conversationId);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=proactive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proactive.js","sourceRoot":"","sources":["../../src/runtime/proactive.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAoB,MAAM,uBAAuB,CAAC;AAQtE;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,cAAsB,EACtB,OAA6B;IAE7B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,sDAAsD,CACvD,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,WAAW,CAChB,sBAAsB,EACtB;QACE,UAAU,EAAE,OAAO,CAAC,SAAS;QAC7B,eAAe,EAAE,OAAO,CAAC,cAAc;QACvC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChC,IAAI,CAAC,IAAI,KAAK,MAAM;YAClB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACnC,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;gBAC5B,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;gBAChC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;aACtB,CACN;KACF,EACD,cAAc,CACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BridgeLogger } from "../agent.js";
|
|
2
|
+
import { type ConversationEntry } from "../conversation/state.js";
|
|
3
|
+
/**
|
|
4
|
+
* Durable conversation key/history persistence.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FileConversationStore {
|
|
7
|
+
private readonly conversationsDir;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(dataDir: string, logger?: BridgeLogger);
|
|
10
|
+
save(entry: ConversationEntry): Promise<void>;
|
|
11
|
+
loadAll(): Promise<ConversationEntry[]>;
|
|
12
|
+
delete(conversationId: string): Promise<void>;
|
|
13
|
+
private getConversationPath;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=conversation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.d.ts","sourceRoot":"","sources":["../../src/storage/conversation-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,0BAA0B,CAAC;AASlC;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,YAAyB;IAQxD,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA4BvC,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,OAAO,CAAC,mBAAmB;CAQ5B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { deserializeConversationEntry, serializeConversationEntry, } from "../conversation/state.js";
|
|
4
|
+
const noopLogger = {
|
|
5
|
+
debug: () => { },
|
|
6
|
+
info: () => { },
|
|
7
|
+
warn: () => { },
|
|
8
|
+
error: () => { },
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Durable conversation key/history persistence.
|
|
12
|
+
*/
|
|
13
|
+
export class FileConversationStore {
|
|
14
|
+
conversationsDir;
|
|
15
|
+
logger;
|
|
16
|
+
constructor(dataDir, logger = noopLogger) {
|
|
17
|
+
if (!dataDir) {
|
|
18
|
+
throw new Error("FileConversationStore: dataDir is required");
|
|
19
|
+
}
|
|
20
|
+
this.conversationsDir = join(dataDir, "conversations");
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
}
|
|
23
|
+
async save(entry) {
|
|
24
|
+
const persisted = serializeConversationEntry(entry);
|
|
25
|
+
await mkdir(this.conversationsDir, { recursive: true });
|
|
26
|
+
const targetPath = this.getConversationPath(entry.conversationId);
|
|
27
|
+
const tempPath = `${targetPath}.tmp`;
|
|
28
|
+
await writeFile(tempPath, `${JSON.stringify(persisted, null, 2)}\n`, "utf-8");
|
|
29
|
+
await rename(tempPath, targetPath);
|
|
30
|
+
}
|
|
31
|
+
async loadAll() {
|
|
32
|
+
try {
|
|
33
|
+
const entries = await readdir(this.conversationsDir);
|
|
34
|
+
const conversations = [];
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
if (!entry.endsWith(".json")) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const raw = await readFile(join(this.conversationsDir, entry), "utf-8");
|
|
41
|
+
conversations.push(deserializeConversationEntry(JSON.parse(raw)));
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.logger.warn("FileConversationStore.loadAll: skipping unreadable conversation file", entry, error instanceof Error ? error : new Error(String(error)));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return conversations;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (isNotFoundError(error)) {
|
|
51
|
+
return [];
|
|
52
|
+
}
|
|
53
|
+
throw error;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async delete(conversationId) {
|
|
57
|
+
if (!conversationId) {
|
|
58
|
+
throw new Error("FileConversationStore.delete: conversationId is required");
|
|
59
|
+
}
|
|
60
|
+
await rm(this.getConversationPath(conversationId), { force: true });
|
|
61
|
+
}
|
|
62
|
+
getConversationPath(conversationId) {
|
|
63
|
+
if (!conversationId) {
|
|
64
|
+
throw new Error("FileConversationStore.getConversationPath: conversationId is required");
|
|
65
|
+
}
|
|
66
|
+
return join(this.conversationsDir, `${conversationId}.json`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function isNotFoundError(error) {
|
|
70
|
+
return (typeof error === "object" &&
|
|
71
|
+
error !== null &&
|
|
72
|
+
"code" in error &&
|
|
73
|
+
error.code === "ENOENT");
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=conversation-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-store.js","sourceRoot":"","sources":["../../src/storage/conversation-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface StoredBridgeState {
|
|
2
|
+
agentId?: string;
|
|
3
|
+
bridgeCredential?: string;
|
|
4
|
+
privateKeyPem: string;
|
|
5
|
+
publicKeyPem: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Persists durable bridge identity state.
|
|
9
|
+
* Access JWTs are intentionally excluded from this file.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FileBridgeStateStore {
|
|
12
|
+
private readonly dataDir;
|
|
13
|
+
private readonly statePath;
|
|
14
|
+
constructor(dataDir: string);
|
|
15
|
+
loadOrCreateIdentity(): Promise<StoredBridgeState>;
|
|
16
|
+
load(): Promise<StoredBridgeState | null>;
|
|
17
|
+
save(state: StoredBridgeState): Promise<void>;
|
|
18
|
+
private assertState;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=state-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/storage/state-store.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,MAAM;IAQrB,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAgBlD,IAAI,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAczC,IAAI,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD,OAAO,CAAC,WAAW;CAkBpB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { generateEd25519Identity } from "../crypto/identity.js";
|
|
4
|
+
/**
|
|
5
|
+
* Persists durable bridge identity state.
|
|
6
|
+
* Access JWTs are intentionally excluded from this file.
|
|
7
|
+
*/
|
|
8
|
+
export class FileBridgeStateStore {
|
|
9
|
+
dataDir;
|
|
10
|
+
statePath;
|
|
11
|
+
constructor(dataDir) {
|
|
12
|
+
if (!dataDir) {
|
|
13
|
+
throw new Error("FileBridgeStateStore: dataDir is required");
|
|
14
|
+
}
|
|
15
|
+
this.dataDir = dataDir;
|
|
16
|
+
this.statePath = join(dataDir, "bridge-state.json");
|
|
17
|
+
}
|
|
18
|
+
async loadOrCreateIdentity() {
|
|
19
|
+
const existing = await this.load();
|
|
20
|
+
if (existing !== null) {
|
|
21
|
+
this.assertState(existing, "loadOrCreateIdentity");
|
|
22
|
+
return existing;
|
|
23
|
+
}
|
|
24
|
+
const identity = generateEd25519Identity();
|
|
25
|
+
const created = {
|
|
26
|
+
privateKeyPem: identity.privateKeyPem,
|
|
27
|
+
publicKeyPem: identity.publicKeyPem,
|
|
28
|
+
};
|
|
29
|
+
await this.save(created);
|
|
30
|
+
return created;
|
|
31
|
+
}
|
|
32
|
+
async load() {
|
|
33
|
+
try {
|
|
34
|
+
const raw = await readFile(this.statePath, "utf-8");
|
|
35
|
+
const parsed = JSON.parse(raw);
|
|
36
|
+
this.assertState(parsed, "load");
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (isNotFoundError(error)) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async save(state) {
|
|
47
|
+
this.assertState(state, "save");
|
|
48
|
+
await mkdir(this.dataDir, { recursive: true });
|
|
49
|
+
const tempPath = `${this.statePath}.tmp`;
|
|
50
|
+
await writeFile(tempPath, `${JSON.stringify(state, null, 2)}\n`, "utf-8");
|
|
51
|
+
await rename(tempPath, this.statePath);
|
|
52
|
+
}
|
|
53
|
+
assertState(state, method) {
|
|
54
|
+
if (!state.privateKeyPem) {
|
|
55
|
+
throw new Error(`FileBridgeStateStore.${method}: privateKeyPem is required`);
|
|
56
|
+
}
|
|
57
|
+
if (!state.publicKeyPem) {
|
|
58
|
+
throw new Error(`FileBridgeStateStore.${method}: publicKeyPem is required`);
|
|
59
|
+
}
|
|
60
|
+
if (state.bridgeCredential !== undefined && state.bridgeCredential.length === 0) {
|
|
61
|
+
throw new Error(`FileBridgeStateStore.${method}: bridgeCredential must not be empty when present`);
|
|
62
|
+
}
|
|
63
|
+
if (state.agentId !== undefined && state.agentId.length === 0) {
|
|
64
|
+
throw new Error(`FileBridgeStateStore.${method}: agentId must not be empty when present`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function isNotFoundError(error) {
|
|
69
|
+
return (typeof error === "object" &&
|
|
70
|
+
error !== null &&
|
|
71
|
+
"code" in error &&
|
|
72
|
+
error.code === "ENOENT");
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=state-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/storage/state-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound message queue.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Buffer outbound messages during reconnect
|
|
6
|
+
* - Drain queue when connection is re-established
|
|
7
|
+
* - Bounded queue with explicit drop policy
|
|
8
|
+
*/
|
|
9
|
+
export declare const DEFAULT_MAX_QUEUE_SIZE = 1000;
|
|
10
|
+
export declare class OutboundQueue<T> {
|
|
11
|
+
private readonly maxQueueSize;
|
|
12
|
+
private readonly frames;
|
|
13
|
+
constructor(maxQueueSize?: number);
|
|
14
|
+
enqueue(frame: T): void;
|
|
15
|
+
drain(): T[];
|
|
16
|
+
size(): number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=outbound-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound-queue.d.ts","sourceRoot":"","sources":["../../src/transport/outbound-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAE3C,qBAAa,aAAa,CAAC,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;gBAEtB,YAAY,SAAyB;IASjD,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAYvB,KAAK,IAAI,CAAC,EAAE;IAMZ,IAAI,IAAI,MAAM;CAGf"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound message queue.
|
|
3
|
+
*
|
|
4
|
+
* Responsibilities:
|
|
5
|
+
* - Buffer outbound messages during reconnect
|
|
6
|
+
* - Drain queue when connection is re-established
|
|
7
|
+
* - Bounded queue with explicit drop policy
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_MAX_QUEUE_SIZE = 1000;
|
|
10
|
+
export class OutboundQueue {
|
|
11
|
+
maxQueueSize;
|
|
12
|
+
frames = [];
|
|
13
|
+
constructor(maxQueueSize = DEFAULT_MAX_QUEUE_SIZE) {
|
|
14
|
+
if (!Number.isInteger(maxQueueSize) || maxQueueSize <= 0) {
|
|
15
|
+
throw new Error(`OutboundQueue: maxQueueSize must be a positive integer, got ${maxQueueSize}`);
|
|
16
|
+
}
|
|
17
|
+
this.maxQueueSize = maxQueueSize;
|
|
18
|
+
}
|
|
19
|
+
enqueue(frame) {
|
|
20
|
+
if (frame === undefined) {
|
|
21
|
+
throw new Error("OutboundQueue.enqueue: frame is required");
|
|
22
|
+
}
|
|
23
|
+
if (this.frames.length >= this.maxQueueSize) {
|
|
24
|
+
throw new Error(`OutboundQueue.enqueue: queue capacity ${this.maxQueueSize} exceeded`);
|
|
25
|
+
}
|
|
26
|
+
this.frames.push(frame);
|
|
27
|
+
}
|
|
28
|
+
drain() {
|
|
29
|
+
const drained = [...this.frames];
|
|
30
|
+
this.frames.length = 0;
|
|
31
|
+
return drained;
|
|
32
|
+
}
|
|
33
|
+
size() {
|
|
34
|
+
return this.frames.length;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=outbound-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outbound-queue.js","sourceRoot":"","sources":["../../src/transport/outbound-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,MAAM,OAAO,aAAa;IACP,YAAY,CAAS;IACrB,MAAM,GAAQ,EAAE,CAAC;IAElC,YAAY,YAAY,GAAG,sBAAsB;QAC/C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,+DAA+D,YAAY,EAAE,CAC9E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,KAAQ;QACd,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,yCAAyC,IAAI,CAAC,YAAY,WAAW,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { BridgeLogger } from "../agent.js";
|
|
2
|
+
import { type BridgeFrame } from "../protocol/frames.js";
|
|
3
|
+
export declare const BACKOFF_BASE_MS = 1000;
|
|
4
|
+
export declare const BACKOFF_MAX_MS = 30000;
|
|
5
|
+
export declare const BACKOFF_JITTER = 0.5;
|
|
6
|
+
export interface WebSocketFactoryOptions {
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
}
|
|
9
|
+
export interface WebSocketMessageEvent {
|
|
10
|
+
data: string;
|
|
11
|
+
}
|
|
12
|
+
export interface WebSocketCloseEvent {
|
|
13
|
+
code: number;
|
|
14
|
+
reason: string;
|
|
15
|
+
wasClean: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface WebSocketLike {
|
|
18
|
+
readonly readyState: number;
|
|
19
|
+
send(data: string): void;
|
|
20
|
+
close(code?: number, reason?: string): void;
|
|
21
|
+
addEventListener(type: "open", listener: (event: {
|
|
22
|
+
type: "open";
|
|
23
|
+
}) => void): void;
|
|
24
|
+
addEventListener(type: "message", listener: (event: WebSocketMessageEvent) => void): void;
|
|
25
|
+
addEventListener(type: "close", listener: (event: WebSocketCloseEvent) => void): void;
|
|
26
|
+
addEventListener(type: "error", listener: (event: {
|
|
27
|
+
type: "error";
|
|
28
|
+
error?: unknown;
|
|
29
|
+
}) => void): void;
|
|
30
|
+
removeEventListener(type: "open", listener: (event: {
|
|
31
|
+
type: "open";
|
|
32
|
+
}) => void): void;
|
|
33
|
+
removeEventListener(type: "message", listener: (event: WebSocketMessageEvent) => void): void;
|
|
34
|
+
removeEventListener(type: "close", listener: (event: WebSocketCloseEvent) => void): void;
|
|
35
|
+
removeEventListener(type: "error", listener: (event: {
|
|
36
|
+
type: "error";
|
|
37
|
+
error?: unknown;
|
|
38
|
+
}) => void): void;
|
|
39
|
+
}
|
|
40
|
+
export interface WebSocketFactory {
|
|
41
|
+
create(url: string, options?: WebSocketFactoryOptions): WebSocketLike;
|
|
42
|
+
}
|
|
43
|
+
export interface CloseCodeAction {
|
|
44
|
+
kind: "reconnect" | "stop";
|
|
45
|
+
forceRefresh: boolean;
|
|
46
|
+
immediate: boolean;
|
|
47
|
+
fatal: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface AuthenticatedWebSocketTransportOptions {
|
|
50
|
+
backendUrl: string;
|
|
51
|
+
getAccessToken: (forceRefresh?: boolean) => Promise<string>;
|
|
52
|
+
webSocketFactory?: WebSocketFactory;
|
|
53
|
+
heartbeatIntervalMs?: number;
|
|
54
|
+
idleTimeoutMs?: number;
|
|
55
|
+
random?: () => number;
|
|
56
|
+
clock?: () => Date;
|
|
57
|
+
logger?: BridgeLogger;
|
|
58
|
+
onFrame?: (frame: BridgeFrame) => void | Promise<void>;
|
|
59
|
+
onStateChange?: (state: TransportState) => void;
|
|
60
|
+
}
|
|
61
|
+
export type TransportState = "idle" | "connecting" | "connected" | "reconnecting" | "stopped" | "blocked" | "failed";
|
|
62
|
+
/**
|
|
63
|
+
* Calculate next backoff delay with jitter.
|
|
64
|
+
*/
|
|
65
|
+
export declare function calculateBackoff(attempt: number, random?: () => number): number;
|
|
66
|
+
export declare function getCloseCodeAction(code: number): CloseCodeAction;
|
|
67
|
+
/**
|
|
68
|
+
* Authenticated WebSocket transport with reconnect and heartbeat handling.
|
|
69
|
+
*/
|
|
70
|
+
export declare class AuthenticatedWebSocketTransport {
|
|
71
|
+
private readonly backendUrl;
|
|
72
|
+
private readonly getAccessToken;
|
|
73
|
+
private readonly webSocketFactory;
|
|
74
|
+
private readonly heartbeatIntervalMs;
|
|
75
|
+
private readonly idleTimeoutMs;
|
|
76
|
+
private readonly random;
|
|
77
|
+
private readonly clock;
|
|
78
|
+
private readonly logger;
|
|
79
|
+
private readonly onFrame?;
|
|
80
|
+
private readonly onStateChange?;
|
|
81
|
+
private readonly outboundQueue;
|
|
82
|
+
private state;
|
|
83
|
+
private socket;
|
|
84
|
+
private connectingSocket;
|
|
85
|
+
private heartbeatTimer;
|
|
86
|
+
private reconnectTimer;
|
|
87
|
+
private reconnectAttempt;
|
|
88
|
+
private lastActivityAt;
|
|
89
|
+
private stopRequested;
|
|
90
|
+
constructor(options: AuthenticatedWebSocketTransportOptions);
|
|
91
|
+
getState(): TransportState;
|
|
92
|
+
connect(forceRefresh?: boolean): Promise<void>;
|
|
93
|
+
disconnect(): Promise<void>;
|
|
94
|
+
send(frame: BridgeFrame): void;
|
|
95
|
+
private openSocket;
|
|
96
|
+
private attachPersistentListeners;
|
|
97
|
+
private handleMessage;
|
|
98
|
+
private handleClose;
|
|
99
|
+
private startHeartbeat;
|
|
100
|
+
private flushOutboundQueue;
|
|
101
|
+
private waitForOpen;
|
|
102
|
+
private clearTimers;
|
|
103
|
+
private clearHeartbeatTimer;
|
|
104
|
+
private clearReconnectTimer;
|
|
105
|
+
private scheduleReconnect;
|
|
106
|
+
private retryOpenSocket;
|
|
107
|
+
private setState;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=websocket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGtE,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,cAAc,QAAQ,CAAC;AACpC,eAAO,MAAM,cAAc,MAAM,CAAC;AAIlC,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAClF,gBAAgB,CACd,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC/C,IAAI,CAAC;IACR,gBAAgB,CACd,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAC7C,IAAI,CAAC;IACR,gBAAgB,CACd,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC5D,IAAI,CAAC;IACR,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACrF,mBAAmB,CACjB,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,GAC/C,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAC7C,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAC5D,IAAI,CAAC;CACT;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,uBAAuB,GAAG,aAAa,CAAC;CACvE;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,sCAAsC;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACjD;AAED,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,GACd,SAAS,GACT,SAAS,GACT,QAAQ,CAAC;AASb;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAM,MAAoB,GACjC,MAAM,CAkBR;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAwChE;AAED;;GAEG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8C;IAC7E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA+C;IACxE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAkC;IACjE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,gBAAgB,CAA8B;IACtD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAS;gBAElB,OAAO,EAAE,sCAAsC;IAqC3D,QAAQ,IAAI,cAAc;IAIpB,OAAO,CAAC,YAAY,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;YAahB,UAAU;IAqCxB,OAAO,CAAC,yBAAyB;YAuBnB,aAAa;YAoBb,WAAW;IAuCzB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,iBAAiB;YAOX,eAAe;IAoB7B,OAAO,CAAC,QAAQ;CAIjB"}
|