tywrap 0.2.0 → 0.3.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 (163) hide show
  1. package/README.md +65 -31
  2. package/dist/cli.js +49 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config/index.d.ts +11 -7
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/index.js +43 -7
  7. package/dist/config/index.js.map +1 -1
  8. package/dist/core/analyzer.d.ts +1 -0
  9. package/dist/core/analyzer.d.ts.map +1 -1
  10. package/dist/core/analyzer.js +47 -12
  11. package/dist/core/analyzer.js.map +1 -1
  12. package/dist/core/annotation-parser.d.ts +8 -0
  13. package/dist/core/annotation-parser.d.ts.map +1 -0
  14. package/dist/core/annotation-parser.js +409 -0
  15. package/dist/core/annotation-parser.js.map +1 -0
  16. package/dist/core/discovery.d.ts +1 -0
  17. package/dist/core/discovery.d.ts.map +1 -1
  18. package/dist/core/discovery.js +9 -9
  19. package/dist/core/discovery.js.map +1 -1
  20. package/dist/core/generator.d.ts +9 -1
  21. package/dist/core/generator.d.ts.map +1 -1
  22. package/dist/core/generator.js +738 -104
  23. package/dist/core/generator.js.map +1 -1
  24. package/dist/core/mapper.d.ts +9 -7
  25. package/dist/core/mapper.d.ts.map +1 -1
  26. package/dist/core/mapper.js +129 -44
  27. package/dist/core/mapper.js.map +1 -1
  28. package/dist/index.d.ts +23 -7
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +23 -3
  31. package/dist/index.js.map +1 -1
  32. package/dist/runtime/base.d.ts +17 -7
  33. package/dist/runtime/base.d.ts.map +1 -1
  34. package/dist/runtime/base.js +18 -1
  35. package/dist/runtime/base.js.map +1 -1
  36. package/dist/runtime/bounded-context.d.ts +252 -0
  37. package/dist/runtime/bounded-context.d.ts.map +1 -0
  38. package/dist/runtime/bounded-context.js +454 -0
  39. package/dist/runtime/bounded-context.js.map +1 -0
  40. package/dist/runtime/bridge-core.d.ts +1 -0
  41. package/dist/runtime/bridge-core.d.ts.map +1 -1
  42. package/dist/runtime/bridge-core.js +52 -17
  43. package/dist/runtime/bridge-core.js.map +1 -1
  44. package/dist/runtime/bridge-protocol.d.ts +184 -0
  45. package/dist/runtime/bridge-protocol.d.ts.map +1 -0
  46. package/dist/runtime/bridge-protocol.js +344 -0
  47. package/dist/runtime/bridge-protocol.js.map +1 -0
  48. package/dist/runtime/disposable.d.ts +40 -0
  49. package/dist/runtime/disposable.d.ts.map +1 -0
  50. package/dist/runtime/disposable.js +49 -0
  51. package/dist/runtime/disposable.js.map +1 -0
  52. package/dist/runtime/errors.d.ts +10 -0
  53. package/dist/runtime/errors.d.ts.map +1 -1
  54. package/dist/runtime/errors.js +9 -0
  55. package/dist/runtime/errors.js.map +1 -1
  56. package/dist/runtime/http-io.d.ts +91 -0
  57. package/dist/runtime/http-io.d.ts.map +1 -0
  58. package/dist/runtime/http-io.js +195 -0
  59. package/dist/runtime/http-io.js.map +1 -0
  60. package/dist/runtime/http.d.ts +48 -13
  61. package/dist/runtime/http.d.ts.map +1 -1
  62. package/dist/runtime/http.js +60 -73
  63. package/dist/runtime/http.js.map +1 -1
  64. package/dist/runtime/node.d.ts +97 -130
  65. package/dist/runtime/node.d.ts.map +1 -1
  66. package/dist/runtime/node.js +392 -521
  67. package/dist/runtime/node.js.map +1 -1
  68. package/dist/runtime/optimized-node.d.ts +1 -1
  69. package/dist/runtime/optimized-node.d.ts.map +1 -1
  70. package/dist/runtime/optimized-node.js +1 -1
  71. package/dist/runtime/optimized-node.js.map +1 -1
  72. package/dist/runtime/pooled-transport.d.ts +135 -0
  73. package/dist/runtime/pooled-transport.d.ts.map +1 -0
  74. package/dist/runtime/pooled-transport.js +177 -0
  75. package/dist/runtime/pooled-transport.js.map +1 -0
  76. package/dist/runtime/process-io.d.ts +209 -0
  77. package/dist/runtime/process-io.d.ts.map +1 -0
  78. package/dist/runtime/process-io.js +729 -0
  79. package/dist/runtime/process-io.js.map +1 -0
  80. package/dist/runtime/pyodide-io.d.ts +154 -0
  81. package/dist/runtime/pyodide-io.d.ts.map +1 -0
  82. package/dist/runtime/pyodide-io.js +459 -0
  83. package/dist/runtime/pyodide-io.js.map +1 -0
  84. package/dist/runtime/pyodide.d.ts +51 -19
  85. package/dist/runtime/pyodide.d.ts.map +1 -1
  86. package/dist/runtime/pyodide.js +57 -186
  87. package/dist/runtime/pyodide.js.map +1 -1
  88. package/dist/runtime/safe-codec.d.ts +103 -0
  89. package/dist/runtime/safe-codec.d.ts.map +1 -0
  90. package/dist/runtime/safe-codec.js +519 -0
  91. package/dist/runtime/safe-codec.js.map +1 -0
  92. package/dist/runtime/transport.d.ts +191 -0
  93. package/dist/runtime/transport.d.ts.map +1 -0
  94. package/dist/runtime/transport.js +86 -0
  95. package/dist/runtime/transport.js.map +1 -0
  96. package/dist/runtime/validators.d.ts +120 -0
  97. package/dist/runtime/validators.d.ts.map +1 -0
  98. package/dist/runtime/validators.js +229 -0
  99. package/dist/runtime/validators.js.map +1 -0
  100. package/dist/runtime/worker-pool.d.ts +208 -0
  101. package/dist/runtime/worker-pool.d.ts.map +1 -0
  102. package/dist/runtime/worker-pool.js +419 -0
  103. package/dist/runtime/worker-pool.js.map +1 -0
  104. package/dist/types/index.d.ts +51 -1
  105. package/dist/types/index.d.ts.map +1 -1
  106. package/dist/tywrap.d.ts.map +1 -1
  107. package/dist/tywrap.js +227 -328
  108. package/dist/tywrap.js.map +1 -1
  109. package/dist/utils/cache.d.ts.map +1 -1
  110. package/dist/utils/cache.js +53 -5
  111. package/dist/utils/cache.js.map +1 -1
  112. package/dist/utils/codec.d.ts.map +1 -1
  113. package/dist/utils/codec.js +114 -1
  114. package/dist/utils/codec.js.map +1 -1
  115. package/dist/utils/ir-cache.d.ts +28 -0
  116. package/dist/utils/ir-cache.d.ts.map +1 -0
  117. package/dist/utils/ir-cache.js +29 -0
  118. package/dist/utils/ir-cache.js.map +1 -0
  119. package/dist/utils/parallel-processor.d.ts +1 -1
  120. package/dist/utils/parallel-processor.d.ts.map +1 -1
  121. package/dist/utils/parallel-processor.js +111 -40
  122. package/dist/utils/parallel-processor.js.map +1 -1
  123. package/dist/utils/runtime.d.ts +5 -1
  124. package/dist/utils/runtime.d.ts.map +1 -1
  125. package/dist/utils/runtime.js +112 -18
  126. package/dist/utils/runtime.js.map +1 -1
  127. package/package.json +40 -18
  128. package/runtime/python_bridge.py +108 -15
  129. package/runtime/safe_codec.py +344 -0
  130. package/src/cli.ts +61 -2
  131. package/src/config/index.ts +63 -17
  132. package/src/core/analyzer.ts +52 -15
  133. package/src/core/annotation-parser.ts +500 -0
  134. package/src/core/discovery.ts +26 -12
  135. package/src/core/generator.ts +956 -116
  136. package/src/core/mapper.ts +158 -51
  137. package/src/index.ts +78 -6
  138. package/src/runtime/base.ts +18 -26
  139. package/src/runtime/bounded-context.ts +608 -0
  140. package/src/runtime/bridge-core.ts +58 -18
  141. package/src/runtime/bridge-protocol.ts +483 -0
  142. package/src/runtime/disposable.ts +65 -0
  143. package/src/runtime/errors.ts +14 -0
  144. package/src/runtime/http-io.ts +245 -0
  145. package/src/runtime/http.ts +76 -115
  146. package/src/runtime/node.ts +563 -676
  147. package/src/runtime/optimized-node.ts +4 -1
  148. package/src/runtime/pooled-transport.ts +263 -0
  149. package/src/runtime/process-io.ts +930 -0
  150. package/src/runtime/pyodide-io.ts +551 -0
  151. package/src/runtime/pyodide.ts +75 -215
  152. package/src/runtime/safe-codec.ts +651 -0
  153. package/src/runtime/transport.ts +278 -0
  154. package/src/runtime/validators.ts +252 -0
  155. package/src/runtime/worker-pool.ts +559 -0
  156. package/src/types/global.d.ts +11 -1
  157. package/src/types/index.ts +63 -0
  158. package/src/tywrap.ts +279 -358
  159. package/src/utils/cache.ts +59 -5
  160. package/src/utils/codec.ts +122 -1
  161. package/src/utils/ir-cache.ts +51 -0
  162. package/src/utils/parallel-processor.ts +119 -43
  163. package/src/utils/runtime.ts +129 -18
