@contextvm/sdk 0.9.1 → 0.11.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.
Files changed (88) hide show
  1. package/dist/esm/core/constants.d.ts +8 -0
  2. package/dist/esm/core/constants.d.ts.map +1 -1
  3. package/dist/esm/core/constants.js +8 -0
  4. package/dist/esm/core/constants.js.map +1 -1
  5. package/dist/esm/core/index.d.ts +1 -0
  6. package/dist/esm/core/index.d.ts.map +1 -1
  7. package/dist/esm/core/index.js +1 -0
  8. package/dist/esm/core/index.js.map +1 -1
  9. package/dist/esm/core/utils/common-schema.d.ts +25 -0
  10. package/dist/esm/core/utils/common-schema.d.ts.map +1 -0
  11. package/dist/esm/core/utils/common-schema.js +66 -0
  12. package/dist/esm/core/utils/common-schema.js.map +1 -0
  13. package/dist/esm/relay/applesauce-relay-pool.d.ts.map +1 -1
  14. package/dist/esm/relay/applesauce-relay-pool.js +14 -14
  15. package/dist/esm/relay/applesauce-relay-pool.js.map +1 -1
  16. package/dist/esm/transport/call-tool-stream.d.ts +22 -0
  17. package/dist/esm/transport/call-tool-stream.d.ts.map +1 -0
  18. package/dist/esm/transport/call-tool-stream.js +26 -0
  19. package/dist/esm/transport/call-tool-stream.js.map +1 -0
  20. package/dist/esm/transport/discovery-tags.d.ts +2 -0
  21. package/dist/esm/transport/discovery-tags.d.ts.map +1 -1
  22. package/dist/esm/transport/discovery-tags.js +1 -0
  23. package/dist/esm/transport/discovery-tags.js.map +1 -1
  24. package/dist/esm/transport/index.d.ts +4 -0
  25. package/dist/esm/transport/index.d.ts.map +1 -1
  26. package/dist/esm/transport/index.js +4 -0
  27. package/dist/esm/transport/index.js.map +1 -1
  28. package/dist/esm/transport/nostr-client-transport.d.ts +31 -1
  29. package/dist/esm/transport/nostr-client-transport.d.ts.map +1 -1
  30. package/dist/esm/transport/nostr-client-transport.js +168 -1
  31. package/dist/esm/transport/nostr-client-transport.js.map +1 -1
  32. package/dist/esm/transport/nostr-server/announcement-manager.d.ts +7 -1
  33. package/dist/esm/transport/nostr-server/announcement-manager.d.ts.map +1 -1
  34. package/dist/esm/transport/nostr-server/announcement-manager.js +18 -3
  35. package/dist/esm/transport/nostr-server/announcement-manager.js.map +1 -1
  36. package/dist/esm/transport/nostr-server/session-store.d.ts +2 -0
  37. package/dist/esm/transport/nostr-server/session-store.d.ts.map +1 -1
  38. package/dist/esm/transport/nostr-server/session-store.js +1 -0
  39. package/dist/esm/transport/nostr-server/session-store.js.map +1 -1
  40. package/dist/esm/transport/nostr-server-transport.d.ts +37 -2
  41. package/dist/esm/transport/nostr-server-transport.d.ts.map +1 -1
  42. package/dist/esm/transport/nostr-server-transport.js +254 -24
  43. package/dist/esm/transport/nostr-server-transport.js.map +1 -1
  44. package/dist/esm/transport/open-stream/constants.d.ts +8 -0
  45. package/dist/esm/transport/open-stream/constants.d.ts.map +1 -0
  46. package/dist/esm/transport/open-stream/constants.js +8 -0
  47. package/dist/esm/transport/open-stream/constants.js.map +1 -0
  48. package/dist/esm/transport/open-stream/errors.d.ts +19 -0
  49. package/dist/esm/transport/open-stream/errors.d.ts.map +1 -0
  50. package/dist/esm/transport/open-stream/errors.js +31 -0
  51. package/dist/esm/transport/open-stream/errors.js.map +1 -0
  52. package/dist/esm/transport/open-stream/frames.d.ts +37 -0
  53. package/dist/esm/transport/open-stream/frames.d.ts.map +1 -0
  54. package/dist/esm/transport/open-stream/frames.js +91 -0
  55. package/dist/esm/transport/open-stream/frames.js.map +1 -0
  56. package/dist/esm/transport/open-stream/index.d.ts +9 -0
  57. package/dist/esm/transport/open-stream/index.d.ts.map +1 -0
  58. package/dist/esm/transport/open-stream/index.js +9 -0
  59. package/dist/esm/transport/open-stream/index.js.map +1 -0
  60. package/dist/esm/transport/open-stream/receiver.d.ts +18 -0
  61. package/dist/esm/transport/open-stream/receiver.d.ts.map +1 -0
  62. package/dist/esm/transport/open-stream/receiver.js +31 -0
  63. package/dist/esm/transport/open-stream/receiver.js.map +1 -0
  64. package/dist/esm/transport/open-stream/registry.d.ts +37 -0
  65. package/dist/esm/transport/open-stream/registry.d.ts.map +1 -0
  66. package/dist/esm/transport/open-stream/registry.js +115 -0
  67. package/dist/esm/transport/open-stream/registry.js.map +1 -0
  68. package/dist/esm/transport/open-stream/session.d.ts +80 -0
  69. package/dist/esm/transport/open-stream/session.d.ts.map +1 -0
  70. package/dist/esm/transport/open-stream/session.js +343 -0
  71. package/dist/esm/transport/open-stream/session.js.map +1 -0
  72. package/dist/esm/transport/open-stream/types.d.ts +52 -0
  73. package/dist/esm/transport/open-stream/types.d.ts.map +1 -0
  74. package/dist/esm/transport/open-stream/types.js +2 -0
  75. package/dist/esm/transport/open-stream/types.js.map +1 -0
  76. package/dist/esm/transport/open-stream/writer.d.ts +38 -0
  77. package/dist/esm/transport/open-stream/writer.d.ts.map +1 -0
  78. package/dist/esm/transport/open-stream/writer.js +123 -0
  79. package/dist/esm/transport/open-stream/writer.js.map +1 -0
  80. package/dist/esm/transport/open-stream-policy.d.ts +12 -0
  81. package/dist/esm/transport/open-stream-policy.d.ts.map +1 -0
  82. package/dist/esm/transport/open-stream-policy.js +2 -0
  83. package/dist/esm/transport/open-stream-policy.js.map +1 -0
  84. package/dist/esm/transport/server-transport-common-schemas.d.ts +23 -0
  85. package/dist/esm/transport/server-transport-common-schemas.d.ts.map +1 -0
  86. package/dist/esm/transport/server-transport-common-schemas.js +119 -0
  87. package/dist/esm/transport/server-transport-common-schemas.js.map +1 -0
  88. package/package.json +2 -1
