@providerprotocol/ai 0.0.34 → 0.0.36

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 (136) hide show
  1. package/README.md +546 -3
  2. package/dist/anthropic/index.d.ts +2 -1
  3. package/dist/anthropic/index.js +151 -145
  4. package/dist/anthropic/index.js.map +1 -1
  5. package/dist/cerebras/index.d.ts +392 -0
  6. package/dist/cerebras/index.js +648 -0
  7. package/dist/cerebras/index.js.map +1 -0
  8. package/dist/chunk-2YXFLRQ6.js +49 -0
  9. package/dist/chunk-2YXFLRQ6.js.map +1 -0
  10. package/dist/chunk-4OGB7JZA.js +157 -0
  11. package/dist/chunk-4OGB7JZA.js.map +1 -0
  12. package/dist/chunk-4RX4VQCB.js +31 -0
  13. package/dist/chunk-4RX4VQCB.js.map +1 -0
  14. package/dist/chunk-5IWHCXKN.js +30 -0
  15. package/dist/chunk-5IWHCXKN.js.map +1 -0
  16. package/dist/{chunk-3C7O2RNO.js → chunk-A2IM7PGT.js} +6 -4
  17. package/dist/{chunk-3C7O2RNO.js.map → chunk-A2IM7PGT.js.map} +1 -1
  18. package/dist/{chunk-3D6XGGVG.js → chunk-ARVM24K2.js} +2 -2
  19. package/dist/{chunk-4J6OFUKX.js → chunk-AY55T37A.js} +70 -162
  20. package/dist/chunk-AY55T37A.js.map +1 -0
  21. package/dist/{chunk-ILR2D5PN.js → chunk-BRP5XJ6Q.js} +2 -86
  22. package/dist/chunk-BRP5XJ6Q.js.map +1 -0
  23. package/dist/chunk-C4JP64VW.js +298 -0
  24. package/dist/chunk-C4JP64VW.js.map +1 -0
  25. package/dist/chunk-COS4ON4G.js +111 -0
  26. package/dist/chunk-COS4ON4G.js.map +1 -0
  27. package/dist/chunk-CRP6Y7NF.js +31 -0
  28. package/dist/chunk-CRP6Y7NF.js.map +1 -0
  29. package/dist/chunk-EPB3GQNL.js +118 -0
  30. package/dist/chunk-EPB3GQNL.js.map +1 -0
  31. package/dist/chunk-ETBFOLQN.js +34 -0
  32. package/dist/chunk-ETBFOLQN.js.map +1 -0
  33. package/dist/chunk-I53CI6ZZ.js +142 -0
  34. package/dist/chunk-I53CI6ZZ.js.map +1 -0
  35. package/dist/chunk-IDZOVWP3.js +29 -0
  36. package/dist/chunk-IDZOVWP3.js.map +1 -0
  37. package/dist/chunk-JA3UZALR.js +88 -0
  38. package/dist/chunk-JA3UZALR.js.map +1 -0
  39. package/dist/{chunk-WAKD3OO5.js → chunk-N5DX5JW3.js} +31 -31
  40. package/dist/chunk-N5DX5JW3.js.map +1 -0
  41. package/dist/chunk-OIEWDFQU.js +97 -0
  42. package/dist/chunk-OIEWDFQU.js.map +1 -0
  43. package/dist/{chunk-TOJCZMVU.js → chunk-PMK5LZ5Z.js} +40 -40
  44. package/dist/chunk-PMK5LZ5Z.js.map +1 -0
  45. package/dist/{chunk-6S222DHN.js → chunk-RJGTRQ47.js} +20 -1
  46. package/dist/chunk-RJGTRQ47.js.map +1 -0
  47. package/dist/chunk-UFFJDYCE.js +94 -0
  48. package/dist/chunk-UFFJDYCE.js.map +1 -0
  49. package/dist/chunk-VGKZIGVI.js +222 -0
  50. package/dist/chunk-VGKZIGVI.js.map +1 -0
  51. package/dist/{chunk-KUPF5KHT.js → chunk-Y5H7C5J4.js} +2 -2
  52. package/dist/{embedding-D2BYIehX.d.ts → embedding-BXA72PlJ.d.ts} +1 -1
  53. package/dist/google/index.d.ts +2 -1
  54. package/dist/google/index.js +202 -199
  55. package/dist/google/index.js.map +1 -1
  56. package/dist/groq/index.d.ts +410 -0
  57. package/dist/groq/index.js +649 -0
  58. package/dist/groq/index.js.map +1 -0
  59. package/dist/http/index.d.ts +3 -2
  60. package/dist/http/index.js +5 -4
  61. package/dist/image-stream-CCgwB7ve.d.ts +11 -0
  62. package/dist/index.d.ts +8 -118
  63. package/dist/index.js +520 -769
  64. package/dist/index.js.map +1 -1
  65. package/dist/{llm-BQJZj3cD.d.ts → llm-ByUFPcFH.d.ts} +12 -1632
  66. package/dist/middleware/logging/index.d.ts +76 -0
  67. package/dist/middleware/logging/index.js +74 -0
  68. package/dist/middleware/logging/index.js.map +1 -0
  69. package/dist/middleware/parsed-object/index.d.ts +45 -0
  70. package/dist/middleware/parsed-object/index.js +73 -0
  71. package/dist/middleware/parsed-object/index.js.map +1 -0
  72. package/dist/middleware/pubsub/index.d.ts +97 -0
  73. package/dist/middleware/pubsub/index.js +160 -0
  74. package/dist/middleware/pubsub/index.js.map +1 -0
  75. package/dist/middleware/pubsub/server/express/index.d.ts +66 -0
  76. package/dist/middleware/pubsub/server/express/index.js +11 -0
  77. package/dist/middleware/pubsub/server/express/index.js.map +1 -0
  78. package/dist/middleware/pubsub/server/fastify/index.d.ts +67 -0
  79. package/dist/middleware/pubsub/server/fastify/index.js +11 -0
  80. package/dist/middleware/pubsub/server/fastify/index.js.map +1 -0
  81. package/dist/middleware/pubsub/server/h3/index.d.ts +70 -0
  82. package/dist/middleware/pubsub/server/h3/index.js +11 -0
  83. package/dist/middleware/pubsub/server/h3/index.js.map +1 -0
  84. package/dist/middleware/pubsub/server/index.d.ts +78 -0
  85. package/dist/middleware/pubsub/server/index.js +34 -0
  86. package/dist/middleware/pubsub/server/index.js.map +1 -0
  87. package/dist/middleware/pubsub/server/webapi/index.d.ts +63 -0
  88. package/dist/middleware/pubsub/server/webapi/index.js +11 -0
  89. package/dist/middleware/pubsub/server/webapi/index.js.map +1 -0
  90. package/dist/ollama/index.d.ts +2 -1
  91. package/dist/ollama/index.js +48 -45
  92. package/dist/ollama/index.js.map +1 -1
  93. package/dist/openai/index.d.ts +2 -1
  94. package/dist/openai/index.js +319 -313
  95. package/dist/openai/index.js.map +1 -1
  96. package/dist/openrouter/index.d.ts +2 -1
  97. package/dist/openrouter/index.js +381 -385
  98. package/dist/openrouter/index.js.map +1 -1
  99. package/dist/proxy/index.d.ts +10 -914
  100. package/dist/proxy/index.js +275 -1007
  101. package/dist/proxy/index.js.map +1 -1
  102. package/dist/proxy/server/express/index.d.ts +161 -0
  103. package/dist/proxy/server/express/index.js +24 -0
  104. package/dist/proxy/server/express/index.js.map +1 -0
  105. package/dist/proxy/server/fastify/index.d.ts +162 -0
  106. package/dist/proxy/server/fastify/index.js +24 -0
  107. package/dist/proxy/server/fastify/index.js.map +1 -0
  108. package/dist/proxy/server/h3/index.d.ts +189 -0
  109. package/dist/proxy/server/h3/index.js +28 -0
  110. package/dist/proxy/server/h3/index.js.map +1 -0
  111. package/dist/proxy/server/index.d.ts +151 -0
  112. package/dist/proxy/server/index.js +48 -0
  113. package/dist/proxy/server/index.js.map +1 -0
  114. package/dist/proxy/server/webapi/index.d.ts +278 -0
  115. package/dist/proxy/server/webapi/index.js +32 -0
  116. package/dist/proxy/server/webapi/index.js.map +1 -0
  117. package/dist/responses/index.d.ts +650 -0
  118. package/dist/responses/index.js +930 -0
  119. package/dist/responses/index.js.map +1 -0
  120. package/dist/{retry-8Ch-WWgX.d.ts → retry-BDMo4AVu.d.ts} +1 -1
  121. package/dist/stream-S7nwQRqM.d.ts +1643 -0
  122. package/dist/types-CE4B7pno.d.ts +96 -0
  123. package/dist/utils/index.d.ts +53 -0
  124. package/dist/utils/index.js +7 -0
  125. package/dist/utils/index.js.map +1 -0
  126. package/dist/xai/index.d.ts +2 -1
  127. package/dist/xai/index.js +310 -310
  128. package/dist/xai/index.js.map +1 -1
  129. package/package.json +82 -4
  130. package/dist/chunk-4J6OFUKX.js.map +0 -1
  131. package/dist/chunk-6S222DHN.js.map +0 -1
  132. package/dist/chunk-ILR2D5PN.js.map +0 -1
  133. package/dist/chunk-TOJCZMVU.js.map +0 -1
  134. package/dist/chunk-WAKD3OO5.js.map +0 -1
  135. /package/dist/{chunk-3D6XGGVG.js.map → chunk-ARVM24K2.js.map} +0 -0
  136. /package/dist/{chunk-KUPF5KHT.js.map → chunk-Y5H7C5J4.js.map} +0 -0
