lemon-model 1.2.0 → 1.2.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.
Files changed (85) hide show
  1. package/README.md +97 -0
  2. package/dist/buffer/index.d.ts +9 -0
  3. package/dist/buffer/index.js +26 -0
  4. package/dist/buffer/index.js.map +1 -0
  5. package/dist/buffer/network.d.ts +89 -0
  6. package/dist/buffer/network.js +172 -0
  7. package/dist/buffer/network.js.map +1 -0
  8. package/dist/buffer/stream.d.ts +220 -0
  9. package/dist/buffer/stream.js +563 -0
  10. package/dist/buffer/stream.js.map +1 -0
  11. package/dist/buffer/testing.d.ts +56 -0
  12. package/dist/buffer/testing.js +92 -0
  13. package/dist/buffer/testing.js.map +1 -0
  14. package/dist/buffer/token.d.ts +49 -0
  15. package/dist/buffer/token.js +112 -0
  16. package/dist/buffer/token.js.map +1 -0
  17. package/dist/esm/buffer/index.js +10 -0
  18. package/dist/esm/buffer/index.js.map +1 -0
  19. package/dist/esm/buffer/network.js +163 -0
  20. package/dist/esm/buffer/network.js.map +1 -0
  21. package/dist/esm/buffer/stream.js +554 -0
  22. package/dist/esm/buffer/stream.js.map +1 -0
  23. package/dist/esm/buffer/testing.js +88 -0
  24. package/dist/esm/buffer/testing.js.map +1 -0
  25. package/dist/esm/buffer/token.js +108 -0
  26. package/dist/esm/buffer/token.js.map +1 -0
  27. package/dist/esm/cores/index.js +11 -0
  28. package/dist/esm/cores/index.js.map +1 -0
  29. package/dist/esm/cores/transformer.js +91 -0
  30. package/dist/esm/cores/transformer.js.map +1 -0
  31. package/dist/esm/genai/dump-test.js +196 -0
  32. package/dist/esm/genai/dump-test.js.map +1 -0
  33. package/dist/esm/genai/index.js +15 -0
  34. package/dist/esm/genai/index.js.map +1 -0
  35. package/dist/esm/genai/mocks.js +121 -0
  36. package/dist/esm/genai/mocks.js.map +1 -0
  37. package/dist/esm/genai/proxy.js +161 -0
  38. package/dist/esm/genai/proxy.js.map +1 -0
  39. package/dist/esm/genai/testing.js +12 -0
  40. package/dist/esm/genai/testing.js.map +1 -0
  41. package/dist/esm/genai/transport.js +100 -0
  42. package/dist/esm/genai/transport.js.map +1 -0
  43. package/dist/esm/genai/types.js +9 -0
  44. package/dist/esm/genai/types.js.map +1 -0
  45. package/dist/esm/index.js +16 -0
  46. package/dist/esm/index.js.map +1 -0
  47. package/dist/esm/package.json +3 -0
  48. package/dist/esm/socket/index.js +13 -0
  49. package/dist/esm/socket/index.js.map +1 -0
  50. package/dist/esm/socket/socket.js +833 -0
  51. package/dist/esm/socket/socket.js.map +1 -0
  52. package/dist/esm/socket/testing.js +12 -0
  53. package/dist/esm/socket/testing.js.map +1 -0
  54. package/dist/esm/socket/transport.js +603 -0
  55. package/dist/esm/socket/transport.js.map +1 -0
  56. package/dist/esm/socket/types.js +8 -0
  57. package/dist/esm/socket/types.js.map +1 -0
  58. package/dist/esm/socket/websocket.js +479 -0
  59. package/dist/esm/socket/websocket.js.map +1 -0
  60. package/dist/esm/types/core-storage.js +30 -0
  61. package/dist/esm/types/core-storage.js.map +1 -0
  62. package/dist/esm/types/core-types.js +17 -0
  63. package/dist/esm/types/core-types.js.map +1 -0
  64. package/dist/esm/types/index.js +13 -0
  65. package/dist/esm/types/index.js.map +1 -0
  66. package/dist/genai/index.js +1 -1
  67. package/dist/genai/index.js.map +1 -1
  68. package/dist/genai/mocks.d.ts +1 -1
  69. package/dist/genai/mocks.js +1 -1
  70. package/dist/genai/testing.d.ts +1 -1
  71. package/dist/genai/testing.js +1 -1
  72. package/dist/genai/transport.js +3 -34
  73. package/dist/genai/transport.js.map +1 -1
  74. package/dist/index.d.ts +1 -0
  75. package/dist/index.js +1 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/socket/index.js +1 -1
  78. package/dist/socket/index.js.map +1 -1
  79. package/dist/socket/testing.d.ts +1 -1
  80. package/dist/socket/testing.js +1 -1
  81. package/dist/socket/types.d.ts +5 -3
  82. package/dist/socket/websocket.d.ts +63 -0
  83. package/dist/socket/websocket.js +216 -1
  84. package/dist/socket/websocket.js.map +1 -1
  85. package/package.json +32 -2
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.runGenAIStreamNetworkLoop = void 0;
13
+ /**
14
+ * `buffer/testing.ts`
15
+ * - isolated entry for GenAI stream buffer diagnostic helpers.
16
+ * - kept OUT of the package root barrel so production bundles do not include the in-memory socket simulator.
17
+ *
18
+ * Usage (tests / dev only):
19
+ * import { runGenAIStreamNetworkLoop } from 'lemon-model/buffer/testing';
20
+ *
21
+ * @origin eureka-agents-api / src/lib/buffer/network.ts
22
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
23
+ */
24
+ const socket_1 = require("../socket/socket");
25
+ const stream_1 = require("./stream");
26
+ const network_1 = require("./network");
27
+ /**
28
+ * Run an end-to-end diagnostic loop:
29
+ * tokens -> GenAIStreamBuffer -> JSONTransport -> NetworkSupportable ->
30
+ * JSONTransport -> GenAIStreamConsumer.
31
+ *
32
+ * This helper is intended for tests, smoke checks, and lightweight performance
33
+ * probes in environments that can provide a NetworkSupportable.
34
+ */
35
+ const runGenAIStreamNetworkLoop = (options) => __awaiter(void 0, void 0, void 0, function* () {
36
+ var _a, _b, _c, _d, _e, _f, _g;
37
+ const startedAt = Date.now();
38
+ const network = (_a = options.network) !== null && _a !== void 0 ? _a : (0, socket_1.createNetwork)(Object.assign({ id: (_c = (_b = options.networkOptions) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : options.id }, options.networkOptions));
39
+ const streamNetwork = Object.assign(Object.assign({}, ((_d = options.streamNetwork) !== null && _d !== void 0 ? _d : {})), { maxPacketBytes: (_f = (_e = options.streamNetwork) === null || _e === void 0 ? void 0 : _e.maxPacketBytes) !== null && _f !== void 0 ? _f : (_g = options.networkOptions) === null || _g === void 0 ? void 0 : _g.maxPacketBytes });
40
+ const events = [];
41
+ const rawPackets = [];
42
+ const unsubscribeRaw = network.onMessage(packet => rawPackets.push(packet));
43
+ const receiver = (0, network_1.createGenAIStreamNetworkReceiver)(network, event => {
44
+ events.push(event);
45
+ }, streamNetwork);
46
+ const sender = (0, network_1.createGenAIStreamNetworkConsumer)(network, streamNetwork);
47
+ const buffer = new stream_1.GenAIStreamBuffer(sender.consumer, options.bufferOptions);
48
+ try {
49
+ yield buffer.start();
50
+ for (const token of options.tokens)
51
+ yield buffer.write(token);
52
+ yield buffer.close();
53
+ yield new Promise(resolve => { var _a; return setTimeout(resolve, (_a = options.settleMs) !== null && _a !== void 0 ? _a : 50); });
54
+ const snapshot = buffer.snapshot();
55
+ const packetBytes = rawPackets.reduce((sum, packet) => sum + byteLength(packet), 0);
56
+ const maxPacketBytes = rawPackets.reduce((max, packet) => Math.max(max, byteLength(packet)), 0);
57
+ const chunkPackets = rawPackets.filter(packet => {
58
+ var _a;
59
+ try {
60
+ return ((_a = JSON.parse(packet)) === null || _a === void 0 ? void 0 : _a.type) === 'json:chunk';
61
+ }
62
+ catch (_b) {
63
+ return false;
64
+ }
65
+ }).length;
66
+ return {
67
+ events,
68
+ rawPackets,
69
+ snapshot,
70
+ network,
71
+ metrics: {
72
+ elapsedMs: Date.now() - startedAt,
73
+ packets: rawPackets.length,
74
+ packetBytes,
75
+ maxPacketBytes,
76
+ chunkPackets,
77
+ events: events.length,
78
+ },
79
+ };
80
+ }
81
+ finally {
82
+ unsubscribeRaw();
83
+ sender.detach();
84
+ receiver.detach();
85
+ if (!options.network)
86
+ network.close();
87
+ }
88
+ });
89
+ exports.runGenAIStreamNetworkLoop = runGenAIStreamNetworkLoop;
90
+ const textEncoder = new TextEncoder();
91
+ const byteLength = (value) => textEncoder.encode(value).length;
92
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/buffer/testing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * `buffer/token.ts`
3
+ * - Legacy token-string buffering helper.
4
+ *
5
+ * @origin eureka-agents-api / src/lib/buffer/token.ts
6
+ *
7
+ * type: `TokenBufferOptions`
8
+ */
9
+ export interface TokenBufferOptions {
10
+ /** buffer flush strategy */
11
+ flushStrategy?: 'time' | 'size';
12
+ /** time-based flush interval in ms */
13
+ bufferMs?: number;
14
+ /** max tokens before force flush in time strategy */
15
+ maxTokensForTime?: number;
16
+ /** size-based flush when token count reaches this */
17
+ bufferSize?: number;
18
+ /** max wait time in ms for size strategy */
19
+ maxWaitMs?: number;
20
+ /** enable buffer (default: true) */
21
+ useBuffer?: boolean;
22
+ }
23
+ /**
24
+ * class: `TokenBuffer`
25
+ * - manages token buffering with configurable flush strategies
26
+ */
27
+ export declare class TokenBuffer {
28
+ private flushCallback;
29
+ private tokens;
30
+ private timer?;
31
+ private isProcessing;
32
+ private readonly options;
33
+ constructor(flushCallback: (content: string) => Promise<void>, options?: TokenBufferOptions);
34
+ /**
35
+ * add token to buffer
36
+ */
37
+ add(token: string): Promise<void>;
38
+ /**
39
+ * flush all buffered tokens
40
+ */
41
+ flush(): Promise<void>;
42
+ /**
43
+ * close buffer and flush remaining tokens
44
+ */
45
+ close(): Promise<void>;
46
+ private scheduleTimeFlush;
47
+ private scheduleMaxWaitFlush;
48
+ private clearTimer;
49
+ }
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TokenBuffer = void 0;
13
+ /**
14
+ * class: `TokenBuffer`
15
+ * - manages token buffering with configurable flush strategies
16
+ */
17
+ class TokenBuffer {
18
+ constructor(flushCallback, options) {
19
+ var _a, _b, _c, _d, _e, _f;
20
+ this.flushCallback = flushCallback;
21
+ this.tokens = [];
22
+ this.isProcessing = false;
23
+ this.options = {
24
+ flushStrategy: (_a = options === null || options === void 0 ? void 0 : options.flushStrategy) !== null && _a !== void 0 ? _a : 'size',
25
+ bufferMs: (_b = options === null || options === void 0 ? void 0 : options.bufferMs) !== null && _b !== void 0 ? _b : 300,
26
+ maxTokensForTime: (_c = options === null || options === void 0 ? void 0 : options.maxTokensForTime) !== null && _c !== void 0 ? _c : 30,
27
+ bufferSize: (_d = options === null || options === void 0 ? void 0 : options.bufferSize) !== null && _d !== void 0 ? _d : 10,
28
+ maxWaitMs: (_e = options === null || options === void 0 ? void 0 : options.maxWaitMs) !== null && _e !== void 0 ? _e : 300,
29
+ useBuffer: (_f = options === null || options === void 0 ? void 0 : options.useBuffer) !== null && _f !== void 0 ? _f : true,
30
+ };
31
+ }
32
+ /**
33
+ * add token to buffer
34
+ */
35
+ add(token) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ if (!this.options.useBuffer) {
38
+ yield this.flushCallback(token);
39
+ return;
40
+ }
41
+ this.tokens.push(token);
42
+ if (this.options.flushStrategy === 'size') {
43
+ // size 전략: 개수 도달하면 flush, 아니면 최대 대기시간 타이머
44
+ if (this.tokens.length >= this.options.bufferSize) {
45
+ yield this.flush();
46
+ }
47
+ else {
48
+ this.scheduleMaxWaitFlush();
49
+ }
50
+ }
51
+ else {
52
+ // time 전략: 일정 개수 되면 강제 flush, 아니면 시간 타이머
53
+ if (this.tokens.length >= this.options.maxTokensForTime) {
54
+ yield this.flush();
55
+ }
56
+ else {
57
+ this.scheduleTimeFlush();
58
+ }
59
+ }
60
+ });
61
+ }
62
+ /**
63
+ * flush all buffered tokens
64
+ */
65
+ flush() {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ if (this.isProcessing || this.tokens.length === 0)
68
+ return;
69
+ this.isProcessing = true;
70
+ this.clearTimer();
71
+ const content = this.tokens.join('');
72
+ this.tokens = [];
73
+ try {
74
+ yield this.flushCallback(content);
75
+ }
76
+ finally {
77
+ this.isProcessing = false;
78
+ }
79
+ });
80
+ }
81
+ /**
82
+ * close buffer and flush remaining tokens
83
+ */
84
+ close() {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ yield this.flush();
87
+ this.clearTimer();
88
+ });
89
+ }
90
+ scheduleTimeFlush() {
91
+ if (this.timer)
92
+ return;
93
+ this.timer = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
94
+ yield this.flush();
95
+ }), this.options.bufferMs);
96
+ }
97
+ scheduleMaxWaitFlush() {
98
+ if (this.timer)
99
+ return;
100
+ this.timer = setTimeout(() => __awaiter(this, void 0, void 0, function* () {
101
+ yield this.flush();
102
+ }), this.options.maxWaitMs);
103
+ }
104
+ clearTimer() {
105
+ if (this.timer) {
106
+ clearTimeout(this.timer);
107
+ this.timer = undefined;
108
+ }
109
+ }
110
+ }
111
+ exports.TokenBuffer = TokenBuffer;
112
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/buffer/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `buffer/index.ts`
3
+ * - Public exports for token, stream, and network buffering utilities.
4
+ *
5
+ * @origin eureka-agents-api / src/lib/buffer/index.ts
6
+ */
7
+ export * from './token.js';
8
+ export * from './stream.js';
9
+ export * from './network.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/buffer/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,163 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __rest = (this && this.__rest) || function (s, e) {
11
+ var t = {};
12
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
13
+ t[p] = s[p];
14
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
15
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
16
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
17
+ t[p[i]] = s[p[i]];
18
+ }
19
+ return t;
20
+ };
21
+ /**
22
+ * `buffer/network.ts`
23
+ * - Network transport adapters and diagnostics for GenAI stream events.
24
+ *
25
+ * @origin eureka-agents-api / src/lib/buffer/network.ts
26
+ *
27
+ * GenAIStreamConsumer emits typed events, while NetworkSupportable only accepts
28
+ * raw strings and may enforce a packet-size limit. This adapter keeps those
29
+ * concerns separate by sending stream events through JSONTransport.
30
+ */
31
+ import { calculateJSONTransportChunkBytes, createJSONTransport, } from '../socket/transport.js';
32
+ // eslint-disable-next-line prettier/prettier
33
+ const STREAM_EVENT_SPLIT_PATHS = ['/event/data', '/event/chunks/*/data', '/event/error/message', '/event/error/stack'];
34
+ export const asGenAIStreamNetworkTransportOptions = (options) => {
35
+ var _a, _b, _c;
36
+ const jsonTransport = (_a = options === null || options === void 0 ? void 0 : options.jsonTransport) !== null && _a !== void 0 ? _a : {};
37
+ const chunkBytes = (_b = jsonTransport.chunkBytes) !== null && _b !== void 0 ? _b : ((options === null || options === void 0 ? void 0 : options.maxPacketBytes)
38
+ ? calculateJSONTransportChunkBytes(options.maxPacketBytes, jsonTransport.envelopeReserveBytes)
39
+ : undefined);
40
+ return Object.assign(Object.assign({}, jsonTransport), { chunkBytes,
41
+ // eslint-disable-next-line prettier/prettier
42
+ preferredSplitPaths: [...STREAM_EVENT_SPLIT_PATHS, ...((_c = jsonTransport.preferredSplitPaths) !== null && _c !== void 0 ? _c : [])] });
43
+ };
44
+ /**
45
+ * Create a GenAIStreamConsumer that serializes stream events and sends them over
46
+ * NetworkSupportable via JSONTransport.
47
+ *
48
+ * The returned consumer preserves the normal GenAIStreamConsumer contract. The
49
+ * only network-specific behavior is packet wrapping, optional flush compaction,
50
+ * and JSONTransport splitting for large string payloads.
51
+ */
52
+ export const createGenAIStreamNetworkConsumer = (network, options) => {
53
+ var _a;
54
+ const transport = createJSONTransport(network, asGenAIStreamNetworkTransportOptions(options));
55
+ const waitReady = (_a = options === null || options === void 0 ? void 0 : options.waitReady) !== null && _a !== void 0 ? _a : true;
56
+ let seq = 0;
57
+ const consumer = (event) => __awaiter(void 0, void 0, void 0, function* () {
58
+ if (waitReady && network.ready)
59
+ yield network.ready();
60
+ const compacted = (options === null || options === void 0 ? void 0 : options.compactFlush) ? compactStreamEvent(event) : { event };
61
+ transport.send(Object.assign({ type: 'genai:stream', sid: options === null || options === void 0 ? void 0 : options.streamId, seq: seq++, sentAt: Date.now() }, compacted));
62
+ });
63
+ return {
64
+ consumer,
65
+ transport,
66
+ detach: () => transport.detach(),
67
+ };
68
+ };
69
+ /**
70
+ * Receive GenAI stream event packets from a NetworkSupportable and forward the
71
+ * rebuilt events to a GenAIStreamConsumer.
72
+ *
73
+ * When reorder is enabled, packets are held until their seq number can be
74
+ * delivered contiguously. This is intentionally stream-local; callers should set
75
+ * streamId when multiplexing multiple streams over one network. On the wire,
76
+ * that stream id is carried as the compact `sid` field.
77
+ */
78
+ export const createGenAIStreamNetworkReceiver = (network, consumer, options) => {
79
+ const transport = createJSONTransport(network, asGenAIStreamNetworkTransportOptions(options));
80
+ // Reordering is deliberately simple: it waits for contiguous seq numbers
81
+ // from zero. A higher-level timeout policy should own missing packets.
82
+ let nextSeq = 0;
83
+ const pending = new Map();
84
+ const deliver = (packet) => {
85
+ const event = restoreStreamEvent(packet);
86
+ void Promise.resolve(consumer(event)).catch(error => {
87
+ var _a;
88
+ (_a = options === null || options === void 0 ? void 0 : options.onConsumerError) === null || _a === void 0 ? void 0 : _a.call(options, error, { scope: 'genai.stream.consumer', network });
89
+ });
90
+ };
91
+ const accept = (packet) => {
92
+ var _a;
93
+ (_a = options === null || options === void 0 ? void 0 : options.onPacket) === null || _a === void 0 ? void 0 : _a.call(options, packet);
94
+ if (!(options === null || options === void 0 ? void 0 : options.reorder)) {
95
+ deliver(packet);
96
+ return;
97
+ }
98
+ pending.set(packet.seq, packet);
99
+ while (pending.has(nextSeq)) {
100
+ const ordered = pending.get(nextSeq);
101
+ pending.delete(nextSeq++);
102
+ deliver(ordered);
103
+ }
104
+ };
105
+ transport.onMessage(packet => {
106
+ if ((packet === null || packet === void 0 ? void 0 : packet.type) !== 'genai:stream')
107
+ return;
108
+ if ((options === null || options === void 0 ? void 0 : options.streamId) && packet.sid !== options.streamId)
109
+ return;
110
+ accept(packet);
111
+ });
112
+ return {
113
+ transport,
114
+ detach: () => transport.detach(),
115
+ };
116
+ };
117
+ /** subscribe to JSONTransport/network errors from a stream network handle */
118
+ export const onGenAIStreamNetworkError = (handle, handler) => handle.transport.onError(handler);
119
+ export const compactStreamEvent = (event) => {
120
+ if (event.type !== 'flush' || !canCompactFlushEvent(event))
121
+ return { event };
122
+ return {
123
+ event: Object.assign(Object.assign({}, event), { chunks: event.chunks.map(chunk => {
124
+ const { data: _data } = chunk, rest = __rest(chunk, ["data"]);
125
+ return rest;
126
+ }) }),
127
+ compact: { flushChunksData: 'fromFlushData' },
128
+ };
129
+ };
130
+ /**
131
+ * Restore a network packet into the public GenAIStreamEvent shape expected by
132
+ * downstream consumers.
133
+ */
134
+ export const restoreStreamEvent = (packet) => {
135
+ var _a;
136
+ const event = packet.event;
137
+ if (event.type !== 'flush' || ((_a = packet.compact) === null || _a === void 0 ? void 0 : _a.flushChunksData) !== 'fromFlushData')
138
+ return event;
139
+ let offset = 0;
140
+ return Object.assign(Object.assign({}, event), { chunks: event.chunks.map(chunk => {
141
+ var _a;
142
+ const chars = (_a = chunk.chars) !== null && _a !== void 0 ? _a : 0;
143
+ const data = event.data.substring(offset, offset + chars);
144
+ offset += chars;
145
+ return Object.assign(Object.assign({}, chunk), { data });
146
+ }) });
147
+ };
148
+ /**
149
+ * Flush events normally carry both joined data and per-chunk data. Compacting is
150
+ * safe only when chunk data is exactly contiguous within flush.data.
151
+ */
152
+ const canCompactFlushEvent = (event) => {
153
+ var _a;
154
+ let offset = 0;
155
+ for (const chunk of event.chunks) {
156
+ const chars = (_a = chunk.chars) !== null && _a !== void 0 ? _a : chunk.data.length;
157
+ if (event.data.substring(offset, offset + chars) !== chunk.data)
158
+ return false;
159
+ offset += chars;
160
+ }
161
+ return offset === event.data.length;
162
+ };
163
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/buffer/network.ts"],"names":[],"mappings":"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"}