@voxevolv/client 0.3.7 → 0.3.8
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/CHANGELOG.md +24 -0
- package/README.md +80 -21
- package/dist/browser/index.js +6 -6
- package/dist/browser/index.js.map +3 -3
- package/dist/browser/index.js.sha384 +1 -1
- package/dist/browser/manifest.json +1 -1
- package/dist/context-queue.d.ts +13 -1
- package/dist/context-queue.d.ts.map +1 -1
- package/dist/context-queue.js +66 -11
- package/dist/context-queue.js.map +1 -1
- package/dist/diagnostics.d.ts +30 -7
- package/dist/diagnostics.d.ts.map +1 -1
- package/dist/diagnostics.js +125 -39
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +151 -61
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
sha384-
|
|
1
|
+
sha384-wgvcShiKIEd8bnhA7Tf5ovZswh25fWa46v9wWWYGUzkBx44L1EKFZ8nqc0diRXK2
|
package/dist/context-queue.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import type { ContextUpdate, ContextUpdatedPayload } from "./protocol.js";
|
|
2
|
+
/** Delivery may have succeeded even when its acknowledgement was lost. */
|
|
3
|
+
export declare class ContextDeliveryError extends Error {
|
|
4
|
+
readonly retryAfter?: Promise<void>;
|
|
5
|
+
constructor(message: string, options?: ErrorOptions & {
|
|
6
|
+
retryAfter?: Promise<void>;
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export declare function contextRetryDelay(attempt: number): number;
|
|
2
10
|
/** Only replace updates can be coalesced or restored without duplicating data. */
|
|
3
11
|
export declare class ReplacementContextQueue {
|
|
4
12
|
private send;
|
|
@@ -7,7 +15,9 @@ export declare class ReplacementContextQueue {
|
|
|
7
15
|
private latest;
|
|
8
16
|
private pending;
|
|
9
17
|
private running;
|
|
10
|
-
private
|
|
18
|
+
private retryTimers;
|
|
19
|
+
private retryAttempts;
|
|
20
|
+
private blockedTransfers;
|
|
11
21
|
constructor(send: (update: ContextUpdate, timeoutMs: number) => Promise<ContextUpdatedPayload>);
|
|
12
22
|
submit(update: ContextUpdate, timeoutMs: number): Promise<ContextUpdatedPayload>;
|
|
13
23
|
pause(): void;
|
|
@@ -15,5 +25,7 @@ export declare class ReplacementContextQueue {
|
|
|
15
25
|
clear(error: Error): void;
|
|
16
26
|
private start;
|
|
17
27
|
private drain;
|
|
28
|
+
blockUntilTransferSettles(key: string, settled: Promise<void>): void;
|
|
29
|
+
private scheduleRetry;
|
|
18
30
|
}
|
|
19
31
|
//# sourceMappingURL=context-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-queue.d.ts","sourceRoot":"","sources":["../src/context-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"context-queue.d.ts","sourceRoot":"","sources":["../src/context-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAU1E,0EAA0E;AAC1E,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpC,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAY,GAAG;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAO,EAGvF;CACF;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,kFAAkF;AAClF,qBAAa,uBAAuB;IAUtB,OAAO,CAAC,IAAI;IATxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,gBAAgB,CAAoC;IAE5D,YAAoB,IAAI,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,EAAI;IAE1G,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAuB/E;IAED,KAAK,IAAI,IAAI,CAKZ;IAEK,MAAM,CAAC,OAAO,UAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB3C;IAED,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAMxB;IAED,OAAO,CAAC,KAAK;YASC,KAAK;IAqCnB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAUnE;IAED,OAAO,CAAC,aAAa;CAStB"}
|
package/dist/context-queue.js
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/** Delivery may have succeeded even when its acknowledgement was lost. */
|
|
2
|
+
export class ContextDeliveryError extends Error {
|
|
3
|
+
retryAfter;
|
|
4
|
+
constructor(message, options = {}) {
|
|
5
|
+
super(message, options);
|
|
6
|
+
this.retryAfter = options.retryAfter;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function contextRetryDelay(attempt) {
|
|
10
|
+
const delayMs = 1_000 * 2 ** Math.min(Math.max(attempt - 1, 0), 3);
|
|
11
|
+
return Math.min(delayMs * (1 + Math.random() * 0.2), 8_000);
|
|
12
|
+
}
|
|
1
13
|
/** Only replace updates can be coalesced or restored without duplicating data. */
|
|
2
14
|
export class ReplacementContextQueue {
|
|
3
15
|
send;
|
|
@@ -6,12 +18,16 @@ export class ReplacementContextQueue {
|
|
|
6
18
|
latest = new Map();
|
|
7
19
|
pending = new Map();
|
|
8
20
|
running = new Map();
|
|
9
|
-
|
|
21
|
+
retryTimers = new Map();
|
|
22
|
+
retryAttempts = new Map();
|
|
23
|
+
blockedTransfers = new Map();
|
|
10
24
|
constructor(send) {
|
|
11
25
|
this.send = send;
|
|
12
26
|
}
|
|
13
27
|
submit(update, timeoutMs) {
|
|
14
|
-
const activeKeys = new Set([
|
|
28
|
+
const activeKeys = new Set([
|
|
29
|
+
...this.pending.keys(), ...this.running.keys(), ...this.blockedTransfers.keys(),
|
|
30
|
+
]);
|
|
15
31
|
if (activeKeys.size >= 64 && !activeKeys.has(update.key)) {
|
|
16
32
|
return Promise.reject(new Error("Too many pending context keys"));
|
|
17
33
|
}
|
|
@@ -28,7 +44,7 @@ export class ReplacementContextQueue {
|
|
|
28
44
|
}
|
|
29
45
|
const response = new Promise((resolve, reject) => {
|
|
30
46
|
this.pending.get(update.key)?.reject(new Error("Context update superseded by a newer value"));
|
|
31
|
-
this.pending.set(update.key, { update, timeoutMs, resolve, reject });
|
|
47
|
+
this.pending.set(update.key, { update, retainedUpdate: update, timeoutMs, resolve, reject });
|
|
32
48
|
});
|
|
33
49
|
this.start(update.key);
|
|
34
50
|
return response;
|
|
@@ -36,6 +52,9 @@ export class ReplacementContextQueue {
|
|
|
36
52
|
pause() {
|
|
37
53
|
this.generation += 1;
|
|
38
54
|
this.paused = true;
|
|
55
|
+
for (const timer of this.retryTimers.values())
|
|
56
|
+
globalThis.clearTimeout(timer);
|
|
57
|
+
this.retryTimers.clear();
|
|
39
58
|
}
|
|
40
59
|
async resume(restore = false) {
|
|
41
60
|
const generation = this.generation;
|
|
@@ -43,13 +62,13 @@ export class ReplacementContextQueue {
|
|
|
43
62
|
await Promise.all(this.running.values());
|
|
44
63
|
if (generation !== this.generation)
|
|
45
64
|
throw new Error("Context restoration interrupted");
|
|
46
|
-
this.failure = null;
|
|
47
65
|
if (restore) {
|
|
48
66
|
for (const [key, update] of this.latest) {
|
|
49
67
|
if (this.pending.has(key))
|
|
50
68
|
continue;
|
|
51
69
|
this.pending.set(key, {
|
|
52
70
|
update: { ...update, respond: false },
|
|
71
|
+
retainedUpdate: update,
|
|
53
72
|
timeoutMs: 20_000,
|
|
54
73
|
resolve: () => { },
|
|
55
74
|
reject: () => { },
|
|
@@ -62,18 +81,17 @@ export class ReplacementContextQueue {
|
|
|
62
81
|
await Promise.all(this.running.values());
|
|
63
82
|
if (generation !== this.generation)
|
|
64
83
|
throw new Error("Context restoration interrupted");
|
|
65
|
-
if (this.failure)
|
|
66
|
-
throw this.failure;
|
|
67
84
|
}
|
|
68
85
|
clear(error) {
|
|
69
86
|
this.pause();
|
|
70
87
|
this.latest.clear();
|
|
88
|
+
this.retryAttempts.clear();
|
|
71
89
|
for (const request of this.pending.values())
|
|
72
90
|
request.reject(error);
|
|
73
91
|
this.pending.clear();
|
|
74
92
|
}
|
|
75
93
|
start(key) {
|
|
76
|
-
if (this.paused || this.running.has(key))
|
|
94
|
+
if (this.paused || this.running.has(key) || this.retryTimers.has(key) || this.blockedTransfers.has(key))
|
|
77
95
|
return;
|
|
78
96
|
const task = this.drain(key).finally(() => {
|
|
79
97
|
this.running.delete(key);
|
|
@@ -83,30 +101,67 @@ export class ReplacementContextQueue {
|
|
|
83
101
|
this.running.set(key, task);
|
|
84
102
|
}
|
|
85
103
|
async drain(key) {
|
|
86
|
-
while (!this.paused) {
|
|
104
|
+
while (!this.paused && !this.blockedTransfers.has(key)) {
|
|
87
105
|
const request = this.pending.get(key);
|
|
88
106
|
if (!request)
|
|
89
107
|
return;
|
|
90
108
|
this.pending.delete(key);
|
|
91
109
|
try {
|
|
92
110
|
request.resolve(await this.send(request.update, request.timeoutMs));
|
|
111
|
+
this.retryAttempts.delete(key);
|
|
93
112
|
}
|
|
94
113
|
catch (error) {
|
|
95
|
-
if (
|
|
114
|
+
if (error instanceof ContextDeliveryError && error.retryAfter) {
|
|
115
|
+
this.blockUntilTransferSettles(key, error.retryAfter);
|
|
116
|
+
}
|
|
117
|
+
const isLatest = this.latest.get(key) === request.retainedUpdate;
|
|
118
|
+
if (this.paused && !request.update.respond && !this.pending.has(key) && isLatest) {
|
|
96
119
|
this.pending.set(key, request);
|
|
97
120
|
}
|
|
98
121
|
else {
|
|
99
122
|
request.reject(error instanceof Error ? error : new Error(String(error)));
|
|
100
123
|
}
|
|
101
124
|
if (!this.paused) {
|
|
125
|
+
if (error instanceof ContextDeliveryError) {
|
|
126
|
+
// Settle the caller's deadline so it can refresh a stale timer.
|
|
127
|
+
// Background delivery is safe only for silent replacement values.
|
|
128
|
+
if (isLatest && !request.update.respond && !this.pending.has(key)) {
|
|
129
|
+
this.pending.set(key, { ...request, resolve: () => { }, reject: () => { } });
|
|
130
|
+
}
|
|
131
|
+
if (this.pending.has(key))
|
|
132
|
+
this.scheduleRetry(key);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
102
135
|
// Invalid/rejected values must not poison the next restoration.
|
|
103
|
-
if (
|
|
136
|
+
if (isLatest)
|
|
104
137
|
this.latest.delete(key);
|
|
105
|
-
this.
|
|
138
|
+
this.retryAttempts.delete(key);
|
|
106
139
|
return;
|
|
107
140
|
}
|
|
108
141
|
}
|
|
109
142
|
}
|
|
110
143
|
}
|
|
144
|
+
blockUntilTransferSettles(key, settled) {
|
|
145
|
+
// LiveKit's stream writer exposes no cancellation API. A timeout settles
|
|
146
|
+
// the caller, but another upload for this key must wait for the old writer.
|
|
147
|
+
// Keep this guard across pause/clear so rejoin cannot create a second writer.
|
|
148
|
+
this.blockedTransfers.set(key, settled);
|
|
149
|
+
void settled.then(() => {
|
|
150
|
+
if (this.blockedTransfers.get(key) !== settled)
|
|
151
|
+
return;
|
|
152
|
+
this.blockedTransfers.delete(key);
|
|
153
|
+
if (this.pending.has(key))
|
|
154
|
+
this.start(key);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
scheduleRetry(key) {
|
|
158
|
+
const attempt = (this.retryAttempts.get(key) ?? 0) + 1;
|
|
159
|
+
this.retryAttempts.set(key, attempt);
|
|
160
|
+
const timer = globalThis.setTimeout(() => {
|
|
161
|
+
this.retryTimers.delete(key);
|
|
162
|
+
this.start(key);
|
|
163
|
+
}, contextRetryDelay(attempt));
|
|
164
|
+
this.retryTimers.set(key, timer);
|
|
165
|
+
}
|
|
111
166
|
}
|
|
112
167
|
//# sourceMappingURL=context-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-queue.js","sourceRoot":"","sources":["../src/context-queue.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-queue.js","sourceRoot":"","sources":["../src/context-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/** Bounded, content-free diagnostics for realtime connection investigations. */
|
|
2
|
+
export declare class DiagnosticDeliveryError extends Error {
|
|
3
|
+
readonly retryable: boolean;
|
|
4
|
+
readonly retryAfterMs: number;
|
|
5
|
+
constructor(message: string, retryable?: boolean, retryAfterMs?: number);
|
|
6
|
+
}
|
|
2
7
|
declare const OPERATIONS: Set<"command_result" | "command_send" | "connection_recovery" | "context_transfer">;
|
|
3
8
|
declare const STATUSES: Set<"acknowledged" | "failed" | "rejected" | "retrying" | "started" | "succeeded" | "timed_out">;
|
|
4
9
|
declare const CONNECTION_STATES: Set<"connected" | "connected_not_ready" | "connecting" | "disconnected" | "failed" | "idle" | "reconnecting" | "resuming">;
|
|
@@ -9,6 +14,7 @@ export type DiagnosticConnectionState = typeof CONNECTION_STATES extends Set<inf
|
|
|
9
14
|
export type DiagnosticEventType = typeof EVENT_TYPES extends Set<infer T> ? T : never;
|
|
10
15
|
export interface ClientDiagnosticEntry {
|
|
11
16
|
at_ms: number;
|
|
17
|
+
entry_seq: number;
|
|
12
18
|
operation: DiagnosticOperation;
|
|
13
19
|
status: DiagnosticStatus;
|
|
14
20
|
reason?: string;
|
|
@@ -24,9 +30,13 @@ export interface ClientDiagnosticEntry {
|
|
|
24
30
|
buffered_bytes?: number;
|
|
25
31
|
event_type?: DiagnosticEventType;
|
|
26
32
|
}
|
|
27
|
-
export type ClientDiagnosticInput = Omit<ClientDiagnosticEntry, "at_ms">;
|
|
33
|
+
export type ClientDiagnosticInput = Omit<ClientDiagnosticEntry, "at_ms" | "entry_seq">;
|
|
28
34
|
export interface ClientDiagnosticReport {
|
|
29
35
|
source: "sdk";
|
|
36
|
+
report_id: string;
|
|
37
|
+
sdk_instance_id: string;
|
|
38
|
+
started_at_ms: number;
|
|
39
|
+
dropped_entries: number;
|
|
30
40
|
sdk_version: string;
|
|
31
41
|
trigger: string;
|
|
32
42
|
entries: ClientDiagnosticEntry[];
|
|
@@ -38,6 +48,8 @@ type DiagnosticBufferOptions = {
|
|
|
38
48
|
now?: () => number;
|
|
39
49
|
schedule?: (callback: () => void, delayMs: number) => unknown;
|
|
40
50
|
};
|
|
51
|
+
type DiagnosticSender = (report: ClientDiagnosticReport) => Promise<void>;
|
|
52
|
+
/** One immutable pending batch plus a bounded recent-history buffer. */
|
|
41
53
|
export declare class ClientDiagnosticBuffer {
|
|
42
54
|
private readonly entries;
|
|
43
55
|
private readonly sdkVersion;
|
|
@@ -46,16 +58,27 @@ export declare class ClientDiagnosticBuffer {
|
|
|
46
58
|
private readonly now;
|
|
47
59
|
private readonly schedule;
|
|
48
60
|
private readonly startedAt;
|
|
49
|
-
private
|
|
61
|
+
private readonly wallStartedAt;
|
|
62
|
+
private readonly instanceId;
|
|
63
|
+
private sequence;
|
|
64
|
+
private batchedThrough;
|
|
65
|
+
private droppedEntries;
|
|
66
|
+
private pending;
|
|
67
|
+
private sender;
|
|
68
|
+
private trigger;
|
|
50
69
|
private reporting;
|
|
51
|
-
private
|
|
52
|
-
private
|
|
70
|
+
private scheduled;
|
|
71
|
+
private nextAttemptAt;
|
|
72
|
+
private failures;
|
|
53
73
|
constructor(options: DiagnosticBufferOptions);
|
|
54
74
|
record(input: ClientDiagnosticInput): void;
|
|
55
75
|
snapshot(): ClientDiagnosticEntry[];
|
|
56
|
-
flush(trigger: string, send:
|
|
57
|
-
private
|
|
58
|
-
private
|
|
76
|
+
flush(trigger: string, send: DiagnosticSender): Promise<boolean>;
|
|
77
|
+
private prune;
|
|
78
|
+
private makeBatch;
|
|
79
|
+
private hasWork;
|
|
80
|
+
private deliver;
|
|
81
|
+
private scheduleNext;
|
|
59
82
|
}
|
|
60
83
|
export {};
|
|
61
84
|
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,gFAAgF;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/diagnostics.js
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
/** Bounded, content-free diagnostics for realtime connection investigations. */
|
|
2
2
|
const DEFAULT_LIMIT = 128;
|
|
3
3
|
const DEFAULT_THROTTLE_MS = 10_000;
|
|
4
|
+
const MAX_BATCH_BYTES = 16 * 1024;
|
|
5
|
+
const MAX_BUFFER_BYTES = 64 * 1024;
|
|
6
|
+
const MAX_AGE_MS = 5 * 60_000;
|
|
7
|
+
// Transport failures are retryable unless the server explicitly rejects the report.
|
|
8
|
+
export class DiagnosticDeliveryError extends Error {
|
|
9
|
+
retryable;
|
|
10
|
+
retryAfterMs;
|
|
11
|
+
constructor(message, retryable = true, retryAfterMs = 0) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.retryable = retryable;
|
|
14
|
+
this.retryAfterMs = retryAfterMs;
|
|
15
|
+
this.name = "DiagnosticDeliveryError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function diagnosticId() {
|
|
19
|
+
return globalThis.crypto?.randomUUID?.()
|
|
20
|
+
?? `diag_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;
|
|
21
|
+
}
|
|
22
|
+
function encodedBytes(value) {
|
|
23
|
+
return new TextEncoder().encode(JSON.stringify(value)).byteLength;
|
|
24
|
+
}
|
|
4
25
|
const OPERATIONS = new Set([
|
|
5
26
|
"context_transfer",
|
|
6
27
|
"command_send",
|
|
@@ -36,6 +57,7 @@ const EVENT_TYPES = new Set([
|
|
|
36
57
|
]);
|
|
37
58
|
const SAFE_CODE = /^[a-z0-9_.:-]+$/;
|
|
38
59
|
const SAFE_CONTEXT_KEY = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
60
|
+
/** One immutable pending batch plus a bounded recent-history buffer. */
|
|
39
61
|
export class ClientDiagnosticBuffer {
|
|
40
62
|
entries = [];
|
|
41
63
|
sdkVersion;
|
|
@@ -44,85 +66,149 @@ export class ClientDiagnosticBuffer {
|
|
|
44
66
|
now;
|
|
45
67
|
schedule;
|
|
46
68
|
startedAt;
|
|
47
|
-
|
|
69
|
+
wallStartedAt = Date.now();
|
|
70
|
+
instanceId = diagnosticId();
|
|
71
|
+
sequence = 0;
|
|
72
|
+
batchedThrough = 0;
|
|
73
|
+
droppedEntries = 0;
|
|
74
|
+
pending = null;
|
|
75
|
+
sender = null;
|
|
76
|
+
trigger = "slow_operation";
|
|
48
77
|
reporting = false;
|
|
49
|
-
|
|
50
|
-
|
|
78
|
+
scheduled = false;
|
|
79
|
+
nextAttemptAt = 0;
|
|
80
|
+
failures = 0;
|
|
51
81
|
constructor(options) {
|
|
52
82
|
this.sdkVersion = options.sdkVersion;
|
|
53
83
|
this.limit = Math.max(1, Math.min(Math.trunc(options.limit ?? DEFAULT_LIMIT), DEFAULT_LIMIT));
|
|
54
84
|
this.throttleMs = Math.max(0, options.throttleMs ?? DEFAULT_THROTTLE_MS);
|
|
55
|
-
this.now = options.now ?? (() =>
|
|
56
|
-
this.schedule = options.schedule
|
|
57
|
-
|
|
85
|
+
this.now = options.now ?? (() => performance.now());
|
|
86
|
+
this.schedule = options.schedule ?? ((callback, delayMs) => {
|
|
87
|
+
const timer = globalThis.setTimeout(callback, delayMs);
|
|
88
|
+
// Node consumers should not stay alive just to deliver optional diagnostics.
|
|
89
|
+
timer.unref?.();
|
|
90
|
+
return timer;
|
|
91
|
+
});
|
|
58
92
|
this.startedAt = this.now();
|
|
59
93
|
}
|
|
60
94
|
record(input) {
|
|
61
95
|
const entry = sanitizeEntry(input, Math.max(this.now() - this.startedAt, 0));
|
|
62
96
|
if (!entry)
|
|
63
97
|
return;
|
|
98
|
+
entry.entry_seq = ++this.sequence;
|
|
64
99
|
this.entries.push(entry);
|
|
65
|
-
|
|
66
|
-
this.entries.shift();
|
|
100
|
+
this.prune();
|
|
67
101
|
}
|
|
68
102
|
snapshot() {
|
|
69
103
|
return this.entries.map((entry) => ({ ...entry }));
|
|
70
104
|
}
|
|
71
105
|
async flush(trigger, send) {
|
|
72
|
-
const now = this.now();
|
|
73
106
|
if (!SAFE_CODE.test(trigger) || trigger.length > 100)
|
|
74
107
|
return false;
|
|
75
|
-
|
|
108
|
+
this.trigger = trigger;
|
|
109
|
+
this.sender = send;
|
|
110
|
+
return this.deliver();
|
|
111
|
+
}
|
|
112
|
+
prune() {
|
|
113
|
+
const oldestAtMs = this.now() - this.startedAt - MAX_AGE_MS;
|
|
114
|
+
while (this.entries.length && (this.entries.length > this.limit
|
|
115
|
+
|| encodedBytes(this.entries) > MAX_BUFFER_BYTES
|
|
116
|
+
|| this.entries[0].at_ms <= oldestAtMs)) {
|
|
117
|
+
const removed = this.entries.shift();
|
|
118
|
+
if (removed.entry_seq > this.batchedThrough)
|
|
119
|
+
this.droppedEntries += 1;
|
|
120
|
+
}
|
|
121
|
+
if (!this.reporting && this.pending && this.now() - this.pending.createdAt >= MAX_AGE_MS) {
|
|
122
|
+
this.droppedEntries += this.pending.report.entries.length;
|
|
123
|
+
this.pending = null;
|
|
124
|
+
this.failures = 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
makeBatch() {
|
|
128
|
+
const report = {
|
|
129
|
+
source: "sdk",
|
|
130
|
+
report_id: diagnosticId(),
|
|
131
|
+
sdk_instance_id: this.instanceId,
|
|
132
|
+
started_at_ms: this.wallStartedAt,
|
|
133
|
+
dropped_entries: this.droppedEntries,
|
|
134
|
+
sdk_version: this.sdkVersion,
|
|
135
|
+
trigger: this.trigger,
|
|
136
|
+
entries: [],
|
|
137
|
+
};
|
|
138
|
+
for (const entry of this.entries) {
|
|
139
|
+
if (entry.entry_seq <= this.batchedThrough)
|
|
140
|
+
continue;
|
|
141
|
+
report.entries.push({ ...entry });
|
|
142
|
+
if (encodedBytes(report) > MAX_BATCH_BYTES) {
|
|
143
|
+
report.entries.pop();
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (!report.entries.length)
|
|
148
|
+
return;
|
|
149
|
+
this.batchedThrough = report.entries.at(-1).entry_seq;
|
|
150
|
+
this.pending = { report, createdAt: this.now() };
|
|
151
|
+
}
|
|
152
|
+
hasWork() {
|
|
153
|
+
return this.pending !== null || this.entries.some((entry) => entry.entry_seq > this.batchedThrough);
|
|
154
|
+
}
|
|
155
|
+
async deliver() {
|
|
156
|
+
if (this.reporting || !this.sender)
|
|
76
157
|
return false;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
158
|
+
this.prune();
|
|
159
|
+
if (!this.hasWork())
|
|
160
|
+
return false;
|
|
161
|
+
if (this.now() < this.nextAttemptAt) {
|
|
162
|
+
this.scheduleNext();
|
|
80
163
|
return false;
|
|
81
164
|
}
|
|
165
|
+
if (!this.pending)
|
|
166
|
+
this.makeBatch();
|
|
167
|
+
if (!this.pending)
|
|
168
|
+
return false;
|
|
169
|
+
const batch = this.pending;
|
|
82
170
|
this.reporting = true;
|
|
171
|
+
let delayMs = this.throttleMs;
|
|
83
172
|
try {
|
|
84
|
-
await
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
trigger,
|
|
88
|
-
entries: this.snapshot(),
|
|
89
|
-
});
|
|
173
|
+
await this.sender(batch.report);
|
|
174
|
+
this.pending = null;
|
|
175
|
+
this.failures = 0;
|
|
90
176
|
return true;
|
|
91
177
|
}
|
|
92
|
-
catch {
|
|
93
|
-
|
|
178
|
+
catch (error) {
|
|
179
|
+
if (error instanceof DiagnosticDeliveryError && !error.retryable) {
|
|
180
|
+
this.droppedEntries += batch.report.entries.length;
|
|
181
|
+
this.pending = null;
|
|
182
|
+
this.failures = 0;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
this.failures += 1;
|
|
186
|
+
const backoffMs = Math.min(2_000 * 2 ** Math.min(this.failures - 1, 5), 60_000);
|
|
187
|
+
delayMs = Math.max(this.throttleMs, backoffMs * (1 + Math.random() * 0.2), error instanceof DiagnosticDeliveryError ? error.retryAfterMs : 0);
|
|
188
|
+
}
|
|
94
189
|
return false;
|
|
95
190
|
}
|
|
96
191
|
finally {
|
|
97
|
-
// Anchor throttling after the request settles. The server received the
|
|
98
|
-
// preceding report before this point, so its own throttle has time to expire.
|
|
99
|
-
this.lastReportAt = this.now();
|
|
100
192
|
this.reporting = false;
|
|
101
|
-
this.
|
|
193
|
+
this.nextAttemptAt = this.now() + delayMs;
|
|
194
|
+
this.scheduleNext();
|
|
102
195
|
}
|
|
103
196
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
schedulePendingReport() {
|
|
108
|
-
if (this.reporting || this.pendingReport === null || this.pendingReportScheduled)
|
|
197
|
+
scheduleNext() {
|
|
198
|
+
if (this.reporting || this.scheduled || !this.hasWork())
|
|
109
199
|
return;
|
|
110
|
-
|
|
111
|
-
const delayMs = Math.max(this.throttleMs - elapsedMs, 0);
|
|
112
|
-
this.pendingReportScheduled = true;
|
|
200
|
+
this.scheduled = true;
|
|
113
201
|
this.schedule(() => {
|
|
114
|
-
this.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (pending)
|
|
118
|
-
void this.flush(pending.trigger, pending.send);
|
|
119
|
-
}, delayMs);
|
|
202
|
+
this.scheduled = false;
|
|
203
|
+
void this.deliver();
|
|
204
|
+
}, Math.min(Math.max(this.nextAttemptAt - this.now(), 0), MAX_AGE_MS));
|
|
120
205
|
}
|
|
121
206
|
}
|
|
122
207
|
function sanitizeEntry(input, atMs) {
|
|
123
208
|
if (!OPERATIONS.has(input.operation) || !STATUSES.has(input.status))
|
|
124
209
|
return null;
|
|
125
210
|
const entry = {
|
|
211
|
+
entry_seq: 0,
|
|
126
212
|
at_ms: boundedNumber(atMs, 0, 86_400_000) ?? 0,
|
|
127
213
|
operation: input.operation,
|
|
128
214
|
status: input.status,
|
package/dist/diagnostics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAEhF,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,mBAAmB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export interface SessionCredentials {
|
|
|
19
19
|
access_token: string;
|
|
20
20
|
access_token_expires_at: string;
|
|
21
21
|
}
|
|
22
|
-
export declare const SDK_VERSION = "0.3.
|
|
22
|
+
export declare const SDK_VERSION = "0.3.8";
|
|
23
23
|
type Listener = (event: RealtimeEvent) => void;
|
|
24
24
|
type StateListener = (state: ConnectionState) => void;
|
|
25
25
|
type GapListener = (gap: EventGap) => void;
|
|
@@ -194,6 +194,7 @@ export declare class RealtimeSession {
|
|
|
194
194
|
private readonly lifecycleCredentials;
|
|
195
195
|
private readonly diagnostics;
|
|
196
196
|
private readonly diagnosticReportTimeoutMs;
|
|
197
|
+
private readonly onDiagnosticVisibilityChange;
|
|
197
198
|
constructor(credentials: SessionCredentials, options?: RealtimeSessionOptions);
|
|
198
199
|
static create(options: RealtimeSessionCreateOptions): Promise<RealtimeSession>;
|
|
199
200
|
get state(): ConnectionState;
|
|
@@ -226,6 +227,7 @@ export declare class RealtimeSession {
|
|
|
226
227
|
registerTool(name: string, handler: ToolHandler): () => void;
|
|
227
228
|
connect(options?: ConnectOptions): Promise<void>;
|
|
228
229
|
private connectWithStartupRetry;
|
|
230
|
+
private registerStartupRecovery;
|
|
229
231
|
private notifyStartupAttempt;
|
|
230
232
|
private connectWithMode;
|
|
231
233
|
private connectRoom;
|
|
@@ -235,6 +237,7 @@ export declare class RealtimeSession {
|
|
|
235
237
|
sendCommand<T extends Record<string, unknown>>(type: string, payload: T, timeoutMs?: number): Promise<CommandAckPayload>;
|
|
236
238
|
updateContext(update: ContextUpdate, timeoutMs?: number): Promise<ContextUpdatedPayload>;
|
|
237
239
|
private sendContextUpdate;
|
|
240
|
+
private resumeContextDelivery;
|
|
238
241
|
private uploadTextContext;
|
|
239
242
|
private uploadImageContext;
|
|
240
243
|
disconnect(): Promise<void>;
|
|
@@ -267,6 +270,8 @@ export declare class RealtimeSession {
|
|
|
267
270
|
private publishApplicationAudioTrack;
|
|
268
271
|
private sendHello;
|
|
269
272
|
private sendTrackedCommand;
|
|
273
|
+
private scheduleCommandRetry;
|
|
274
|
+
private retryCommand;
|
|
270
275
|
private publishCommandAttempt;
|
|
271
276
|
private publishCommandAttemptNow;
|
|
272
277
|
private publishCommand;
|