@@ -0,0 +1,298 @@
1
+ import {
2
+ deserializeStreamEvent,
3
+ serializeStreamEvent
4
+ } from "./chunk-ETBFOLQN.js";
5
+ import {
6
+ Image
7
+ } from "./chunk-N5DX5JW3.js";
8
+ import {
9
+ AssistantMessage,
10
+ ToolResultMessage,
11
+ UserMessage
12
+ } from "./chunk-BRP5XJ6Q.js";
13
+ import {
14
+ ErrorCode,
15
+ ModalityType,
16
+ UPPError
17
+ } from "./chunk-COS4ON4G.js";
18
+
19
+ // src/providers/proxy/serialization.ts
20
+ function serializeMessage(m) {
21
+ const base = {
22
+ id: m.id,
23
+ type: m.type,
24
+ content: [],
25
+ metadata: m.metadata,
26
+ timestamp: m.timestamp.toISOString()
27
+ };
28
+ if (m instanceof UserMessage) {
29
+ base.content = m.content;
30
+ } else if (m instanceof AssistantMessage) {
31
+ base.content = m.content;
32
+ base.toolCalls = m.toolCalls;
33
+ } else if (m instanceof ToolResultMessage) {
34
+ base.results = m.results;
35
+ }
36
+ return base;
37
+ }
38
+ function deserializeMessage(json) {
39
+ const options = {
40
+ id: json.id,
41
+ metadata: json.metadata
42
+ };
43
+ switch (json.type) {
44
+ case "user":
45
+ return new UserMessage(json.content, options);
46
+ case "assistant":
47
+ return new AssistantMessage(
48
+ json.content,
49
+ json.toolCalls,
50
+ options
51
+ );
52
+ case "tool_result":
53
+ return new ToolResultMessage(json.results ?? [], options);
54
+ default:
55
+ throw new UPPError(
56
+ `Unknown message type: ${json.type}`,
57
+ ErrorCode.InvalidResponse,
58
+ "proxy",
59
+ ModalityType.LLM
60
+ );
61
+ }
62
+ }
63
+ function serializeTurn(turn) {
64
+ return {
65
+ messages: turn.messages.map(serializeMessage),
66
+ toolExecutions: turn.toolExecutions,
67
+ usage: turn.usage,
68
+ cycles: turn.cycles,
69
+ data: turn.data
70
+ };
71
+ }
72
+ function serializeStreamEvent2(event) {
73
+ return serializeStreamEvent(event);
74
+ }
75
+ function deserializeStreamEvent2(event) {
76
+ return deserializeStreamEvent(event);
77
+ }
78
+
79
+ // src/providers/proxy/serialization.media.ts
80
+ function bytesToBase64(bytes) {
81
+ const binary = Array.from(bytes).map((b) => String.fromCharCode(b)).join("");
82
+ return btoa(binary);
83
+ }
84
+ function base64ToBytes(base64) {
85
+ const binaryString = atob(base64);
86
+ return Uint8Array.from(binaryString, (c) => c.charCodeAt(0));
87
+ }
88
+ function coerceBytes(data) {
89
+ if (typeof data === "string") {
90
+ return base64ToBytes(data);
91
+ }
92
+ return Uint8Array.from(data);
93
+ }
94
+ function isImageSource(value) {
95
+ if (!value || typeof value !== "object") {
96
+ return false;
97
+ }
98
+ const source = value;
99
+ if (source.type === "base64") {
100
+ return typeof source.data === "string";
101
+ }
102
+ if (source.type === "url") {
103
+ return typeof source.url === "string";
104
+ }
105
+ if (source.type === "bytes") {
106
+ return source.data instanceof Uint8Array || Array.isArray(source.data) || typeof source.data === "string";
107
+ }
108
+ return false;
109
+ }
110
+ function serializeImageSource(source) {
111
+ if (source.type === "base64") {
112
+ return { type: "base64", data: source.data };
113
+ }
114
+ if (source.type === "url") {
115
+ return { type: "url", url: source.url };
116
+ }
117
+ if (typeof source.data === "string") {
118
+ return { type: "base64", data: source.data };
119
+ }
120
+ if (source.data instanceof Uint8Array) {
121
+ return { type: "base64", data: bytesToBase64(source.data) };
122
+ }
123
+ return { type: "base64", data: bytesToBase64(Uint8Array.from(source.data)) };
124
+ }
125
+ function deserializeImageSource(source) {
126
+ if (source.type === "base64") {
127
+ return { type: "base64", data: source.data };
128
+ }
129
+ if (source.type === "url") {
130
+ return { type: "url", url: source.url };
131
+ }
132
+ return { type: "bytes", data: coerceBytes(source.data) };
133
+ }
134
+ function serializeImage(image) {
135
+ const block = image.toBlock();
136
+ return {
137
+ source: serializeImageSource(block.source),
138
+ mimeType: block.mimeType,
139
+ width: block.width,
140
+ height: block.height
141
+ };
142
+ }
143
+ function serializeUnknownImageSource(source, mimeType) {
144
+ if (source instanceof Image) {
145
+ return serializeImage(source).source;
146
+ }
147
+ if (isImageSource(source)) {
148
+ return serializeImageSource(source);
149
+ }
150
+ if (typeof source === "string") {
151
+ return { type: "base64", data: source };
152
+ }
153
+ throw new UPPError(
154
+ `Unsupported image source for ${mimeType}`,
155
+ ErrorCode.InvalidRequest,
156
+ "proxy",
157
+ ModalityType.Embedding
158
+ );
159
+ }
160
+ function serializeEmbeddingInput(input) {
161
+ if (typeof input === "string") {
162
+ return input;
163
+ }
164
+ if (input.type === "text") {
165
+ return { type: "text", text: input.text };
166
+ }
167
+ if (input.type === "image") {
168
+ const source = serializeUnknownImageSource(input.source, input.mimeType);
169
+ return { type: "image", source, mimeType: input.mimeType };
170
+ }
171
+ throw new UPPError(
172
+ "Unsupported embedding input type",
173
+ ErrorCode.InvalidRequest,
174
+ "proxy",
175
+ ModalityType.Embedding
176
+ );
177
+ }
178
+ function deserializeEmbeddingInput(input) {
179
+ if (typeof input === "string") {
180
+ return input;
181
+ }
182
+ if (input.type === "text") {
183
+ return { type: "text", text: input.text };
184
+ }
185
+ if (input.type === "image") {
186
+ return {
187
+ type: "image",
188
+ mimeType: input.mimeType,
189
+ source: deserializeImageSource(input.source)
190
+ };
191
+ }
192
+ throw new UPPError(
193
+ "Unsupported embedding input type",
194
+ ErrorCode.InvalidResponse,
195
+ "proxy",
196
+ ModalityType.Embedding
197
+ );
198
+ }
199
+ function deserializeImage(image) {
200
+ const block = {
201
+ type: "image",
202
+ source: deserializeImageSource(image.source),
203
+ mimeType: image.mimeType,
204
+ width: image.width,
205
+ height: image.height
206
+ };
207
+ return Image.fromBlock(block);
208
+ }
209
+ function serializeGeneratedImage(image) {
210
+ return {
211
+ image: serializeImage(image.image),
212
+ metadata: image.metadata
213
+ };
214
+ }
215
+ function deserializeGeneratedImage(image) {
216
+ return {
217
+ image: deserializeImage(image.image),
218
+ metadata: image.metadata
219
+ };
220
+ }
221
+ function serializeImageResult(result) {
222
+ return {
223
+ images: result.images.map(serializeGeneratedImage),
224
+ metadata: result.metadata,
225
+ usage: result.usage
226
+ };
227
+ }
228
+ function deserializeImageResponse(response) {
229
+ if (!response || typeof response !== "object" || !Array.isArray(response.images)) {
230
+ throw new UPPError(
231
+ "Invalid image response",
232
+ ErrorCode.InvalidResponse,
233
+ "proxy",
234
+ ModalityType.Image
235
+ );
236
+ }
237
+ return {
238
+ images: response.images.map(deserializeGeneratedImage),
239
+ metadata: response.metadata,
240
+ usage: response.usage
241
+ };
242
+ }
243
+ function serializeImageStreamEvent(event) {
244
+ if (event.type === "preview") {
245
+ return {
246
+ type: "preview",
247
+ index: event.index,
248
+ image: serializeImage(event.image),
249
+ metadata: event.metadata
250
+ };
251
+ }
252
+ return {
253
+ type: "complete",
254
+ index: event.index,
255
+ image: serializeGeneratedImage(event.image)
256
+ };
257
+ }
258
+ function deserializeImageStreamEvent(event) {
259
+ if (event.type === "preview") {
260
+ return {
261
+ type: "preview",
262
+ index: event.index,
263
+ image: deserializeImage(event.image),
264
+ metadata: event.metadata
265
+ };
266
+ }
267
+ return {
268
+ type: "complete",
269
+ index: event.index,
270
+ image: deserializeGeneratedImage(event.image)
271
+ };
272
+ }
273
+
274
+ // src/providers/proxy/server/image-stream.ts
275
+ function resolveImageResult(stream) {
276
+ if ("result" in stream) {
277
+ return stream.result;
278
+ }
279
+ return stream.response;
280
+ }
281
+
282
+ export {
283
+ serializeMessage,
284
+ deserializeMessage,
285
+ serializeTurn,
286
+ serializeStreamEvent2 as serializeStreamEvent,
287
+ deserializeStreamEvent2 as deserializeStreamEvent,
288
+ serializeImage,
289
+ serializeEmbeddingInput,
290
+ deserializeEmbeddingInput,
291
+ deserializeImage,
292
+ serializeImageResult,
293
+ deserializeImageResponse,
294
+ serializeImageStreamEvent,
295
+ deserializeImageStreamEvent,
296
+ resolveImageResult
297
+ };
298
+ //# sourceMappingURL=chunk-C4JP64VW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/proxy/serialization.ts","../src/providers/proxy/serialization.media.ts","../src/providers/proxy/server/image-stream.ts"],"sourcesContent":["/**\n * @fileoverview Serialization utilities for proxy transport.\n *\n * Handles converting PP types to/from JSON for HTTP transport.\n * These are pure functions with no side effects.\n *\n * @module providers/proxy/serialization\n */\n\nimport {\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n type Message,\n type MessageJSON,\n} from '../../types/messages.ts';\nimport type { UserContent, AssistantContent } from '../../types/content.ts';\nimport type { StreamEvent } from '../../types/stream.ts';\nimport type { Turn, TurnJSON } from '../../types/turn.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\nimport {\n serializeStreamEvent as serializeStreamEventShared,\n deserializeStreamEvent as deserializeStreamEventShared,\n} from '../../stream/serialization.ts';\n\n/**\n * Convert a Message to MessageJSON format.\n */\nexport function serializeMessage(m: Message): MessageJSON {\n const base: MessageJSON = {\n id: m.id,\n type: m.type,\n content: [],\n metadata: m.metadata,\n timestamp: m.timestamp.toISOString(),\n };\n\n if (m instanceof UserMessage) {\n base.content = m.content;\n } else if (m instanceof AssistantMessage) {\n base.content = m.content;\n base.toolCalls = m.toolCalls;\n } else if (m instanceof ToolResultMessage) {\n base.results = m.results;\n }\n\n return base;\n}\n\n/**\n * Reconstruct a Message from MessageJSON format.\n */\nexport function deserializeMessage(json: MessageJSON): Message {\n const options = {\n id: json.id,\n metadata: json.metadata,\n };\n\n switch (json.type) {\n case 'user':\n return new UserMessage(json.content as UserContent[], options);\n case 'assistant':\n return new AssistantMessage(\n json.content as AssistantContent[],\n json.toolCalls,\n options\n );\n case 'tool_result':\n return new ToolResultMessage(json.results ?? [], options);\n default:\n throw new UPPError(\n `Unknown message type: ${json.type}`,\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.LLM\n );\n }\n}\n\n/**\n * Serialize a Turn to JSON-transportable format.\n */\nexport function serializeTurn(turn: Turn): TurnJSON {\n return {\n messages: turn.messages.map(serializeMessage),\n toolExecutions: turn.toolExecutions,\n usage: turn.usage,\n cycles: turn.cycles,\n data: turn.data,\n };\n}\n\n/**\n * Serialize a StreamEvent for JSON transport.\n * Converts Uint8Array data to base64 string.\n */\nexport function serializeStreamEvent(event: StreamEvent): StreamEvent {\n return serializeStreamEventShared(event);\n}\n\n/**\n * Deserialize a StreamEvent from JSON transport.\n * Converts base64 string data back to Uint8Array.\n */\nexport function deserializeStreamEvent(event: StreamEvent): StreamEvent {\n return deserializeStreamEventShared(event);\n}\n","/**\n * @fileoverview Media serialization utilities for proxy transport.\n *\n * Handles converting embedding inputs and image results/events to/from JSON\n * for HTTP transport. These are pure functions with no side effects.\n *\n * @module providers/proxy/serialization.media\n */\n\nimport type { ImageSource, ImageBlock } from '../../types/content.ts';\nimport type { EmbeddingInput } from '../../types/provider.ts';\nimport type {\n ImageStreamEvent,\n GeneratedImage,\n ImageResponse,\n ImageResult,\n ImageUsage,\n} from '../../types/image.ts';\nimport { Image } from '../../core/media/Image.ts';\nimport { UPPError, ErrorCode, ModalityType } from '../../types/errors.ts';\n\nexport type SerializedImageSource =\n | { type: 'base64'; data: string }\n | { type: 'url'; url: string }\n | { type: 'bytes'; data: number[] | string };\n\nexport interface SerializedImage {\n source: SerializedImageSource;\n mimeType: string;\n width?: number;\n height?: number;\n}\n\nexport interface SerializedGeneratedImage {\n image: SerializedImage;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SerializedImageResponse {\n images: SerializedGeneratedImage[];\n metadata?: Record<string, unknown>;\n usage?: ImageUsage;\n}\n\nexport type SerializedImageStreamEvent =\n | { type: 'preview'; image: SerializedImage; index: number; metadata?: Record<string, unknown> }\n | { type: 'complete'; image: SerializedGeneratedImage; index: number };\n\nexport type SerializedEmbeddingInput =\n | string\n | { type: 'text'; text: string }\n | { type: 'image'; source: SerializedImageSource; mimeType: string };\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n const binary = Array.from(bytes)\n .map((b) => String.fromCharCode(b))\n .join('');\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n return Uint8Array.from(binaryString, (c) => c.charCodeAt(0));\n}\n\nfunction coerceBytes(data: number[] | string): Uint8Array {\n if (typeof data === 'string') {\n return base64ToBytes(data);\n }\n return Uint8Array.from(data);\n}\n\nfunction isImageSource(value: unknown): value is ImageSource {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const source = value as Record<string, unknown>;\n if (source.type === 'base64') {\n return typeof source.data === 'string';\n }\n if (source.type === 'url') {\n return typeof source.url === 'string';\n }\n if (source.type === 'bytes') {\n return source.data instanceof Uint8Array || Array.isArray(source.data) || typeof source.data === 'string';\n }\n return false;\n}\n\ntype ImageSourceLike = ImageSource | SerializedImageSource;\n\nfunction serializeImageSource(source: ImageSourceLike): SerializedImageSource {\n if (source.type === 'base64') {\n return { type: 'base64', data: source.data };\n }\n if (source.type === 'url') {\n return { type: 'url', url: source.url };\n }\n if (typeof source.data === 'string') {\n return { type: 'base64', data: source.data };\n }\n if (source.data instanceof Uint8Array) {\n return { type: 'base64', data: bytesToBase64(source.data) };\n }\n return { type: 'base64', data: bytesToBase64(Uint8Array.from(source.data)) };\n}\n\nfunction deserializeImageSource(source: SerializedImageSource): ImageSource {\n if (source.type === 'base64') {\n return { type: 'base64', data: source.data };\n }\n if (source.type === 'url') {\n return { type: 'url', url: source.url };\n }\n return { type: 'bytes', data: coerceBytes(source.data) };\n}\n\n/**\n * Serialize an Image for JSON transport.\n */\nexport function serializeImage(image: Image): SerializedImage {\n const block = image.toBlock();\n return {\n source: serializeImageSource(block.source),\n mimeType: block.mimeType,\n width: block.width,\n height: block.height,\n };\n}\n\nfunction serializeUnknownImageSource(\n source: unknown,\n mimeType: string\n): SerializedImageSource {\n if (source instanceof Image) {\n return serializeImage(source).source;\n }\n\n if (isImageSource(source)) {\n return serializeImageSource(source);\n }\n\n if (typeof source === 'string') {\n return { type: 'base64', data: source };\n }\n\n throw new UPPError(\n `Unsupported image source for ${mimeType}`,\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Embedding\n );\n}\n\n/**\n * Serialize an EmbeddingInput for JSON transport.\n */\nexport function serializeEmbeddingInput(input: EmbeddingInput): SerializedEmbeddingInput {\n if (typeof input === 'string') {\n return input;\n }\n\n if (input.type === 'text') {\n return { type: 'text', text: input.text };\n }\n\n if (input.type === 'image') {\n const source = serializeUnknownImageSource(input.source, input.mimeType);\n return { type: 'image', source, mimeType: input.mimeType };\n }\n\n throw new UPPError(\n 'Unsupported embedding input type',\n ErrorCode.InvalidRequest,\n 'proxy',\n ModalityType.Embedding\n );\n}\n\n/**\n * Deserialize an EmbeddingInput from JSON transport.\n */\nexport function deserializeEmbeddingInput(input: SerializedEmbeddingInput): EmbeddingInput {\n if (typeof input === 'string') {\n return input;\n }\n\n if (input.type === 'text') {\n return { type: 'text', text: input.text };\n }\n\n if (input.type === 'image') {\n return {\n type: 'image',\n mimeType: input.mimeType,\n source: deserializeImageSource(input.source),\n };\n }\n\n throw new UPPError(\n 'Unsupported embedding input type',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Embedding\n );\n}\n\n/**\n * Deserialize an Image from JSON transport.\n */\nexport function deserializeImage(image: SerializedImage): Image {\n const block: ImageBlock = {\n type: 'image',\n source: deserializeImageSource(image.source),\n mimeType: image.mimeType,\n width: image.width,\n height: image.height,\n };\n return Image.fromBlock(block);\n}\n\n/**\n * Serialize a GeneratedImage for JSON transport.\n */\nexport function serializeGeneratedImage(image: GeneratedImage): SerializedGeneratedImage {\n return {\n image: serializeImage(image.image),\n metadata: image.metadata,\n };\n}\n\n/**\n * Deserialize a GeneratedImage from JSON transport.\n */\nexport function deserializeGeneratedImage(image: SerializedGeneratedImage): GeneratedImage {\n return {\n image: deserializeImage(image.image),\n metadata: image.metadata,\n };\n}\n\n/**\n * Serialize an ImageResult or ImageResponse for JSON transport.\n */\nexport function serializeImageResult(\n result: ImageResult | ImageResponse\n): SerializedImageResponse {\n return {\n images: result.images.map(serializeGeneratedImage),\n metadata: result.metadata,\n usage: result.usage,\n };\n}\n\n/**\n * Deserialize an ImageResponse from JSON transport.\n */\nexport function deserializeImageResponse(\n response: SerializedImageResponse\n): ImageResponse {\n if (!response || typeof response !== 'object' || !Array.isArray(response.images)) {\n throw new UPPError(\n 'Invalid image response',\n ErrorCode.InvalidResponse,\n 'proxy',\n ModalityType.Image\n );\n }\n\n return {\n images: response.images.map(deserializeGeneratedImage),\n metadata: response.metadata,\n usage: response.usage,\n };\n}\n\n/**\n * Serialize an ImageStreamEvent for JSON transport.\n */\nexport function serializeImageStreamEvent(\n event: ImageStreamEvent\n): SerializedImageStreamEvent {\n if (event.type === 'preview') {\n return {\n type: 'preview',\n index: event.index,\n image: serializeImage(event.image),\n metadata: event.metadata,\n };\n }\n\n return {\n type: 'complete',\n index: event.index,\n image: serializeGeneratedImage(event.image),\n };\n}\n\n/**\n * Deserialize an ImageStreamEvent from JSON transport.\n */\nexport function deserializeImageStreamEvent(\n event: SerializedImageStreamEvent\n): ImageStreamEvent {\n if (event.type === 'preview') {\n return {\n type: 'preview',\n index: event.index,\n image: deserializeImage(event.image),\n metadata: event.metadata,\n };\n }\n\n return {\n type: 'complete',\n index: event.index,\n image: deserializeGeneratedImage(event.image),\n };\n}\n","/**\n * @fileoverview Image stream helpers for proxy server adapters.\n *\n * @module providers/proxy/server/image-stream\n */\n\nimport type {\n ImageStreamResult,\n ImageProviderStreamResult,\n ImageResult,\n} from '../../../types/image.ts';\n\nexport type ImageStreamLike = ImageStreamResult | ImageProviderStreamResult;\n\n/**\n * Resolve the final image result from either core or provider stream types.\n */\nexport function resolveImageResult(stream: ImageStreamLike): Promise<ImageResult> {\n if ('result' in stream) {\n return stream.result;\n }\n return stream.response;\n}\n"],"mappings":"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","names":["serializeStreamEvent","deserializeStreamEvent"]}
@@ -0,0 +1,111 @@
1
+ // src/types/errors.ts
2
+ var ErrorCode = {
3
+ /** API key is invalid or expired */
4
+ AuthenticationFailed: "AUTHENTICATION_FAILED",
5
+ /** Rate limit exceeded, retry after delay */
6
+ RateLimited: "RATE_LIMITED",
7
+ /** Input exceeds model's context window */
8
+ ContextLengthExceeded: "CONTEXT_LENGTH_EXCEEDED",
9
+ /** Requested model does not exist */
10
+ ModelNotFound: "MODEL_NOT_FOUND",
11
+ /** Request parameters are malformed */
12
+ InvalidRequest: "INVALID_REQUEST",
13
+ /** Provider returned an unexpected response format */
14
+ InvalidResponse: "INVALID_RESPONSE",
15
+ /** Content was blocked by safety filters */
16
+ ContentFiltered: "CONTENT_FILTERED",
17
+ /** Account quota or credits exhausted */
18
+ QuotaExceeded: "QUOTA_EXCEEDED",
19
+ /** Provider-specific error not covered by other codes */
20
+ ProviderError: "PROVIDER_ERROR",
21
+ /** Network connectivity issue */
22
+ NetworkError: "NETWORK_ERROR",
23
+ /** Request exceeded timeout limit */
24
+ Timeout: "TIMEOUT",
25
+ /** Request was cancelled via AbortSignal */
26
+ Cancelled: "CANCELLED"
27
+ };
28
+ var ModalityType = {
29
+ /** Large language model for text generation */
30
+ LLM: "llm",
31
+ /** Text/image embedding model */
32
+ Embedding: "embedding",
33
+ /** Image generation model */
34
+ Image: "image",
35
+ /** Audio processing/generation model */
36
+ Audio: "audio",
37
+ /** Video processing/generation model */
38
+ Video: "video"
39
+ };
40
+ var UPPError = class _UPPError extends Error {
41
+ /** Normalized error code for programmatic handling */
42
+ code;
43
+ /** Name of the provider that generated the error */
44
+ provider;
45
+ /** The modality that was being used when the error occurred */
46
+ modality;
47
+ /** HTTP status code from the provider's response, if available */
48
+ statusCode;
49
+ /** The original error that caused this UPPError, if wrapping another error */
50
+ cause;
51
+ /** Error class name, always 'UPPError' */
52
+ name = "UPPError";
53
+ /**
54
+ * Creates a new UPPError instance.
55
+ *
56
+ * @param message - Human-readable error description
57
+ * @param code - Normalized error code for programmatic handling
58
+ * @param provider - Name of the provider that generated the error
59
+ * @param modality - The modality that was being used
60
+ * @param statusCode - HTTP status code from the provider's response
61
+ * @param cause - The original error being wrapped
62
+ */
63
+ constructor(message, code, provider, modality, statusCode, cause) {
64
+ super(message);
65
+ this.code = code;
66
+ this.provider = provider;
67
+ this.modality = modality;
68
+ this.statusCode = statusCode;
69
+ this.cause = cause;
70
+ if (Error.captureStackTrace) {
71
+ Error.captureStackTrace(this, _UPPError);
72
+ }
73
+ }
74
+ /**
75
+ * Creates a string representation of the error.
76
+ *
77
+ * @returns Formatted error string including code, message, provider, and modality
78
+ */
79
+ toString() {
80
+ let str = `UPPError [${this.code}]: ${this.message}`;
81
+ str += ` (provider: ${this.provider}, modality: ${this.modality}`;
82
+ if (this.statusCode) {
83
+ str += `, status: ${this.statusCode}`;
84
+ }
85
+ str += ")";
86
+ return str;
87
+ }
88
+ /**
89
+ * Converts the error to a JSON-serializable object.
90
+ *
91
+ * @returns Plain object representation suitable for logging or transmission
92
+ */
93
+ toJSON() {
94
+ return {
95
+ name: this.name,
96
+ message: this.message,
97
+ code: this.code,
98
+ provider: this.provider,
99
+ modality: this.modality,
100
+ statusCode: this.statusCode,
101
+ cause: this.cause?.message
102
+ };
103
+ }
104
+ };
105
+
106
+ export {
107
+ ErrorCode,
108
+ ModalityType,
109
+ UPPError
110
+ };
111
+ //# sourceMappingURL=chunk-COS4ON4G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/errors.ts"],"sourcesContent":["/**\n * @fileoverview Error types for the Unified Provider Protocol.\n *\n * Provides normalized error codes and a unified error class for handling\n * errors across different AI providers in a consistent manner.\n *\n * @module types/errors\n */\n\n/**\n * Error code constants for cross-provider error handling.\n *\n * Use these constants instead of raw strings for type-safe error handling:\n *\n * @example\n * ```typescript\n * import { ErrorCode } from 'upp';\n *\n * try {\n * await llm.generate('Hello');\n * } catch (error) {\n * if (error instanceof UPPError) {\n * switch (error.code) {\n * case ErrorCode.RateLimited:\n * await delay(error.retryAfter);\n * break;\n * case ErrorCode.AuthenticationFailed:\n * throw new Error('Invalid API key');\n * }\n * }\n * }\n * ```\n */\nexport const ErrorCode = {\n /** API key is invalid or expired */\n AuthenticationFailed: 'AUTHENTICATION_FAILED',\n /** Rate limit exceeded, retry after delay */\n RateLimited: 'RATE_LIMITED',\n /** Input exceeds model's context window */\n ContextLengthExceeded: 'CONTEXT_LENGTH_EXCEEDED',\n /** Requested model does not exist */\n ModelNotFound: 'MODEL_NOT_FOUND',\n /** Request parameters are malformed */\n InvalidRequest: 'INVALID_REQUEST',\n /** Provider returned an unexpected response format */\n InvalidResponse: 'INVALID_RESPONSE',\n /** Content was blocked by safety filters */\n ContentFiltered: 'CONTENT_FILTERED',\n /** Account quota or credits exhausted */\n QuotaExceeded: 'QUOTA_EXCEEDED',\n /** Provider-specific error not covered by other codes */\n ProviderError: 'PROVIDER_ERROR',\n /** Network connectivity issue */\n NetworkError: 'NETWORK_ERROR',\n /** Request exceeded timeout limit */\n Timeout: 'TIMEOUT',\n /** Request was cancelled via AbortSignal */\n Cancelled: 'CANCELLED',\n} as const;\n\n/**\n * Error code discriminator union.\n *\n * This type is derived from {@link ErrorCode} constants. Use `ErrorCode.RateLimited`\n * for constants or `type MyCode = ErrorCode` for type annotations.\n */\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\n/**\n * Modality type constants.\n *\n * Use these constants for type-safe modality handling:\n *\n * @example\n * ```typescript\n * import { ModalityType } from 'upp';\n *\n * if (provider.modality === ModalityType.LLM) {\n * // Handle LLM provider\n * }\n * ```\n */\nexport const ModalityType = {\n /** Large language model for text generation */\n LLM: 'llm',\n /** Text/image embedding model */\n Embedding: 'embedding',\n /** Image generation model */\n Image: 'image',\n /** Audio processing/generation model */\n Audio: 'audio',\n /** Video processing/generation model */\n Video: 'video',\n} as const;\n\n/**\n * Modality type discriminator union.\n *\n * This type is derived from {@link ModalityType} constants. The name `Modality`\n * is kept for backward compatibility; `ModalityType` works as both the const\n * object and this type.\n */\nexport type Modality = (typeof ModalityType)[keyof typeof ModalityType];\n\n/**\n * Type alias for Modality, allowing `ModalityType` to work as both const and type.\n */\nexport type ModalityType = Modality;\n\n/**\n * Unified Provider Protocol Error.\n *\n * All provider-specific errors are normalized to this type, providing\n * a consistent interface for error handling across different AI providers.\n *\n * @example\n * ```typescript\n * import { ErrorCode, ModalityType } from 'upp';\n *\n * throw new UPPError(\n * 'API key is invalid',\n * ErrorCode.AuthenticationFailed,\n * 'openai',\n * ModalityType.LLM,\n * 401\n * );\n * ```\n *\n * @example\n * ```typescript\n * import { ErrorCode, ModalityType } from 'upp';\n *\n * // Wrapping a provider error\n * try {\n * await openai.chat.completions.create({ ... });\n * } catch (err) {\n * throw new UPPError(\n * 'OpenAI request failed',\n * ErrorCode.ProviderError,\n * 'openai',\n * ModalityType.LLM,\n * err.status,\n * err\n * );\n * }\n * ```\n */\nexport class UPPError extends Error {\n /** Normalized error code for programmatic handling */\n readonly code: ErrorCode;\n\n /** Name of the provider that generated the error */\n readonly provider: string;\n\n /** The modality that was being used when the error occurred */\n readonly modality: Modality;\n\n /** HTTP status code from the provider's response, if available */\n readonly statusCode?: number;\n\n /** The original error that caused this UPPError, if wrapping another error */\n override readonly cause?: Error;\n\n /** Error class name, always 'UPPError' */\n override readonly name = 'UPPError';\n\n /**\n * Creates a new UPPError instance.\n *\n * @param message - Human-readable error description\n * @param code - Normalized error code for programmatic handling\n * @param provider - Name of the provider that generated the error\n * @param modality - The modality that was being used\n * @param statusCode - HTTP status code from the provider's response\n * @param cause - The original error being wrapped\n */\n constructor(\n message: string,\n code: ErrorCode,\n provider: string,\n modality: Modality,\n statusCode?: number,\n cause?: Error\n ) {\n super(message);\n this.code = code;\n this.provider = provider;\n this.modality = modality;\n this.statusCode = statusCode;\n this.cause = cause;\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UPPError);\n }\n }\n\n /**\n * Creates a string representation of the error.\n *\n * @returns Formatted error string including code, message, provider, and modality\n */\n override toString(): string {\n let str = `UPPError [${this.code}]: ${this.message}`;\n str += ` (provider: ${this.provider}, modality: ${this.modality}`;\n if (this.statusCode) {\n str += `, status: ${this.statusCode}`;\n }\n str += ')';\n return str;\n }\n\n /**\n * Converts the error to a JSON-serializable object.\n *\n * @returns Plain object representation suitable for logging or transmission\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n provider: this.provider,\n modality: this.modality,\n statusCode: this.statusCode,\n cause: this.cause?.message,\n };\n }\n}\n"],"mappings":";AAiCO,IAAM,YAAY;AAAA;AAAA,EAEvB,sBAAsB;AAAA;AAAA,EAEtB,aAAa;AAAA;AAAA,EAEb,uBAAuB;AAAA;AAAA,EAEvB,eAAe;AAAA;AAAA,EAEf,gBAAgB;AAAA;AAAA,EAEhB,iBAAiB;AAAA;AAAA,EAEjB,iBAAiB;AAAA;AAAA,EAEjB,eAAe;AAAA;AAAA,EAEf,eAAe;AAAA;AAAA,EAEf,cAAc;AAAA;AAAA,EAEd,SAAS;AAAA;AAAA,EAET,WAAW;AACb;AAwBO,IAAM,eAAe;AAAA;AAAA,EAE1B,KAAK;AAAA;AAAA,EAEL,WAAW;AAAA;AAAA,EAEX,OAAO;AAAA;AAAA,EAEP,OAAO;AAAA;AAAA,EAEP,OAAO;AACT;AAsDO,IAAM,WAAN,MAAM,kBAAiB,MAAM;AAAA;AAAA,EAEzB;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGA;AAAA;AAAA,EAGS;AAAA;AAAA,EAGA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYzB,YACE,SACA,MACA,UACA,UACA,YACA,OACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,QAAQ;AAEb,QAAI,MAAM,mBAAmB;AAC3B,YAAM,kBAAkB,MAAM,SAAQ;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOS,WAAmB;AAC1B,QAAI,MAAM,aAAa,KAAK,IAAI,MAAM,KAAK,OAAO;AAClD,WAAO,eAAe,KAAK,QAAQ,eAAe,KAAK,QAAQ;AAC/D,QAAI,KAAK,YAAY;AACnB,aAAO,aAAa,KAAK,UAAU;AAAA,IACrC;AACA,WAAO;AACP,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAkC;AAChC,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,OAAO,KAAK,OAAO;AAAA,IACrB;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,31 @@
1
+ import {
2
+ runSubscriberStream
3
+ } from "./chunk-EPB3GQNL.js";
4
+
5
+ // src/middleware/pubsub/server/fastify.ts
6
+ async function streamSubscriber(streamId, adapter, reply) {
7
+ const res = reply.raw;
8
+ res.setHeader("Content-Type", "text/event-stream");
9
+ res.setHeader("Cache-Control", "no-cache");
10
+ res.setHeader("Connection", "keep-alive");
11
+ const abortController = new AbortController();
12
+ res.on("close", () => abortController.abort());
13
+ await runSubscriberStream(
14
+ streamId,
15
+ adapter,
16
+ {
17
+ write: (data) => res.write(data),
18
+ end: () => res.end()
19
+ },
20
+ { signal: abortController.signal }
21
+ );
22
+ }
23
+ var fastify = {
24
+ streamSubscriber
25
+ };
26
+
27
+ export {
28
+ streamSubscriber,
29
+ fastify
30
+ };
31
+ //# sourceMappingURL=chunk-CRP6Y7NF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/pubsub/server/fastify.ts"],"sourcesContent":["/**\n * @fileoverview Fastify adapter for pub-sub stream resumption.\n *\n * Provides utilities for Fastify servers to handle stream reconnections.\n *\n * @module middleware/pubsub/server/fastify\n */\n\nimport type { PubSubAdapter } from '../types.ts';\nimport { runSubscriberStream } from './shared.ts';\n\n/**\n * Fastify Reply interface (minimal type to avoid dependency).\n */\ninterface FastifyReply {\n raw: {\n setHeader(name: string, value: string): void;\n write(chunk: string): boolean;\n end(): void;\n on(event: 'close', listener: () => void): void;\n };\n}\n\n/**\n * Stream buffered and live events to a Fastify reply.\n *\n * Handles reconnection for Fastify routes:\n * 1. Replays buffered events from the adapter\n * 2. Subscribes to live events until completion signal\n * 3. Ends when stream completes or client disconnects\n *\n * @param streamId - The stream ID to subscribe to\n * @param adapter - The pub-sub adapter instance\n * @param reply - Fastify reply object\n *\n * @example\n * ```typescript\n * import { llm } from '@providerprotocol/ai';\n * import { anthropic } from '@providerprotocol/ai/anthropic';\n * import { pubsubMiddleware, memoryAdapter } from '@providerprotocol/ai/middleware/pubsub';\n * import { fastify as pubsubFastify } from '@providerprotocol/ai/middleware/pubsub/server';\n *\n * const adapter = memoryAdapter();\n *\n * app.post('/api/chat', async (request, reply) => {\n * const { input, conversationId } = request.body as { input: string; conversationId: string };\n *\n * if (!await adapter.exists(conversationId)) {\n * const model = llm({\n * model: anthropic('claude-sonnet-4-20250514'),\n * middleware: [pubsubMiddleware({ adapter, streamId: conversationId })],\n * });\n * model.stream(input).then(turn => saveToDatabase(conversationId, turn));\n * }\n *\n * return pubsubFastify.streamSubscriber(conversationId, adapter, reply);\n * });\n * ```\n */\nexport async function streamSubscriber(\n streamId: string,\n adapter: PubSubAdapter,\n reply: FastifyReply\n): Promise<void> {\n const res = reply.raw;\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n\n const abortController = new AbortController();\n res.on('close', () => abortController.abort());\n\n await runSubscriberStream(\n streamId,\n adapter,\n {\n write: (data: string) => res.write(data),\n end: () => res.end(),\n },\n { signal: abortController.signal }\n );\n}\n\n/**\n * Fastify adapter namespace for pub-sub server utilities.\n */\nexport const fastify = {\n streamSubscriber,\n};\n"],"mappings":";;;;;AA2DA,eAAsB,iBACpB,UACA,SACA,OACe;AACf,QAAM,MAAM,MAAM;AAClB,MAAI,UAAU,gBAAgB,mBAAmB;AACjD,MAAI,UAAU,iBAAiB,UAAU;AACzC,MAAI,UAAU,cAAc,YAAY;AAExC,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,MAAI,GAAG,SAAS,MAAM,gBAAgB,MAAM,CAAC;AAE7C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,CAAC,SAAiB,IAAI,MAAM,IAAI;AAAA,MACvC,KAAK,MAAM,IAAI,IAAI;AAAA,IACrB;AAAA,IACA,EAAE,QAAQ,gBAAgB,OAAO;AAAA,EACnC;AACF;AAKO,IAAM,UAAU;AAAA,EACrB;AACF;","names":[]}
@@ -0,0 +1,118 @@
1
+ import {
2
+ serializeStreamEvent
3
+ } from "./chunk-ETBFOLQN.js";
4
+
5
+ // src/middleware/pubsub/server/shared.ts
6
+ function formatSSE(event) {
7
+ const serialized = serializeStreamEvent(event);
8
+ return `data: ${JSON.stringify(serialized)}
9
+
10
+ `;
11
+ }
12
+ async function runSubscriberStream(streamId, adapter, writer, options = {}) {
13
+ const { signal } = options;
14
+ if (signal?.aborted) {
15
+ writer.end();
16
+ return;
17
+ }
18
+ try {
19
+ if (signal?.aborted) {
20
+ writer.end();
21
+ return;
22
+ }
23
+ const queue = [];
24
+ let resolveWait = null;
25
+ let completed = false;
26
+ let lastSentCursor = -1;
27
+ const onEvent = (event, cursor) => {
28
+ queue.push({ event, cursor: cursor ?? null });
29
+ resolveWait?.();
30
+ };
31
+ const onComplete = () => {
32
+ completed = true;
33
+ resolveWait?.();
34
+ };
35
+ const unsubscribe = adapter.subscribe(streamId, onEvent, onComplete);
36
+ const onAbort = () => {
37
+ completed = true;
38
+ resolveWait?.();
39
+ };
40
+ signal?.addEventListener("abort", onAbort);
41
+ const drainQueue = () => {
42
+ while (queue.length > 0 && !signal?.aborted) {
43
+ const item = queue.shift();
44
+ if (!item) break;
45
+ const { event, cursor } = item;
46
+ if (cursor !== null && cursor <= lastSentCursor) continue;
47
+ writer.write(formatSSE(event));
48
+ if (cursor !== null && cursor > lastSentCursor) {
49
+ lastSentCursor = cursor;
50
+ }
51
+ }
52
+ };
53
+ const dropReplayDuplicates = () => {
54
+ if (queue.length === 0) return;
55
+ const filtered = [];
56
+ for (const item of queue) {
57
+ if (item.cursor !== null && item.cursor <= lastSentCursor) continue;
58
+ filtered.push(item);
59
+ }
60
+ queue.length = 0;
61
+ queue.push(...filtered);
62
+ };
63
+ const waitForSignal = () => new Promise((resolve) => {
64
+ let settled = false;
65
+ const settle = () => {
66
+ if (settled) return;
67
+ settled = true;
68
+ resolveWait = null;
69
+ resolve();
70
+ };
71
+ resolveWait = settle;
72
+ if (completed || signal?.aborted || queue.length > 0) {
73
+ settle();
74
+ }
75
+ });
76
+ try {
77
+ const events = await adapter.getEvents(streamId);
78
+ for (const event of events) {
79
+ if (signal?.aborted) break;
80
+ writer.write(formatSSE(event));
81
+ }
82
+ lastSentCursor = events.length - 1;
83
+ dropReplayDuplicates();
84
+ if (signal?.aborted) {
85
+ writer.end();
86
+ return;
87
+ }
88
+ while (!completed && !signal?.aborted) {
89
+ drainQueue();
90
+ if (completed || signal?.aborted) break;
91
+ await waitForSignal();
92
+ }
93
+ if (!signal?.aborted) {
94
+ drainQueue();
95
+ }
96
+ } finally {
97
+ signal?.removeEventListener("abort", onAbort);
98
+ unsubscribe();
99
+ }
100
+ if (!signal?.aborted) {
101
+ writer.write("data: [DONE]\n\n");
102
+ }
103
+ writer.end();
104
+ } catch (error) {
105
+ if (!signal?.aborted) {
106
+ const errorMsg = error instanceof Error ? error.message : String(error);
107
+ writer.write(`data: ${JSON.stringify({ error: errorMsg })}
108
+
109
+ `);
110
+ }
111
+ writer.end();
112
+ }
113
+ }
114
+
115
+ export {
116
+ runSubscriberStream
117
+ };
118
+ //# sourceMappingURL=chunk-EPB3GQNL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/middleware/pubsub/server/shared.ts"],"sourcesContent":["/**\n * @fileoverview Shared utilities for pub-sub server adapters.\n *\n * @module middleware/pubsub/server/shared\n * @internal\n */\n\nimport type { StreamEvent } from '../../../types/stream.ts';\nimport type { PubSubAdapter } from '../types.ts';\nimport { serializeStreamEvent } from '../../../stream/serialization.ts';\n\n/**\n * Writer interface for abstracting how data is written to responses.\n * @internal\n */\nexport interface StreamWriter {\n write(data: string): void;\n end(): void;\n}\n\n/**\n * Options for runSubscriberStream.\n * @internal\n */\nexport interface StreamOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Formats a stream event as an SSE data line.\n */\nexport function formatSSE(event: StreamEvent): string {\n const serialized = serializeStreamEvent(event);\n return `data: ${JSON.stringify(serialized)}\\n\\n`;\n}\n\n/**\n * Core subscriber stream logic shared across all adapters.\n *\n * Handles:\n * 1. Subscribing to live events and completion signal\n * 2. Replaying buffered events (empty if stream just started)\n * 3. Processing live events until completion signal\n * 4. Final cleanup\n * 5. Client disconnect via AbortSignal\n *\n * @internal\n */\nexport async function runSubscriberStream(\n streamId: string,\n adapter: PubSubAdapter,\n writer: StreamWriter,\n options: StreamOptions = {}\n): Promise<void> {\n const { signal } = options;\n\n if (signal?.aborted) {\n writer.end();\n return;\n }\n\n try {\n if (signal?.aborted) {\n writer.end();\n return;\n }\n\n const queue: Array<{ event: StreamEvent; cursor: number | null }> = [];\n let resolveWait: (() => void) | null = null;\n let completed = false;\n let lastSentCursor = -1;\n\n const onEvent = (event: StreamEvent, cursor?: number): void => {\n queue.push({ event, cursor: cursor ?? null });\n resolveWait?.();\n };\n\n const onComplete = (): void => {\n completed = true;\n resolveWait?.();\n };\n\n const unsubscribe = adapter.subscribe(streamId, onEvent, onComplete);\n\n const onAbort = (): void => {\n completed = true;\n resolveWait?.();\n };\n signal?.addEventListener('abort', onAbort);\n\n const drainQueue = (): void => {\n while (queue.length > 0 && !signal?.aborted) {\n const item = queue.shift();\n if (!item) break;\n const { event, cursor } = item;\n if (cursor !== null && cursor <= lastSentCursor) continue;\n writer.write(formatSSE(event));\n if (cursor !== null && cursor > lastSentCursor) {\n lastSentCursor = cursor;\n }\n }\n };\n\n const dropReplayDuplicates = (): void => {\n if (queue.length === 0) return;\n const filtered: Array<{ event: StreamEvent; cursor: number | null }> = [];\n for (const item of queue) {\n if (item.cursor !== null && item.cursor <= lastSentCursor) continue;\n filtered.push(item);\n }\n queue.length = 0;\n queue.push(...filtered);\n };\n\n const waitForSignal = (): Promise<void> => new Promise((resolve) => {\n let settled = false;\n\n const settle = (): void => {\n if (settled) return;\n settled = true;\n resolveWait = null;\n resolve();\n };\n\n resolveWait = settle;\n\n if (completed || signal?.aborted || queue.length > 0) {\n settle();\n }\n });\n\n try {\n const events = await adapter.getEvents(streamId);\n\n for (const event of events) {\n if (signal?.aborted) break;\n writer.write(formatSSE(event));\n }\n\n lastSentCursor = events.length - 1;\n dropReplayDuplicates();\n\n if (signal?.aborted) {\n writer.end();\n return;\n }\n\n // Wait for events or completion signal\n while (!completed && !signal?.aborted) {\n drainQueue();\n if (completed || signal?.aborted) break;\n await waitForSignal();\n }\n\n if (!signal?.aborted) {\n drainQueue();\n }\n } finally {\n signal?.removeEventListener('abort', onAbort);\n unsubscribe();\n }\n\n if (!signal?.aborted) {\n writer.write('data: [DONE]\\n\\n');\n }\n writer.end();\n } catch (error) {\n if (!signal?.aborted) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n writer.write(`data: ${JSON.stringify({ error: errorMsg })}\\n\\n`);\n }\n writer.end();\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,34 @@
1
+ // src/stream/serialization.ts
2
+ function serializeStreamEvent(event) {
3
+ const delta = event.delta;
4
+ if (delta.data instanceof Uint8Array) {
5
+ const { data, ...rest } = delta;
6
+ const bytes = Array.from(data);
7
+ const base64 = btoa(bytes.map((b) => String.fromCharCode(b)).join(""));
8
+ return {
9
+ type: event.type,
10
+ index: event.index,
11
+ delta: { ...rest, data: base64 }
12
+ };
13
+ }
14
+ return event;
15
+ }
16
+ function deserializeStreamEvent(event) {
17
+ const delta = event.delta;
18
+ if (typeof delta.data === "string") {
19
+ const binaryString = atob(delta.data);
20
+ const bytes = Uint8Array.from(binaryString, (c) => c.charCodeAt(0));
21
+ return {
22
+ type: event.type,
23
+ index: event.index,
24
+ delta: { ...delta, data: bytes }
25
+ };
26
+ }
27
+ return event;
28
+ }
29
+
30
+ export {
31
+ serializeStreamEvent,
32
+ deserializeStreamEvent
33
+ };
34
+ //# sourceMappingURL=chunk-ETBFOLQN.js.map