@@ -0,0 +1,80 @@
1
+ import type { OpenStreamFrame, OpenStreamReadResult, OpenStreamSessionLike } from './types.js';
2
+ type PendingChunk = OpenStreamReadResult<string>;
3
+ export interface OpenStreamSessionOptions {
4
+ progressToken: string;
5
+ maxBufferedChunks: number;
6
+ maxBufferedBytes: number;
7
+ idleTimeoutMs?: number;
8
+ probeTimeoutMs?: number;
9
+ closeGracePeriodMs?: number;
10
+ sendPing?: (nonce: string) => Promise<void>;
11
+ sendPong?: (nonce: string) => Promise<void>;
12
+ sendAbort?: (reason?: string) => Promise<void>;
13
+ onAbort?: (reason?: string) => Promise<void>;
14
+ onClose?: () => Promise<void>;
15
+ }
16
+ /**
17
+ * Readable client-side/session-side view of a CEP-41 stream.
18
+ */
19
+ export declare class OpenStreamSession implements OpenStreamSessionLike<string> {
20
+ readonly progressToken: string;
21
+ readonly closed: Promise<void>;
22
+ private readonly onAbort?;
23
+ private readonly onClose?;
24
+ private readonly closeDeferred;
25
+ private readonly waiters;
26
+ private readonly queue;
27
+ private readonly bufferedChunks;
28
+ private readonly maxBufferedChunks;
29
+ private readonly maxBufferedBytes;
30
+ private readonly idleTimeoutMs;
31
+ private readonly probeTimeoutMs;
32
+ private readonly closeGracePeriodMs;
33
+ private readonly sendPing?;
34
+ private readonly sendPong?;
35
+ private readonly sendAbort?;
36
+ private bufferedBytes;
37
+ private queuedBytes;
38
+ private active;
39
+ private started;
40
+ private closedRemotely;
41
+ private closeState;
42
+ private nextExpectedChunkIndex;
43
+ private lastProgress;
44
+ private terminalError;
45
+ private controlNonce;
46
+ private pendingProbeNonce;
47
+ private idleTimer;
48
+ private probeTimer;
49
+ private closeGraceTimer;
50
+ constructor(options: OpenStreamSessionOptions);
51
+ get isActive(): boolean;
52
+ abort(reason?: string): Promise<void>;
53
+ dispose(): void;
54
+ processFrame(progress: number, frame: OpenStreamFrame): Promise<void>;
55
+ [Symbol.asyncIterator](): AsyncIterator<PendingChunk>;
56
+ private assertActive;
57
+ private assertStarted;
58
+ private assertProgress;
59
+ private bufferChunk;
60
+ private flushContiguousChunks;
61
+ private emit;
62
+ private maybeFinishGracefully;
63
+ private handlePing;
64
+ private handlePong;
65
+ private refreshIdleTimer;
66
+ private handleIdleTimeout;
67
+ private handleProbeTimeout;
68
+ private armCloseGraceTimer;
69
+ private handleCloseGraceTimeout;
70
+ private nextControlNonce;
71
+ private clearIdleTimer;
72
+ private clearProbeTimer;
73
+ private clearCloseGraceTimer;
74
+ private clearTimers;
75
+ private finalize;
76
+ private finishClosed;
77
+ private finishAborted;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../../src/transport/open-stream/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,343 @@
1
+ import { DEFAULT_OPEN_STREAM_CLOSE_GRACE_PERIOD_MS, DEFAULT_OPEN_STREAM_IDLE_TIMEOUT_MS, DEFAULT_OPEN_STREAM_PROBE_TIMEOUT_MS, } from './constants.js';
2
+ import { OpenStreamAbortError, OpenStreamSequenceError } from './errors.js';
3
+ function createDeferred() {
4
+ let resolve;
5
+ let reject;
6
+ const promise = new Promise((res, rej) => {
7
+ resolve = res;
8
+ reject = rej;
9
+ });
10
+ return { resolve, reject, promise };
11
+ }
12
+ /**
13
+ * Readable client-side/session-side view of a CEP-41 stream.
14
+ */
15
+ export class OpenStreamSession {
16
+ constructor(options) {
17
+ var _a, _b, _c;
18
+ this.closeDeferred = createDeferred();
19
+ this.waiters = [];
20
+ this.queue = [];
21
+ this.bufferedChunks = new Map();
22
+ this.bufferedBytes = 0;
23
+ this.queuedBytes = 0;
24
+ this.active = true;
25
+ this.started = false;
26
+ this.closedRemotely = false;
27
+ this.nextExpectedChunkIndex = 0;
28
+ this.lastProgress = -1;
29
+ this.controlNonce = 0;
30
+ this.progressToken = options.progressToken;
31
+ this.maxBufferedChunks = options.maxBufferedChunks;
32
+ this.maxBufferedBytes = options.maxBufferedBytes;
33
+ this.idleTimeoutMs =
34
+ (_a = options.idleTimeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_OPEN_STREAM_IDLE_TIMEOUT_MS;
35
+ this.probeTimeoutMs =
36
+ (_b = options.probeTimeoutMs) !== null && _b !== void 0 ? _b : DEFAULT_OPEN_STREAM_PROBE_TIMEOUT_MS;
37
+ this.closeGracePeriodMs =
38
+ (_c = options.closeGracePeriodMs) !== null && _c !== void 0 ? _c : DEFAULT_OPEN_STREAM_CLOSE_GRACE_PERIOD_MS;
39
+ this.sendPing = options.sendPing;
40
+ this.sendPong = options.sendPong;
41
+ this.sendAbort = options.sendAbort;
42
+ this.onAbort = options.onAbort;
43
+ this.onClose = options.onClose;
44
+ this.closed = this.closeDeferred.promise;
45
+ }
46
+ get isActive() {
47
+ return this.active;
48
+ }
49
+ async abort(reason) {
50
+ if (!this.active) {
51
+ return;
52
+ }
53
+ const error = new OpenStreamAbortError(this.progressToken, reason);
54
+ await this.finishAborted(error, reason, true);
55
+ }
56
+ dispose() {
57
+ this.finalize();
58
+ }
59
+ async processFrame(progress, frame) {
60
+ this.assertActive();
61
+ this.assertProgress(progress);
62
+ switch (frame.frameType) {
63
+ case 'start':
64
+ if (this.started) {
65
+ throw new OpenStreamSequenceError(`Duplicate start frame for stream ${this.progressToken}`);
66
+ }
67
+ this.started = true;
68
+ this.refreshIdleTimer();
69
+ return;
70
+ case 'accept':
71
+ this.refreshIdleTimer();
72
+ return;
73
+ case 'ping':
74
+ this.assertStarted();
75
+ this.refreshIdleTimer();
76
+ await this.handlePing(frame);
77
+ return;
78
+ case 'pong':
79
+ this.assertStarted();
80
+ this.refreshIdleTimer();
81
+ this.handlePong(frame.nonce);
82
+ return;
83
+ case 'chunk':
84
+ this.assertStarted();
85
+ this.bufferChunk(frame);
86
+ this.flushContiguousChunks();
87
+ this.refreshIdleTimer();
88
+ return;
89
+ case 'close':
90
+ this.assertStarted();
91
+ this.closedRemotely = true;
92
+ this.closeState = {
93
+ expectedLastChunkIndex: frame.lastChunkIndex,
94
+ };
95
+ this.flushContiguousChunks();
96
+ this.refreshIdleTimer();
97
+ this.maybeFinishGracefully();
98
+ this.armCloseGraceTimer();
99
+ return;
100
+ case 'abort':
101
+ this.refreshIdleTimer();
102
+ await this.finishAborted(new OpenStreamAbortError(this.progressToken, frame.reason), frame.reason, false);
103
+ return;
104
+ default:
105
+ return;
106
+ }
107
+ }
108
+ [Symbol.asyncIterator]() {
109
+ return {
110
+ next: async () => {
111
+ if (this.queue.length > 0) {
112
+ const value = this.queue.shift();
113
+ if (!value) {
114
+ return { done: true, value: undefined };
115
+ }
116
+ this.queuedBytes -= Buffer.byteLength(value.value, 'utf8');
117
+ return { done: false, value };
118
+ }
119
+ if (!this.active) {
120
+ if (this.terminalError) {
121
+ throw this.terminalError;
122
+ }
123
+ return { done: true, value: undefined };
124
+ }
125
+ const waiter = createDeferred();
126
+ this.waiters.push(waiter);
127
+ return waiter.promise;
128
+ },
129
+ };
130
+ }
131
+ assertActive() {
132
+ if (!this.active) {
133
+ throw new OpenStreamSequenceError(`Received frame for inactive stream ${this.progressToken}`);
134
+ }
135
+ }
136
+ assertStarted() {
137
+ if (!this.started) {
138
+ throw new OpenStreamSequenceError(`Received non-start frame before start for ${this.progressToken}`);
139
+ }
140
+ }
141
+ assertProgress(progress) {
142
+ if (!Number.isFinite(progress) || progress <= this.lastProgress) {
143
+ throw new OpenStreamSequenceError(`Non-increasing progress for stream ${this.progressToken}`);
144
+ }
145
+ this.lastProgress = progress;
146
+ }
147
+ bufferChunk(frame) {
148
+ if (!Number.isInteger(frame.chunkIndex) || frame.chunkIndex < 0) {
149
+ throw new OpenStreamSequenceError(`Invalid chunkIndex for stream ${this.progressToken}`);
150
+ }
151
+ if (frame.chunkIndex < this.nextExpectedChunkIndex) {
152
+ throw new OpenStreamSequenceError(`Stale chunkIndex ${frame.chunkIndex} for ${this.progressToken}`);
153
+ }
154
+ if (this.bufferedChunks.has(frame.chunkIndex)) {
155
+ throw new OpenStreamSequenceError(`Duplicate chunkIndex ${frame.chunkIndex} for ${this.progressToken}`);
156
+ }
157
+ const chunkBytes = Buffer.byteLength(frame.data, 'utf8');
158
+ if (this.bufferedChunks.size + this.queue.length >=
159
+ this.maxBufferedChunks) {
160
+ throw new OpenStreamSequenceError(`Buffered chunk limit exceeded for stream ${this.progressToken}`);
161
+ }
162
+ if (this.bufferedBytes + this.queuedBytes + chunkBytes >
163
+ this.maxBufferedBytes) {
164
+ throw new OpenStreamSequenceError(`Buffered byte limit exceeded for stream ${this.progressToken}`);
165
+ }
166
+ this.bufferedChunks.set(frame.chunkIndex, frame.data);
167
+ this.bufferedBytes += chunkBytes;
168
+ }
169
+ flushContiguousChunks() {
170
+ while (this.bufferedChunks.has(this.nextExpectedChunkIndex)) {
171
+ const data = this.bufferedChunks.get(this.nextExpectedChunkIndex);
172
+ if (typeof data !== 'string') {
173
+ break;
174
+ }
175
+ this.bufferedChunks.delete(this.nextExpectedChunkIndex);
176
+ this.bufferedBytes -= Buffer.byteLength(data, 'utf8');
177
+ this.emit({ value: data, chunkIndex: this.nextExpectedChunkIndex });
178
+ this.nextExpectedChunkIndex += 1;
179
+ }
180
+ if (this.closedRemotely) {
181
+ this.maybeFinishGracefully();
182
+ }
183
+ }
184
+ emit(value) {
185
+ const waiter = this.waiters.shift();
186
+ if (waiter) {
187
+ waiter.resolve({ done: false, value });
188
+ return;
189
+ }
190
+ this.queuedBytes += Buffer.byteLength(value.value, 'utf8');
191
+ this.queue.push(value);
192
+ }
193
+ maybeFinishGracefully() {
194
+ var _a;
195
+ if (!this.closedRemotely || this.bufferedChunks.size > 0) {
196
+ return;
197
+ }
198
+ const expectedLastChunkIndex = (_a = this.closeState) === null || _a === void 0 ? void 0 : _a.expectedLastChunkIndex;
199
+ if (expectedLastChunkIndex !== undefined) {
200
+ if (!Number.isInteger(expectedLastChunkIndex) ||
201
+ expectedLastChunkIndex < 0) {
202
+ throw new OpenStreamSequenceError(`Invalid lastChunkIndex for stream ${this.progressToken}`);
203
+ }
204
+ if (this.nextExpectedChunkIndex !== expectedLastChunkIndex + 1) {
205
+ throw new OpenStreamSequenceError(`Incomplete stream for ${this.progressToken}: expected chunks through ${expectedLastChunkIndex}`);
206
+ }
207
+ }
208
+ void this.finishClosed().catch(() => undefined);
209
+ }
210
+ async handlePing(frame) {
211
+ var _a;
212
+ await ((_a = this.sendPong) === null || _a === void 0 ? void 0 : _a.call(this, frame.nonce));
213
+ }
214
+ handlePong(nonce) {
215
+ if (this.pendingProbeNonce !== nonce) {
216
+ return;
217
+ }
218
+ this.pendingProbeNonce = undefined;
219
+ this.clearProbeTimer();
220
+ }
221
+ refreshIdleTimer() {
222
+ if (!this.active || this.closedRemotely) {
223
+ return;
224
+ }
225
+ this.clearIdleTimer();
226
+ this.idleTimer = setTimeout(() => {
227
+ this.handleIdleTimeout().catch(() => undefined);
228
+ }, this.idleTimeoutMs);
229
+ }
230
+ async handleIdleTimeout() {
231
+ var _a;
232
+ if (!this.active || this.closedRemotely || this.pendingProbeNonce) {
233
+ return;
234
+ }
235
+ const nonce = this.nextControlNonce();
236
+ this.pendingProbeNonce = nonce;
237
+ try {
238
+ await ((_a = this.sendPing) === null || _a === void 0 ? void 0 : _a.call(this, nonce));
239
+ }
240
+ catch (error) {
241
+ await this.finishAborted(error instanceof Error ? error : new Error(String(error)), 'Failed to send keepalive ping', false);
242
+ return;
243
+ }
244
+ this.clearProbeTimer();
245
+ this.probeTimer = setTimeout(() => {
246
+ this.handleProbeTimeout(nonce).catch(() => undefined);
247
+ }, this.probeTimeoutMs);
248
+ }
249
+ async handleProbeTimeout(nonce) {
250
+ if (!this.active || this.pendingProbeNonce !== nonce) {
251
+ return;
252
+ }
253
+ await this.finishAborted(new OpenStreamAbortError(this.progressToken, 'Probe timeout'), 'Probe timeout', true);
254
+ }
255
+ armCloseGraceTimer() {
256
+ if (!this.active ||
257
+ !this.closedRemotely ||
258
+ this.bufferedChunks.size === 0) {
259
+ return;
260
+ }
261
+ this.clearCloseGraceTimer();
262
+ this.closeGraceTimer = setTimeout(() => {
263
+ this.handleCloseGraceTimeout().catch(() => undefined);
264
+ }, this.closeGracePeriodMs);
265
+ }
266
+ async handleCloseGraceTimeout() {
267
+ if (!this.active ||
268
+ !this.closedRemotely ||
269
+ this.bufferedChunks.size === 0) {
270
+ return;
271
+ }
272
+ await this.finishAborted(new OpenStreamAbortError(this.progressToken, 'Close grace period expired'), 'Close grace period expired', true);
273
+ }
274
+ nextControlNonce() {
275
+ this.controlNonce += 1;
276
+ return `${this.progressToken}:${this.controlNonce}`;
277
+ }
278
+ clearIdleTimer() {
279
+ if (this.idleTimer) {
280
+ clearTimeout(this.idleTimer);
281
+ this.idleTimer = undefined;
282
+ }
283
+ }
284
+ clearProbeTimer() {
285
+ if (this.probeTimer) {
286
+ clearTimeout(this.probeTimer);
287
+ this.probeTimer = undefined;
288
+ }
289
+ }
290
+ clearCloseGraceTimer() {
291
+ if (this.closeGraceTimer) {
292
+ clearTimeout(this.closeGraceTimer);
293
+ this.closeGraceTimer = undefined;
294
+ }
295
+ }
296
+ clearTimers() {
297
+ this.clearIdleTimer();
298
+ this.clearProbeTimer();
299
+ this.clearCloseGraceTimer();
300
+ this.pendingProbeNonce = undefined;
301
+ }
302
+ finalize(error) {
303
+ if (!this.active) {
304
+ return;
305
+ }
306
+ this.clearTimers();
307
+ this.active = false;
308
+ this.terminalError = error;
309
+ this.queuedBytes = 0;
310
+ while (this.waiters.length > 0) {
311
+ const waiter = this.waiters.shift();
312
+ if (!waiter) {
313
+ continue;
314
+ }
315
+ if (error) {
316
+ waiter.reject(error);
317
+ }
318
+ else {
319
+ waiter.resolve({ done: true, value: undefined });
320
+ }
321
+ }
322
+ if (error) {
323
+ this.closeDeferred.reject(error);
324
+ }
325
+ else {
326
+ this.closeDeferred.resolve(undefined);
327
+ }
328
+ }
329
+ async finishClosed() {
330
+ var _a;
331
+ this.finalize();
332
+ await ((_a = this.onClose) === null || _a === void 0 ? void 0 : _a.call(this));
333
+ }
334
+ async finishAborted(error, reason, publishAbort = false) {
335
+ var _a, _b;
336
+ this.finalize(error);
337
+ if (publishAbort) {
338
+ await ((_a = this.sendAbort) === null || _a === void 0 ? void 0 : _a.call(this, reason));
339
+ }
340
+ await ((_b = this.onAbort) === null || _b === void 0 ? void 0 : _b.call(this, reason));
341
+ }
342
+ }
343
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../../../src/transport/open-stream/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ export type OpenStreamFrameType = 'start' | 'accept' | 'chunk' | 'ping' | 'pong' | 'close' | 'abort';
2
+ export type OpenStreamCommon = {
3
+ type: 'open-stream';
4
+ frameType: OpenStreamFrameType;
5
+ };
6
+ export type OpenStreamStartFrame = OpenStreamCommon & {
7
+ frameType: 'start';
8
+ contentType?: string;
9
+ };
10
+ export type OpenStreamAcceptFrame = OpenStreamCommon & {
11
+ frameType: 'accept';
12
+ };
13
+ export type OpenStreamChunkFrame = OpenStreamCommon & {
14
+ frameType: 'chunk';
15
+ chunkIndex: number;
16
+ data: string;
17
+ };
18
+ export type OpenStreamPingFrame = OpenStreamCommon & {
19
+ frameType: 'ping';
20
+ nonce: string;
21
+ };
22
+ export type OpenStreamPongFrame = OpenStreamCommon & {
23
+ frameType: 'pong';
24
+ nonce: string;
25
+ };
26
+ export type OpenStreamCloseFrame = OpenStreamCommon & {
27
+ frameType: 'close';
28
+ lastChunkIndex?: number;
29
+ };
30
+ export type OpenStreamAbortFrame = OpenStreamCommon & {
31
+ frameType: 'abort';
32
+ reason?: string;
33
+ };
34
+ export type OpenStreamFrame = OpenStreamStartFrame | OpenStreamAcceptFrame | OpenStreamChunkFrame | OpenStreamPingFrame | OpenStreamPongFrame | OpenStreamCloseFrame | OpenStreamAbortFrame;
35
+ export type OpenStreamProgress = {
36
+ progressToken: string | number;
37
+ progress: number;
38
+ message?: string;
39
+ total?: number;
40
+ cvm: OpenStreamFrame;
41
+ };
42
+ export interface OpenStreamReadResult<TChunk = string> {
43
+ readonly value: TChunk;
44
+ readonly chunkIndex: number;
45
+ }
46
+ export interface OpenStreamSessionLike<TChunk = string> extends AsyncIterable<OpenStreamReadResult<TChunk>> {
47
+ readonly progressToken: string;
48
+ readonly isActive: boolean;
49
+ readonly closed: Promise<void>;
50
+ abort(reason?: string): Promise<void>;
51
+ }
52
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/transport/open-stream/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,QAAQ,GACR,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,mBAAmB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG;IACrD,SAAS,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,qBAAqB,GACrB,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,eAAe,CAAC;CACtB,CAAC;AAEF,MAAM,WAAW,oBAAoB,CAAC,MAAM,GAAG,MAAM;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB,CAAC,MAAM,GAAG,MAAM,CAAE,SAAQ,aAAa,CAC3E,oBAAoB,CAAC,MAAM,CAAC,CAC7B;IACC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/transport/open-stream/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import type { OpenStreamProgress } from './types.js';
2
+ export type OpenStreamFramePublisher = (frame: OpenStreamProgress) => Promise<string | undefined>;
3
+ export interface OpenStreamWriterOptions {
4
+ progressToken: string;
5
+ publishFrame: OpenStreamFramePublisher;
6
+ contentType?: string;
7
+ onClose?: () => Promise<void>;
8
+ onAbort?: (reason?: string) => Promise<void>;
9
+ }
10
+ /**
11
+ * Minimal CEP-41 writer/session for server-side production.
12
+ */
13
+ export declare class OpenStreamWriter {
14
+ readonly progressToken: string;
15
+ private readonly publishFrame;
16
+ private readonly contentType;
17
+ private readonly onClose?;
18
+ private readonly onAbort?;
19
+ private progress;
20
+ private chunkIndex;
21
+ private controlNonce;
22
+ private started;
23
+ private active;
24
+ private operationQueue;
25
+ constructor(options: OpenStreamWriterOptions);
26
+ get isActive(): boolean;
27
+ start(): Promise<void>;
28
+ write(data: string): Promise<void>;
29
+ ping(): Promise<void>;
30
+ pong(nonce: string): Promise<void>;
31
+ close(): Promise<void>;
32
+ abort(reason?: string): Promise<void>;
33
+ private startInternal;
34
+ private enqueue;
35
+ private nextProgress;
36
+ private nextControlNonce;
37
+ }
38
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../../src/transport/open-stream/writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAUrD,MAAM,MAAM,wBAAwB,GAAG,CACrC,KAAK,EAAE,kBAAkB,KACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjC,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,wBAAwB,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,SAAgB,aAAa,EAAE,MAAM,CAAC;IAEtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA2B;IACxD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,cAAc,CAAoC;gBAE9C,OAAO,EAAE,uBAAuB;IAQ5C,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAkBpC,aAAa;YAeb,OAAO;IAMrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,gBAAgB;CAIzB"}