@@ -0,0 +1,519 @@
1
+ /**
2
+ * SafeCodec - Unified validation and serialization for JS<->Python boundary crossing.
3
+ *
4
+ * Provides safe encoding/decoding with configurable guardrails for:
5
+ * - Special float rejection (NaN, Infinity)
6
+ * - Non-string key detection
7
+ * - Payload size limits
8
+ * - Binary data handling
9
+ */
10
+ import { BridgeCodecError, BridgeProtocolError, BridgeExecutionError } from './errors.js';
11
+ import { containsSpecialFloat } from './validators.js';
12
+ import { decodeValueAsync as decodeArrowValue } from '../utils/codec.js';
13
+ import { PROTOCOL_ID } from './transport.js';
14
+ // ═══════════════════════════════════════════════════════════════════════════
15
+ // CONSTANTS
16
+ // ═══════════════════════════════════════════════════════════════════════════
17
+ const DEFAULT_MAX_PAYLOAD_BYTES = 10 * 1024 * 1024; // 10MB
18
+ const ERROR_PAYLOAD_SNIPPET_LENGTH = 200;
19
+ // ═══════════════════════════════════════════════════════════════════════════
20
+ // HELPER FUNCTIONS
21
+ // ═══════════════════════════════════════════════════════════════════════════
22
+ /**
23
+ * Check if a value is a plain object (not null, not array, not Map/Set/etc).
24
+ */
25
+ function isPlainObject(value) {
26
+ if (value === null || typeof value !== 'object') {
27
+ return false;
28
+ }
29
+ const proto = Object.getPrototypeOf(value);
30
+ return proto === Object.prototype || proto === null;
31
+ }
32
+ /**
33
+ * Build a path string for error messages.
34
+ */
35
+ function buildPath(basePath, key) {
36
+ if (basePath === '') {
37
+ return typeof key === 'number' ? `[${key}]` : key;
38
+ }
39
+ return typeof key === 'number' ? `${basePath}[${key}]` : `${basePath}.${key}`;
40
+ }
41
+ /**
42
+ * Recursively check for non-string keys in objects and Maps.
43
+ * Throws BridgeCodecError with path indication if found.
44
+ */
45
+ function assertStringKeys(value, path = '', visited = new WeakSet()) {
46
+ if (value === null || typeof value !== 'object') {
47
+ return;
48
+ }
49
+ if (visited.has(value)) {
50
+ return;
51
+ }
52
+ visited.add(value);
53
+ // Check Map instances for non-string keys
54
+ if (value instanceof Map) {
55
+ for (const key of value.keys()) {
56
+ if (typeof key !== 'string') {
57
+ const keyDesc = typeof key === 'symbol' ? key.toString() : String(key);
58
+ const location = path ? ` at ${path}` : '';
59
+ throw new BridgeCodecError(`Non-string key found in Map${location}: ${keyDesc} (${typeof key})`, { codecPhase: 'encode' });
60
+ }
61
+ }
62
+ // Recurse into Map values
63
+ for (const [key, val] of value.entries()) {
64
+ assertStringKeys(val, buildPath(path, key), visited);
65
+ }
66
+ return;
67
+ }
68
+ // Check arrays
69
+ if (Array.isArray(value)) {
70
+ for (const [index, item] of value.entries()) {
71
+ assertStringKeys(item, buildPath(path, index), visited);
72
+ }
73
+ return;
74
+ }
75
+ // Check plain objects for symbol keys
76
+ if (isPlainObject(value)) {
77
+ // Symbol keys are not enumerated by Object.keys, use getOwnPropertySymbols
78
+ const symbolKeys = Object.getOwnPropertySymbols(value);
79
+ const firstSymbol = symbolKeys[0];
80
+ if (firstSymbol !== undefined) {
81
+ const symbolDesc = firstSymbol.toString();
82
+ const location = path ? ` at ${path}` : '';
83
+ throw new BridgeCodecError(`Symbol key found in object${location}: ${symbolDesc}`, {
84
+ codecPhase: 'encode',
85
+ });
86
+ }
87
+ // Recurse into object values
88
+ for (const [key, item] of Object.entries(value)) {
89
+ assertStringKeys(item, buildPath(path, key), visited);
90
+ }
91
+ }
92
+ }
93
+ /**
94
+ * Check if a value is a Python error response.
95
+ */
96
+ function isPythonErrorResponse(value) {
97
+ if (value === null || typeof value !== 'object') {
98
+ return false;
99
+ }
100
+ const obj = value;
101
+ if (!obj.error || typeof obj.error !== 'object' || obj.error === null) {
102
+ return false;
103
+ }
104
+ const error = obj.error;
105
+ return typeof error.type === 'string' && typeof error.message === 'string';
106
+ }
107
+ /**
108
+ * Type guard for protocol response envelope.
109
+ * Envelopes must include a numeric id.
110
+ */
111
+ function isProtocolEnvelope(value) {
112
+ if (value === null || typeof value !== 'object') {
113
+ return false;
114
+ }
115
+ const obj = value;
116
+ return typeof obj.id === 'number';
117
+ }
118
+ function hasOwnKey(value, key) {
119
+ return Object.prototype.hasOwnProperty.call(value, key);
120
+ }
121
+ function normalizeErrorPayload(err) {
122
+ if (!err || typeof err !== 'object' || Array.isArray(err)) {
123
+ return null;
124
+ }
125
+ const candidate = err;
126
+ if (typeof candidate.type !== 'string' || typeof candidate.message !== 'string') {
127
+ return null;
128
+ }
129
+ if (hasOwnKey(candidate, 'traceback') && typeof candidate.traceback !== 'string') {
130
+ return null;
131
+ }
132
+ const normalized = {
133
+ type: candidate.type,
134
+ message: candidate.message,
135
+ };
136
+ if (typeof candidate.traceback === 'string') {
137
+ normalized.traceback = candidate.traceback;
138
+ }
139
+ return normalized;
140
+ }
141
+ function describeInvalidErrorPayload(err) {
142
+ if (!err || typeof err !== 'object' || Array.isArray(err)) {
143
+ return 'expected an object with string "type" and "message" fields';
144
+ }
145
+ const candidate = err;
146
+ if (typeof candidate.type !== 'string') {
147
+ return '"type" must be a string';
148
+ }
149
+ if (typeof candidate.message !== 'string') {
150
+ return '"message" must be a string';
151
+ }
152
+ if (hasOwnKey(candidate, 'traceback') && typeof candidate.traceback !== 'string') {
153
+ return '"traceback" must be a string when provided';
154
+ }
155
+ return 'expected an object with string "type" and "message" fields';
156
+ }
157
+ function summarizePayloadForError(payload) {
158
+ const trimmed = payload.trim();
159
+ if (!trimmed) {
160
+ return '[empty payload]';
161
+ }
162
+ if (trimmed.length <= ERROR_PAYLOAD_SNIPPET_LENGTH) {
163
+ return trimmed;
164
+ }
165
+ return `${trimmed.slice(0, ERROR_PAYLOAD_SNIPPET_LENGTH)}...`;
166
+ }
167
+ /**
168
+ * Validate the protocol version in a response.
169
+ * Only validates when the response looks like a protocol envelope (has 'id' field).
170
+ * Throws if protocol is present but doesn't match expected version.
171
+ * Allows missing protocol for backwards compatibility.
172
+ */
173
+ function validateProtocolVersion(value) {
174
+ if (value === null || typeof value !== 'object') {
175
+ return;
176
+ }
177
+ const obj = value;
178
+ // Only validate protocol on protocol envelopes (responses with 'id' field)
179
+ // This avoids false positives on user data that happens to contain 'protocol' key
180
+ if (!('id' in obj)) {
181
+ return;
182
+ }
183
+ if ('protocol' in obj && obj.protocol !== PROTOCOL_ID) {
184
+ throw new BridgeProtocolError(`Invalid protocol version: expected "${PROTOCOL_ID}", got "${obj.protocol}"`);
185
+ }
186
+ }
187
+ /**
188
+ * Find the path to a special float in a value structure.
189
+ * Returns undefined if no special float is found.
190
+ */
191
+ function findSpecialFloatPath(value, path = '', visited = new WeakSet()) {
192
+ if (typeof value === 'number' && !Number.isFinite(value)) {
193
+ return path || 'root';
194
+ }
195
+ if (value === null || typeof value !== 'object') {
196
+ return undefined;
197
+ }
198
+ if (visited.has(value)) {
199
+ return undefined;
200
+ }
201
+ visited.add(value);
202
+ if (Array.isArray(value)) {
203
+ for (const [index, item] of value.entries()) {
204
+ const result = findSpecialFloatPath(item, buildPath(path, index), visited);
205
+ if (result !== undefined) {
206
+ return result;
207
+ }
208
+ }
209
+ }
210
+ if (isPlainObject(value)) {
211
+ for (const [key, item] of Object.entries(value)) {
212
+ const result = findSpecialFloatPath(item, buildPath(path, key), visited);
213
+ if (result !== undefined) {
214
+ return result;
215
+ }
216
+ }
217
+ }
218
+ return undefined;
219
+ }
220
+ // ═══════════════════════════════════════════════════════════════════════════
221
+ // SAFE CODEC CLASS
222
+ // ═══════════════════════════════════════════════════════════════════════════
223
+ /**
224
+ * SafeCodec provides unified validation and serialization for JS<->Python
225
+ * boundary crossing with configurable guardrails.
226
+ *
227
+ * @example
228
+ * ```typescript
229
+ * const codec = new SafeCodec({ rejectSpecialFloats: true });
230
+ *
231
+ * // Encoding a request
232
+ * const payload = codec.encodeRequest({ data: [1, 2, 3] });
233
+ *
234
+ * // Decoding a response
235
+ * const result = codec.decodeResponse<MyType>(responsePayload);
236
+ *
237
+ * // Async decoding with Arrow support
238
+ * const dataframe = await codec.decodeResponseAsync<ArrowTable>(arrowPayload);
239
+ * ```
240
+ */
241
+ export class SafeCodec {
242
+ rejectSpecialFloats;
243
+ rejectNonStringKeys;
244
+ maxPayloadBytes;
245
+ bytesHandling;
246
+ reviveValueBound;
247
+ static base64Pattern = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
248
+ constructor(options = {}) {
249
+ this.rejectSpecialFloats = options.rejectSpecialFloats ?? true;
250
+ this.rejectNonStringKeys = options.rejectNonStringKeys ?? true;
251
+ this.maxPayloadBytes = options.maxPayloadBytes ?? DEFAULT_MAX_PAYLOAD_BYTES;
252
+ this.bytesHandling = options.bytesHandling ?? 'base64';
253
+ this.reviveValueBound = this.reviveValue.bind(this);
254
+ }
255
+ assertValidBase64(b64) {
256
+ if (!SafeCodec.base64Pattern.test(b64)) {
257
+ throw new BridgeCodecError('Invalid base64 in bytes envelope', {
258
+ codecPhase: 'decode',
259
+ valueType: 'bytes',
260
+ });
261
+ }
262
+ }
263
+ /**
264
+ * Convert base64 string to Uint8Array.
265
+ *
266
+ * Why: Python bridge represents bytes/bytearray as base64 envelopes. Decoding them here
267
+ * restores ergonomic JS types at the boundary.
268
+ */
269
+ fromBase64(b64) {
270
+ this.assertValidBase64(b64);
271
+ if (typeof Buffer !== 'undefined') {
272
+ const buf = Buffer.from(b64, 'base64');
273
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
274
+ }
275
+ if (globalThis.atob) {
276
+ const bin = globalThis.atob(b64);
277
+ const arr = Array.from(bin, c => c.charCodeAt(0));
278
+ return new Uint8Array(arr);
279
+ }
280
+ throw new BridgeCodecError('Base64 decoding is not available in this runtime', {
281
+ codecPhase: 'decode',
282
+ valueType: 'bytes',
283
+ });
284
+ }
285
+ /**
286
+ * JSON.parse reviver that decodes bytes envelopes.
287
+ *
288
+ * Supported shapes:
289
+ * - { "__tywrap_bytes__": true, "b64": "..." } (JS SafeCodec.encodeRequest; also allowed in responses)
290
+ * - { "__type__": "bytes", "encoding": "base64", "data": "..." } (Python SafeCodec default encoder)
291
+ */
292
+ reviveValue(_key, value) {
293
+ if (value === null || typeof value !== 'object' || Array.isArray(value)) {
294
+ return value;
295
+ }
296
+ const obj = value;
297
+ if (obj.__tywrap_bytes__ === true && typeof obj.b64 === 'string') {
298
+ try {
299
+ return this.fromBase64(obj.b64);
300
+ }
301
+ catch (err) {
302
+ const errorMessage = err instanceof Error ? err.message : String(err);
303
+ throw new BridgeCodecError(`Bytes envelope decode failed: ${errorMessage}`, {
304
+ codecPhase: 'decode',
305
+ valueType: 'bytes',
306
+ });
307
+ }
308
+ }
309
+ if (obj.__type__ === 'bytes' && obj.encoding === 'base64' && typeof obj.data === 'string') {
310
+ try {
311
+ return this.fromBase64(obj.data);
312
+ }
313
+ catch (err) {
314
+ const errorMessage = err instanceof Error ? err.message : String(err);
315
+ throw new BridgeCodecError(`Bytes envelope decode failed: ${errorMessage}`, {
316
+ codecPhase: 'decode',
317
+ valueType: 'bytes',
318
+ });
319
+ }
320
+ }
321
+ return value;
322
+ }
323
+ toBridgeExecutionError(error) {
324
+ const bridgeError = new BridgeExecutionError(`${error.type}: ${error.message}`);
325
+ bridgeError.traceback = error.traceback;
326
+ return bridgeError;
327
+ }
328
+ extractResultFromResponseEnvelope(parsed) {
329
+ if (isProtocolEnvelope(parsed)) {
330
+ const envelope = parsed;
331
+ const hasResult = hasOwnKey(envelope, 'result');
332
+ const hasError = hasOwnKey(envelope, 'error');
333
+ if (hasResult && hasError) {
334
+ throw new BridgeProtocolError('Protocol response cannot include both "result" and "error"');
335
+ }
336
+ if (hasError) {
337
+ const normalizedError = normalizeErrorPayload(envelope.error);
338
+ if (!normalizedError) {
339
+ const details = describeInvalidErrorPayload(envelope.error);
340
+ throw new BridgeProtocolError(`Invalid response "error" payload: ${details}`);
341
+ }
342
+ throw this.toBridgeExecutionError(normalizedError);
343
+ }
344
+ if (!hasResult) {
345
+ throw new BridgeProtocolError('Protocol response missing "result" or "error" field');
346
+ }
347
+ return envelope.result;
348
+ }
349
+ if (isPythonErrorResponse(parsed)) {
350
+ throw this.toBridgeExecutionError(parsed.error);
351
+ }
352
+ return parsed;
353
+ }
354
+ /**
355
+ * Validate and encode a request payload.
356
+ * Called before sending to Python.
357
+ *
358
+ * @param message - The message to encode
359
+ * @returns JSON string ready to send
360
+ * @throws BridgeCodecError if validation fails or encoding fails
361
+ */
362
+ encodeRequest(message) {
363
+ // Validate special floats if enabled
364
+ if (this.rejectSpecialFloats && containsSpecialFloat(message)) {
365
+ const floatPath = findSpecialFloatPath(message);
366
+ throw new BridgeCodecError(`Cannot encode request: contains non-finite number (NaN or Infinity) at ${floatPath}`, { codecPhase: 'encode', valueType: 'number' });
367
+ }
368
+ // Validate string keys if enabled
369
+ if (this.rejectNonStringKeys) {
370
+ assertStringKeys(message);
371
+ }
372
+ // Serialize to JSON with error handling
373
+ let payload;
374
+ try {
375
+ payload = JSON.stringify(message, (key, value) => {
376
+ // Handle bytes based on configuration
377
+ if (value instanceof Uint8Array || value instanceof ArrayBuffer) {
378
+ switch (this.bytesHandling) {
379
+ case 'reject':
380
+ throw new BridgeCodecError(`Cannot encode request: binary data found at ${key || 'root'} (bytesHandling: reject)`, { codecPhase: 'encode', valueType: 'bytes' });
381
+ case 'base64': {
382
+ const bytes = value instanceof ArrayBuffer ? new Uint8Array(value) : value;
383
+ const b64 = this.toBase64(bytes);
384
+ return { __tywrap_bytes__: true, b64 };
385
+ }
386
+ case 'passthrough':
387
+ default:
388
+ return value;
389
+ }
390
+ }
391
+ return value;
392
+ });
393
+ }
394
+ catch (err) {
395
+ if (err instanceof BridgeCodecError) {
396
+ throw err;
397
+ }
398
+ if (err instanceof BridgeProtocolError) {
399
+ throw err;
400
+ }
401
+ const errorMessage = err instanceof Error ? err.message : String(err);
402
+ throw new BridgeCodecError(`JSON serialization failed: ${errorMessage}`, {
403
+ codecPhase: 'encode',
404
+ });
405
+ }
406
+ // Check payload size
407
+ const payloadBytes = new TextEncoder().encode(payload).length;
408
+ if (payloadBytes > this.maxPayloadBytes) {
409
+ throw new BridgeCodecError(`Payload size ${payloadBytes} bytes exceeds maximum ${this.maxPayloadBytes} bytes`, { codecPhase: 'encode', valueType: 'payload' });
410
+ }
411
+ return payload;
412
+ }
413
+ /**
414
+ * Decode and validate a response payload.
415
+ * Called after receiving from Python.
416
+ *
417
+ * @param payload - The JSON string received from Python
418
+ * @returns Decoded and validated result
419
+ * @throws BridgeCodecError if payload is invalid or decoding fails
420
+ * @throws BridgeProtocolError if protocol envelope is invalid
421
+ * @throws BridgeExecutionError if response contains a Python error
422
+ */
423
+ decodeResponse(payload) {
424
+ // Check payload size first
425
+ const payloadBytes = new TextEncoder().encode(payload).length;
426
+ if (payloadBytes > this.maxPayloadBytes) {
427
+ throw new BridgeCodecError(`Response payload size ${payloadBytes} bytes exceeds maximum ${this.maxPayloadBytes} bytes`, { codecPhase: 'decode', valueType: 'payload' });
428
+ }
429
+ // Parse JSON
430
+ let parsed;
431
+ try {
432
+ parsed = JSON.parse(payload, this.reviveValueBound);
433
+ }
434
+ catch (err) {
435
+ if (err instanceof BridgeCodecError || err instanceof BridgeProtocolError) {
436
+ throw err;
437
+ }
438
+ const errorMessage = err instanceof Error ? err.message : String(err);
439
+ throw new BridgeCodecError(`JSON parse failed: ${errorMessage}. Payload snippet: ${summarizePayloadForError(payload)}`, { codecPhase: 'decode', valueType: 'json' });
440
+ }
441
+ // Validate protocol version (if present)
442
+ validateProtocolVersion(parsed);
443
+ const result = this.extractResultFromResponseEnvelope(parsed);
444
+ // Post-decode validation for special floats if enabled
445
+ if (this.rejectSpecialFloats && containsSpecialFloat(result)) {
446
+ const floatPath = findSpecialFloatPath(result);
447
+ throw new BridgeCodecError(`Response contains non-finite number (NaN or Infinity) at ${floatPath}`, { codecPhase: 'decode', valueType: 'number' });
448
+ }
449
+ return result;
450
+ }
451
+ /**
452
+ * Async version that applies Arrow decoders.
453
+ * Use this when the response may contain encoded DataFrames or ndarrays.
454
+ *
455
+ * @param payload - The JSON string received from Python
456
+ * @returns Decoded and validated result with Arrow decoding applied
457
+ * @throws BridgeCodecError if payload is invalid or decoding fails
458
+ * @throws BridgeProtocolError if protocol envelope is invalid
459
+ * @throws BridgeExecutionError if response contains a Python error
460
+ */
461
+ async decodeResponseAsync(payload) {
462
+ // Check payload size first
463
+ const payloadBytes = new TextEncoder().encode(payload).length;
464
+ if (payloadBytes > this.maxPayloadBytes) {
465
+ throw new BridgeCodecError(`Response payload size ${payloadBytes} bytes exceeds maximum ${this.maxPayloadBytes} bytes`, { codecPhase: 'decode', valueType: 'payload' });
466
+ }
467
+ // Parse JSON
468
+ let parsed;
469
+ try {
470
+ parsed = JSON.parse(payload, this.reviveValueBound);
471
+ }
472
+ catch (err) {
473
+ if (err instanceof BridgeCodecError || err instanceof BridgeProtocolError) {
474
+ throw err;
475
+ }
476
+ const errorMessage = err instanceof Error ? err.message : String(err);
477
+ throw new BridgeCodecError(`JSON parse failed: ${errorMessage}. Payload snippet: ${summarizePayloadForError(payload)}`, { codecPhase: 'decode', valueType: 'json' });
478
+ }
479
+ // Validate protocol version (if present)
480
+ validateProtocolVersion(parsed);
481
+ const result = this.extractResultFromResponseEnvelope(parsed);
482
+ // Apply Arrow decoding to the result
483
+ let decoded;
484
+ try {
485
+ decoded = await decodeArrowValue(result);
486
+ }
487
+ catch (err) {
488
+ const errorMessage = err instanceof Error ? err.message : String(err);
489
+ throw new BridgeCodecError(`Arrow decoding failed: ${errorMessage}`, {
490
+ codecPhase: 'decode',
491
+ valueType: 'arrow',
492
+ });
493
+ }
494
+ // Post-decode validation for special floats if enabled
495
+ // Note: Arrow decoders can introduce NaN/Infinity from binary representations.
496
+ if (this.rejectSpecialFloats && containsSpecialFloat(decoded)) {
497
+ const floatPath = findSpecialFloatPath(decoded);
498
+ throw new BridgeCodecError(`Response contains non-finite number (NaN or Infinity) at ${floatPath}`, { codecPhase: 'decode', valueType: 'number' });
499
+ }
500
+ return decoded;
501
+ }
502
+ /**
503
+ * Convert Uint8Array to base64 string.
504
+ */
505
+ toBase64(bytes) {
506
+ if (typeof Buffer !== 'undefined') {
507
+ return Buffer.from(bytes).toString('base64');
508
+ }
509
+ if (globalThis.btoa) {
510
+ const binary = String.fromCharCode(...bytes);
511
+ return globalThis.btoa(binary);
512
+ }
513
+ throw new BridgeCodecError('Base64 encoding is not available in this runtime', {
514
+ codecPhase: 'encode',
515
+ valueType: 'bytes',
516
+ });
517
+ }
518
+ }
519
+ //# sourceMappingURL=safe-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-codec.js","sourceRoot":"","sources":["../../src/runtime/safe-codec.ts"],"names":[],"mappings":"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"}