@astrale-os/kernel-client 0.2.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 (257) hide show
  1. package/dist/client/batch.d.ts +26 -0
  2. package/dist/client/batch.d.ts.map +1 -0
  3. package/dist/client/batch.js +8 -0
  4. package/dist/client/batch.js.map +1 -0
  5. package/dist/client/bound.d.ts +27 -0
  6. package/dist/client/bound.d.ts.map +1 -0
  7. package/dist/client/bound.js +14 -0
  8. package/dist/client/bound.js.map +1 -0
  9. package/dist/client/client.d.ts +93 -0
  10. package/dist/client/client.d.ts.map +1 -0
  11. package/dist/client/client.js +393 -0
  12. package/dist/client/client.js.map +1 -0
  13. package/dist/client/config.d.ts +112 -0
  14. package/dist/client/config.d.ts.map +1 -0
  15. package/dist/client/config.js +10 -0
  16. package/dist/client/config.js.map +1 -0
  17. package/dist/client/fn-map.d.ts +61 -0
  18. package/dist/client/fn-map.d.ts.map +1 -0
  19. package/dist/client/fn-map.js +2 -0
  20. package/dist/client/fn-map.js.map +1 -0
  21. package/dist/client/freeze.d.ts +32 -0
  22. package/dist/client/freeze.d.ts.map +1 -0
  23. package/dist/client/freeze.js +42 -0
  24. package/dist/client/freeze.js.map +1 -0
  25. package/dist/client/hooks.d.ts +49 -0
  26. package/dist/client/hooks.d.ts.map +1 -0
  27. package/dist/client/hooks.js +2 -0
  28. package/dist/client/hooks.js.map +1 -0
  29. package/dist/client/index.d.ts +7 -0
  30. package/dist/client/index.d.ts.map +1 -0
  31. package/dist/client/index.js +2 -0
  32. package/dist/client/index.js.map +1 -0
  33. package/dist/delegation/cache.d.ts +133 -0
  34. package/dist/delegation/cache.d.ts.map +1 -0
  35. package/dist/delegation/cache.js +258 -0
  36. package/dist/delegation/cache.js.map +1 -0
  37. package/dist/delegation/errors.d.ts +44 -0
  38. package/dist/delegation/errors.d.ts.map +1 -0
  39. package/dist/delegation/errors.js +62 -0
  40. package/dist/delegation/errors.js.map +1 -0
  41. package/dist/delegation/index.d.ts +6 -0
  42. package/dist/delegation/index.d.ts.map +1 -0
  43. package/dist/delegation/index.js +4 -0
  44. package/dist/delegation/index.js.map +1 -0
  45. package/dist/delegation/policy.d.ts +175 -0
  46. package/dist/delegation/policy.d.ts.map +1 -0
  47. package/dist/delegation/policy.js +109 -0
  48. package/dist/delegation/policy.js.map +1 -0
  49. package/dist/errors/errors.d.ts +103 -0
  50. package/dist/errors/errors.d.ts.map +1 -0
  51. package/dist/errors/errors.js +170 -0
  52. package/dist/errors/errors.js.map +1 -0
  53. package/dist/errors/index.d.ts +4 -0
  54. package/dist/errors/index.d.ts.map +1 -0
  55. package/dist/errors/index.js +3 -0
  56. package/dist/errors/index.js.map +1 -0
  57. package/dist/errors/session-error.d.ts +21 -0
  58. package/dist/errors/session-error.d.ts.map +1 -0
  59. package/dist/errors/session-error.js +25 -0
  60. package/dist/errors/session-error.js.map +1 -0
  61. package/dist/index.d.ts +17 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +10 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/pacer/batcher.d.ts +11 -0
  66. package/dist/pacer/batcher.d.ts.map +1 -0
  67. package/dist/pacer/batcher.js +15 -0
  68. package/dist/pacer/batcher.js.map +1 -0
  69. package/dist/pacer/defaults.d.ts +18 -0
  70. package/dist/pacer/defaults.d.ts.map +1 -0
  71. package/dist/pacer/defaults.js +18 -0
  72. package/dist/pacer/defaults.js.map +1 -0
  73. package/dist/pacer/index.d.ts +10 -0
  74. package/dist/pacer/index.d.ts.map +1 -0
  75. package/dist/pacer/index.js +11 -0
  76. package/dist/pacer/index.js.map +1 -0
  77. package/dist/pacer/queue.d.ts +11 -0
  78. package/dist/pacer/queue.d.ts.map +1 -0
  79. package/dist/pacer/queue.js +15 -0
  80. package/dist/pacer/queue.js.map +1 -0
  81. package/dist/pacer/rate-limiter.d.ts +11 -0
  82. package/dist/pacer/rate-limiter.d.ts.map +1 -0
  83. package/dist/pacer/rate-limiter.js +15 -0
  84. package/dist/pacer/rate-limiter.js.map +1 -0
  85. package/dist/pacer/retry.d.ts +14 -0
  86. package/dist/pacer/retry.d.ts.map +1 -0
  87. package/dist/pacer/retry.js +50 -0
  88. package/dist/pacer/retry.js.map +1 -0
  89. package/dist/persistence/index.d.ts +3 -0
  90. package/dist/persistence/index.d.ts.map +1 -0
  91. package/dist/persistence/index.js +2 -0
  92. package/dist/persistence/index.js.map +1 -0
  93. package/dist/persistence/persistence.d.ts +52 -0
  94. package/dist/persistence/persistence.d.ts.map +1 -0
  95. package/dist/persistence/persistence.js +32 -0
  96. package/dist/persistence/persistence.js.map +1 -0
  97. package/dist/pool/errors.d.ts +13 -0
  98. package/dist/pool/errors.d.ts.map +1 -0
  99. package/dist/pool/errors.js +16 -0
  100. package/dist/pool/errors.js.map +1 -0
  101. package/dist/pool/index.d.ts +4 -0
  102. package/dist/pool/index.d.ts.map +1 -0
  103. package/dist/pool/index.js +3 -0
  104. package/dist/pool/index.js.map +1 -0
  105. package/dist/pool/pool.d.ts +63 -0
  106. package/dist/pool/pool.d.ts.map +1 -0
  107. package/dist/pool/pool.js +87 -0
  108. package/dist/pool/pool.js.map +1 -0
  109. package/dist/redirect/errors.d.ts +45 -0
  110. package/dist/redirect/errors.d.ts.map +1 -0
  111. package/dist/redirect/errors.js +52 -0
  112. package/dist/redirect/errors.js.map +1 -0
  113. package/dist/redirect/index.d.ts +4 -0
  114. package/dist/redirect/index.d.ts.map +1 -0
  115. package/dist/redirect/index.js +3 -0
  116. package/dist/redirect/index.js.map +1 -0
  117. package/dist/redirect/policy.d.ts +79 -0
  118. package/dist/redirect/policy.d.ts.map +1 -0
  119. package/dist/redirect/policy.js +69 -0
  120. package/dist/redirect/policy.js.map +1 -0
  121. package/dist/schema/call-args.d.ts +6 -0
  122. package/dist/schema/call-args.d.ts.map +1 -0
  123. package/dist/schema/call-args.js +21 -0
  124. package/dist/schema/call-args.js.map +1 -0
  125. package/dist/schema/class-proxy.d.ts +8 -0
  126. package/dist/schema/class-proxy.d.ts.map +1 -0
  127. package/dist/schema/class-proxy.js +38 -0
  128. package/dist/schema/class-proxy.js.map +1 -0
  129. package/dist/schema/extract.d.ts +9 -0
  130. package/dist/schema/extract.d.ts.map +1 -0
  131. package/dist/schema/extract.js +16 -0
  132. package/dist/schema/extract.js.map +1 -0
  133. package/dist/schema/from-entries.d.ts +12 -0
  134. package/dist/schema/from-entries.d.ts.map +1 -0
  135. package/dist/schema/from-entries.js +39 -0
  136. package/dist/schema/from-entries.js.map +1 -0
  137. package/dist/schema/index.d.ts +11 -0
  138. package/dist/schema/index.d.ts.map +1 -0
  139. package/dist/schema/index.js +9 -0
  140. package/dist/schema/index.js.map +1 -0
  141. package/dist/schema/node-proxy.d.ts +9 -0
  142. package/dist/schema/node-proxy.d.ts.map +1 -0
  143. package/dist/schema/node-proxy.js +32 -0
  144. package/dist/schema/node-proxy.js.map +1 -0
  145. package/dist/schema/proxy-types.d.ts +112 -0
  146. package/dist/schema/proxy-types.d.ts.map +1 -0
  147. package/dist/schema/proxy-types.js +2 -0
  148. package/dist/schema/proxy-types.js.map +1 -0
  149. package/dist/schema/registry.d.ts +51 -0
  150. package/dist/schema/registry.d.ts.map +1 -0
  151. package/dist/schema/registry.js +111 -0
  152. package/dist/schema/registry.js.map +1 -0
  153. package/dist/schema/resolve.d.ts +26 -0
  154. package/dist/schema/resolve.d.ts.map +1 -0
  155. package/dist/schema/resolve.js +27 -0
  156. package/dist/schema/resolve.js.map +1 -0
  157. package/dist/schema/typed-client.d.ts +10 -0
  158. package/dist/schema/typed-client.d.ts.map +1 -0
  159. package/dist/schema/typed-client.js +26 -0
  160. package/dist/schema/typed-client.js.map +1 -0
  161. package/dist/schema/types.d.ts +9 -0
  162. package/dist/schema/types.d.ts.map +1 -0
  163. package/dist/schema/types.js +2 -0
  164. package/dist/schema/types.js.map +1 -0
  165. package/dist/session/bound.d.ts +11 -0
  166. package/dist/session/bound.d.ts.map +1 -0
  167. package/dist/session/bound.js +24 -0
  168. package/dist/session/bound.js.map +1 -0
  169. package/dist/session/client-session.d.ts +61 -0
  170. package/dist/session/client-session.d.ts.map +1 -0
  171. package/dist/session/client-session.js +635 -0
  172. package/dist/session/client-session.js.map +1 -0
  173. package/dist/session/config.d.ts +157 -0
  174. package/dist/session/config.d.ts.map +1 -0
  175. package/dist/session/config.js +2 -0
  176. package/dist/session/config.js.map +1 -0
  177. package/dist/session/errors/index.d.ts +6 -0
  178. package/dist/session/errors/index.d.ts.map +1 -0
  179. package/dist/session/errors/index.js +8 -0
  180. package/dist/session/errors/index.js.map +1 -0
  181. package/dist/session/errors/session-errors.d.ts +52 -0
  182. package/dist/session/errors/session-errors.d.ts.map +1 -0
  183. package/dist/session/errors/session-errors.js +70 -0
  184. package/dist/session/errors/session-errors.js.map +1 -0
  185. package/dist/session/forward.d.ts +14 -0
  186. package/dist/session/forward.d.ts.map +1 -0
  187. package/dist/session/forward.js +44 -0
  188. package/dist/session/forward.js.map +1 -0
  189. package/dist/session/helpers.d.ts +23 -0
  190. package/dist/session/helpers.d.ts.map +1 -0
  191. package/dist/session/helpers.js +56 -0
  192. package/dist/session/helpers.js.map +1 -0
  193. package/dist/session/hooks.d.ts +140 -0
  194. package/dist/session/hooks.d.ts.map +1 -0
  195. package/dist/session/hooks.js +2 -0
  196. package/dist/session/hooks.js.map +1 -0
  197. package/dist/session/index.d.ts +6 -0
  198. package/dist/session/index.d.ts.map +1 -0
  199. package/dist/session/index.js +3 -0
  200. package/dist/session/index.js.map +1 -0
  201. package/dist/session/types.d.ts +38 -0
  202. package/dist/session/types.d.ts.map +1 -0
  203. package/dist/session/types.js +2 -0
  204. package/dist/session/types.js.map +1 -0
  205. package/dist/transport/binary.d.ts +15 -0
  206. package/dist/transport/binary.d.ts.map +1 -0
  207. package/dist/transport/binary.js +2 -0
  208. package/dist/transport/binary.js.map +1 -0
  209. package/dist/transport/contract.d.ts +58 -0
  210. package/dist/transport/contract.d.ts.map +1 -0
  211. package/dist/transport/contract.js +11 -0
  212. package/dist/transport/contract.js.map +1 -0
  213. package/dist/transport/fetch.d.ts +28 -0
  214. package/dist/transport/fetch.d.ts.map +1 -0
  215. package/dist/transport/fetch.js +74 -0
  216. package/dist/transport/fetch.js.map +1 -0
  217. package/dist/transport/http-envelope.d.ts +49 -0
  218. package/dist/transport/http-envelope.d.ts.map +1 -0
  219. package/dist/transport/http-envelope.js +405 -0
  220. package/dist/transport/http-envelope.js.map +1 -0
  221. package/dist/transport/http-routed.d.ts +61 -0
  222. package/dist/transport/http-routed.d.ts.map +1 -0
  223. package/dist/transport/http-routed.js +409 -0
  224. package/dist/transport/http-routed.js.map +1 -0
  225. package/dist/transport/index.d.ts +8 -0
  226. package/dist/transport/index.d.ts.map +1 -0
  227. package/dist/transport/index.js +6 -0
  228. package/dist/transport/index.js.map +1 -0
  229. package/dist/transport/request-id.d.ts +9 -0
  230. package/dist/transport/request-id.d.ts.map +1 -0
  231. package/dist/transport/request-id.js +12 -0
  232. package/dist/transport/request-id.js.map +1 -0
  233. package/dist/transport/ws-envelope.d.ts +74 -0
  234. package/dist/transport/ws-envelope.d.ts.map +1 -0
  235. package/dist/transport/ws-envelope.js +560 -0
  236. package/dist/transport/ws-envelope.js.map +1 -0
  237. package/dist/util/race-signal.d.ts +12 -0
  238. package/dist/util/race-signal.d.ts.map +1 -0
  239. package/dist/util/race-signal.js +34 -0
  240. package/dist/util/race-signal.js.map +1 -0
  241. package/dist/wire/controller.d.ts +38 -0
  242. package/dist/wire/controller.d.ts.map +1 -0
  243. package/dist/wire/controller.js +38 -0
  244. package/dist/wire/controller.js.map +1 -0
  245. package/dist/wire/index.d.ts +7 -0
  246. package/dist/wire/index.d.ts.map +1 -0
  247. package/dist/wire/index.js +4 -0
  248. package/dist/wire/index.js.map +1 -0
  249. package/dist/wire/meta.d.ts +81 -0
  250. package/dist/wire/meta.d.ts.map +1 -0
  251. package/dist/wire/meta.js +44 -0
  252. package/dist/wire/meta.js.map +1 -0
  253. package/dist/wire/sse.d.ts +67 -0
  254. package/dist/wire/sse.d.ts.map +1 -0
  255. package/dist/wire/sse.js +170 -0
  256. package/dist/wire/sse.js.map +1 -0
  257. package/package.json +104 -0
@@ -0,0 +1,405 @@
1
+ /**
2
+ * Kernel-envelope HTTP transport.
3
+ *
4
+ * Speaks the kernel envelope (POST /) with JSON or MsgPack codec. Returns
5
+ * discriminated `Send*Result`s natively — redirects are `kind: 'redirect'`
6
+ * results, errors throw typed `WebOSError` subclasses, values carry
7
+ * `meta: WireMeta` populated at receive time.
8
+ *
9
+ * Note: SSE frames are always JSON-text on the wire, even when the
10
+ * transport is configured for `msgpack` — msgpack bytes don't fit SSE's
11
+ * text framing, so the server emits JSON on the SSE channel regardless.
12
+ */
13
+ import { BINARY_RESULT_HEADER, KERNEL_CONTENT_TYPE_JSON, KERNEL_CONTENT_TYPE_MSGPACK, KERNEL_ERROR_CODES, decodeKernelResponse, encodeKernelNotification, encodeKernelRequest, parseStreamFrame, resolveCodec, } from '@astrale-os/kernel-api';
14
+ import { ConnectionError, KernelError, UnsupportedTransportError, WebOSError, mapServerError, withDetails, } from '../errors/errors';
15
+ import { kernelRetry } from '../pacer/retry';
16
+ import { createController } from '../wire/controller';
17
+ import { DEFAULT_REQUEST_TIMEOUT_MS, headersToRecord } from '../wire/meta';
18
+ import { parseEnvelopedSseEvent, readSseBlocks } from '../wire/sse';
19
+ import { safeFetch } from './fetch';
20
+ import { nextRequestId } from './request-id';
21
+ export class HttpEnvelopeTransport {
22
+ name = 'http-envelope';
23
+ url;
24
+ codec;
25
+ codecName;
26
+ kernelContentType;
27
+ defaultTimeout;
28
+ extraHeaders;
29
+ retryOpts;
30
+ fetchImpl;
31
+ constructor(config) {
32
+ this.url = config.url.replace(/\/$/, '');
33
+ this.codecName = config.codec ?? 'json';
34
+ this.codec = resolveCodec(this.codecName);
35
+ this.kernelContentType =
36
+ this.codecName === 'msgpack' ? KERNEL_CONTENT_TYPE_MSGPACK : KERNEL_CONTENT_TYPE_JSON;
37
+ this.defaultTimeout = config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;
38
+ this.extraHeaders = config.headers ?? {};
39
+ this.retryOpts = config.retry;
40
+ this.fetchImpl = config.fetch ?? globalThis.fetch.bind(globalThis);
41
+ }
42
+ disconnect() {
43
+ // HTTP is stateless. Nothing to release.
44
+ }
45
+ // ─── call ─────────────────────────────────────────────────────────────────
46
+ async call(request) {
47
+ const id = nextRequestId();
48
+ const target = this.targetFor(request);
49
+ const body = this.encodeEnvelope(request.method, request.params, id, request.self);
50
+ const started = Date.now();
51
+ const { signal, clear } = createController({
52
+ signal: request.signal,
53
+ timeout: request.timeout ?? this.defaultTimeout,
54
+ requestId: String(id),
55
+ });
56
+ try {
57
+ const res = await this.retryingFetch(target, {
58
+ method: 'POST',
59
+ headers: this.buildHeaders(request.credential, this.kernelContentType),
60
+ body,
61
+ signal,
62
+ });
63
+ const meta = this.metaFromResponse(res, started, id);
64
+ if (res.status === 204)
65
+ return { kind: 'value', value: undefined, meta };
66
+ const contentType = res.headers.get('content-type') ?? '';
67
+ if (!isEnvelopeContentType(contentType)) {
68
+ throw this.decorate(new KernelError(`Unexpected response content-type "${contentType}" (status ${res.status})`, KERNEL_ERROR_CODES.INTERNAL_ERROR, 'PROTOCOL_ERROR'), request, target, meta);
69
+ }
70
+ let raw;
71
+ try {
72
+ raw = new Uint8Array(await res.arrayBuffer());
73
+ }
74
+ catch (err) {
75
+ throw this.decorate(new ConnectionError(`Failed to read response body from ${target}`, {
76
+ cause: err instanceof Error ? err : new Error(String(err)),
77
+ }), request, target, meta);
78
+ }
79
+ const decoded = decodeKernelResponse(this.codec.decode(raw));
80
+ if (decoded.error) {
81
+ throw this.decorate(mapServerError(decoded.error.code, decoded.error.message, decoded.error.data), request, target, meta);
82
+ }
83
+ if (decoded.redirect) {
84
+ return {
85
+ kind: 'redirect',
86
+ redirection: decoded.redirect,
87
+ meta: { ...meta, requestId: decoded.id ?? meta.requestId },
88
+ };
89
+ }
90
+ return {
91
+ kind: 'value',
92
+ value: decoded.result,
93
+ meta: { ...meta, requestId: decoded.id ?? meta.requestId },
94
+ };
95
+ }
96
+ finally {
97
+ clear();
98
+ }
99
+ }
100
+ // ─── signal ───────────────────────────────────────────────────────────────
101
+ signal(request) {
102
+ // Fire-and-forget: send a no-id envelope and don't await the body.
103
+ const target = this.targetFor(request);
104
+ const envelope = encodeKernelNotification(request.method, request.params, request.self ? { self: request.self } : undefined);
105
+ const raw = this.codec.encode(envelope);
106
+ const body = typeof raw === 'string'
107
+ ? raw
108
+ : raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength);
109
+ safeFetch(target, {
110
+ method: 'POST',
111
+ headers: this.buildHeaders(request.credential, this.kernelContentType),
112
+ body,
113
+ signal: request.signal,
114
+ }, this.fetchImpl).catch(() => {
115
+ // Signals swallow transport errors — the client observes via `onError`.
116
+ });
117
+ }
118
+ // ─── batch ────────────────────────────────────────────────────────────────
119
+ async batch(requests) {
120
+ if (requests.length === 0)
121
+ return [];
122
+ // Batch is one HTTP round-trip. Every entry must agree on URL so the
123
+ // single wire request can carry them all.
124
+ const firstUrl = requests[0].url ?? this.url;
125
+ for (const r of requests) {
126
+ if ((r.url ?? this.url) !== firstUrl) {
127
+ throw new UnsupportedTransportError('batch requires every entry to target the same URL');
128
+ }
129
+ }
130
+ const first = requests[0];
131
+ const target = this.targetFor(first);
132
+ const envelopes = requests.map((r) => encodeKernelRequest(r.method, r.params, nextRequestId(), r.self ? { self: r.self } : undefined));
133
+ const raw = this.codec.encode(envelopes);
134
+ const body = typeof raw === 'string'
135
+ ? raw
136
+ : raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength);
137
+ const started = Date.now();
138
+ const { signal, clear } = createController({
139
+ signal: first.signal,
140
+ timeout: first.timeout ?? this.defaultTimeout,
141
+ });
142
+ try {
143
+ const res = await this.retryingFetch(target, {
144
+ method: 'POST',
145
+ headers: this.buildHeaders(first.credential, this.kernelContentType),
146
+ body,
147
+ signal,
148
+ });
149
+ const sharedMeta = this.metaFromResponse(res, started);
150
+ const items = this.codec.decode(new Uint8Array(await res.arrayBuffer()));
151
+ return items.map((item, i) => {
152
+ const d = decodeKernelResponse(item);
153
+ const meta = { ...sharedMeta, requestId: d.id ?? sharedMeta.requestId };
154
+ const req = requests[i] ?? first;
155
+ if (d.error) {
156
+ return this.decorate(mapServerError(d.error.code, d.error.message, d.error.data), req, target, meta);
157
+ }
158
+ if (d.redirect)
159
+ return { kind: 'redirect', redirection: d.redirect, meta };
160
+ return { kind: 'value', value: d.result, meta };
161
+ });
162
+ }
163
+ finally {
164
+ clear();
165
+ }
166
+ }
167
+ // ─── binary ───────────────────────────────────────────────────────────────
168
+ async binary(request) {
169
+ const id = nextRequestId();
170
+ const target = this.targetFor(request);
171
+ const body = this.encodeEnvelope(request.method, request.params, id, request.self);
172
+ const started = Date.now();
173
+ const { signal, clear } = createController({
174
+ signal: request.signal,
175
+ timeout: request.timeout ?? this.defaultTimeout,
176
+ requestId: String(id),
177
+ });
178
+ try {
179
+ const res = await safeFetch(target, {
180
+ method: 'POST',
181
+ headers: this.buildHeaders(request.credential, `${this.kernelContentType}, */*`),
182
+ body,
183
+ signal,
184
+ }, this.fetchImpl);
185
+ const meta = this.metaFromResponse(res, started, id);
186
+ const contentType = res.headers.get('content-type') ?? 'application/octet-stream';
187
+ // Binary flag — body is raw bytes of the declared content-type.
188
+ if (res.headers.get(BINARY_RESULT_HEADER) === 'true') {
189
+ return {
190
+ kind: 'binary',
191
+ response: {
192
+ contentType,
193
+ status: res.status,
194
+ body: res.body
195
+ ? res.body
196
+ : new Uint8Array(await res.arrayBuffer()),
197
+ },
198
+ meta,
199
+ };
200
+ }
201
+ // Otherwise it's an envelope — decode and surface error / redirect.
202
+ // A non-binary value for a binary method is a protocol error; we
203
+ // refuse to paper over it with a JSON-in-bytes fallback.
204
+ if (isEnvelopeContentType(contentType)) {
205
+ const decoded = decodeKernelResponse(this.codec.decode(new Uint8Array(await res.arrayBuffer())));
206
+ if (decoded.error) {
207
+ throw this.decorate(mapServerError(decoded.error.code, decoded.error.message, decoded.error.data), request, target, meta);
208
+ }
209
+ if (decoded.redirect) {
210
+ return { kind: 'redirect', redirection: decoded.redirect, meta };
211
+ }
212
+ throw this.decorate(new KernelError(`Expected binary response for "${request.method}" but server returned an envelope value`, KERNEL_ERROR_CODES.INTERNAL_ERROR, 'PROTOCOL_ERROR'), request, target, meta);
213
+ }
214
+ // Unknown content type — treat as bytes best-effort.
215
+ return {
216
+ kind: 'binary',
217
+ response: {
218
+ contentType,
219
+ status: res.status,
220
+ body: res.body
221
+ ? res.body
222
+ : new Uint8Array(await res.arrayBuffer()),
223
+ },
224
+ meta,
225
+ };
226
+ }
227
+ finally {
228
+ clear();
229
+ }
230
+ }
231
+ // ─── stream ───────────────────────────────────────────────────────────────
232
+ async stream(request) {
233
+ const id = nextRequestId();
234
+ const target = this.targetFor(request);
235
+ const body = this.encodeEnvelope(request.method, request.params, id, request.self);
236
+ const started = Date.now();
237
+ const { signal, clear } = createController({
238
+ signal: request.signal,
239
+ timeout: request.timeout ?? this.defaultTimeout,
240
+ requestId: String(id),
241
+ });
242
+ let res;
243
+ try {
244
+ res = await safeFetch(target, {
245
+ method: 'POST',
246
+ headers: this.buildHeaders(request.credential, 'text/event-stream'),
247
+ body,
248
+ signal,
249
+ }, this.fetchImpl);
250
+ }
251
+ catch (err) {
252
+ clear();
253
+ throw err;
254
+ }
255
+ const meta = this.metaFromResponse(res, started, id);
256
+ const contentType = res.headers.get('content-type') ?? '';
257
+ if (!contentType.includes('text/event-stream')) {
258
+ // Non-stream response is valid only as error or redirect — a server
259
+ // that returns an envelope value to a stream request is mis-typed.
260
+ try {
261
+ const decoded = decodeKernelResponse(this.codec.decode(new Uint8Array(await res.arrayBuffer())));
262
+ if (decoded.error) {
263
+ throw this.decorate(mapServerError(decoded.error.code, decoded.error.message, decoded.error.data), request, target, meta);
264
+ }
265
+ if (decoded.redirect) {
266
+ return { kind: 'redirect', redirection: decoded.redirect, meta };
267
+ }
268
+ throw this.decorate(new KernelError(`Expected SSE stream for "${request.method}" but server returned an envelope value`, KERNEL_ERROR_CODES.INTERNAL_ERROR, 'PROTOCOL_ERROR'), request, target, meta);
269
+ }
270
+ finally {
271
+ clear();
272
+ }
273
+ }
274
+ return {
275
+ kind: 'stream',
276
+ chunks: readEnvelopedSseChunks(res, request.signal, clear),
277
+ meta,
278
+ };
279
+ }
280
+ // ─── helpers ──────────────────────────────────────────────────────────────
281
+ encodeEnvelope(method, params, id, self) {
282
+ const envelope = encodeKernelRequest(method, params, id, self ? { self } : undefined);
283
+ const raw = this.codec.encode(envelope);
284
+ if (typeof raw === 'string')
285
+ return raw;
286
+ // Slice via byteOffset/byteLength so a Uint8Array backed by a
287
+ // shared/pooled ArrayBuffer doesn't leak adjacent bytes into the
288
+ // request body. msgpackr in particular returns subarrays of a
289
+ // reusable internal buffer.
290
+ return raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength);
291
+ }
292
+ buildHeaders(credential, accept) {
293
+ const headers = {
294
+ 'content-type': this.kernelContentType,
295
+ accept,
296
+ ...this.extraHeaders,
297
+ };
298
+ if (credential !== undefined && credential !== '' && credential !== null) {
299
+ headers['authorization'] = String(credential);
300
+ }
301
+ return headers;
302
+ }
303
+ targetFor(request) {
304
+ // A per-request `url` is a fully-qualified endpoint (e.g. a Function's
305
+ // `binding.remoteUrl` pointing at a specific aux route on a worker) —
306
+ // appending `/` would change the URL semantics and miss handlers
307
+ // mounted at the bare path. Only normalize the transport's base URL,
308
+ // which is a server root (kernel envelope) where a missing slash can
309
+ // trigger a 308 redirect round-trip.
310
+ if (request.url)
311
+ return request.url;
312
+ return this.url.endsWith('/') ? this.url : `${this.url}/`;
313
+ }
314
+ metaFromResponse(res, started, requestId) {
315
+ return {
316
+ requestId,
317
+ durationMs: Date.now() - started,
318
+ codec: this.codecName,
319
+ wire: { kind: 'http', status: res.status, headers: headersToRecord(res.headers) },
320
+ transport: this.name,
321
+ };
322
+ }
323
+ decorate(error, request, target, meta) {
324
+ if (!(error instanceof WebOSError))
325
+ return error;
326
+ const details = {
327
+ method: request.method,
328
+ params: request.params,
329
+ url: target,
330
+ transport: this.name,
331
+ correlationId: request.correlationId,
332
+ meta,
333
+ };
334
+ withDetails(error, details);
335
+ return error;
336
+ }
337
+ async retryingFetch(url, init) {
338
+ const userShouldRetry = this.retryOpts?.shouldRetry;
339
+ return kernelRetry(async () => {
340
+ const res = await safeFetch(url, init, this.fetchImpl);
341
+ if (isTransient(res.status)) {
342
+ const err = new Error(`HTTP ${res.status}`);
343
+ err.status = res.status;
344
+ throw err;
345
+ }
346
+ return res;
347
+ }, {
348
+ ...this.retryOpts,
349
+ shouldRetry: (error, attempt) => {
350
+ const status = error.status;
351
+ if (status !== undefined && !isTransient(status))
352
+ return false;
353
+ if (error.name === 'AbortError')
354
+ return false;
355
+ // Compose with any caller predicate — retry only if both agree.
356
+ if (userShouldRetry && !userShouldRetry(error, attempt))
357
+ return false;
358
+ return true;
359
+ },
360
+ });
361
+ }
362
+ }
363
+ // ─── Module-private helpers ────────────────────────────────────────────────
364
+ function isTransient(status) {
365
+ return status >= 500 || status === 429;
366
+ }
367
+ function isEnvelopeContentType(contentType) {
368
+ return (contentType.includes(KERNEL_CONTENT_TYPE_JSON) ||
369
+ contentType.includes(KERNEL_CONTENT_TYPE_MSGPACK) ||
370
+ contentType.includes('application/json') ||
371
+ contentType.includes('+json') ||
372
+ contentType.includes('+msgpack'));
373
+ }
374
+ /**
375
+ * Consume an enveloped SSE stream: each event carries a JSON-encoded
376
+ * kernel stream frame (`{ stream: { id, data | end | error } }`). Yields
377
+ * chunk data, returns on `end`, throws on `error`. SSE frames are always
378
+ * JSON-text on the wire (even under msgpack config) — the server emits
379
+ * text on the SSE channel regardless of the configured envelope codec.
380
+ */
381
+ async function* readEnvelopedSseChunks(res, callerSignal, onClose) {
382
+ for await (const block of readSseBlocks(res, callerSignal, onClose)) {
383
+ const event = parseEnvelopedSseEvent(block);
384
+ if (!event)
385
+ continue;
386
+ let payload;
387
+ try {
388
+ payload = JSON.parse(event.data);
389
+ }
390
+ catch {
391
+ continue;
392
+ }
393
+ const frame = parseStreamFrame(payload);
394
+ if (!frame)
395
+ continue;
396
+ if (frame.kind === 'chunk')
397
+ yield frame.data;
398
+ else if (frame.kind === 'end')
399
+ return;
400
+ else if (frame.kind === 'error') {
401
+ throw mapServerError(frame.error.code, frame.error.message, frame.error.data);
402
+ }
403
+ }
404
+ }
405
+ //# sourceMappingURL=http-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-envelope.js","sourceRoot":"","sources":["../../src/transport/http-envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Native HTTP routed transport.
3
+ *
4
+ * Speaks a function's route binding — method, path template, query,
5
+ * headers, body modes (`'*'`, `Record<string, BodyPick>`), configurable
6
+ * credential source. The peer of the kernel envelope: same function,
7
+ * different wire shape.
8
+ *
9
+ * Output modes:
10
+ * - value → JSON body (errors via HTTP status + `{ error: { code, … } }`)
11
+ * - stream → raw SSE (one event per yielded value, `event: end` / `event: error`)
12
+ * - binary → raw bytes with `Content-Type` from response headers
13
+ *
14
+ * `batch` is not supported — routed has no multi-request shape.
15
+ * `signal` is a fire-and-forget call.
16
+ *
17
+ * `url` is `undefined` — each call brings its own `remoteUrl` via the
18
+ * `RoutedTransportRequest`.
19
+ */
20
+ import type { RouteBinding } from '@astrale-os/kernel-api';
21
+ import type { SendBinaryResult, SendResult, SendStreamResult } from '../client/fn-map';
22
+ import type { BatchEntry, Transport, TransportRequest } from './contract';
23
+ /**
24
+ * Routed-specific request shape. Carries the route binding and remote
25
+ * URL — the client has already resolved those from the function's
26
+ * schema at dispatch time.
27
+ */
28
+ export type RoutedTransportRequest = TransportRequest & {
29
+ route: RouteBinding;
30
+ remoteUrl: string;
31
+ };
32
+ export type HttpRoutedTransportConfig = {
33
+ requestTimeout?: number;
34
+ headers?: Record<string, string>;
35
+ fetch?: typeof fetch;
36
+ };
37
+ export declare class HttpRoutedTransport implements Transport {
38
+ readonly name: 'http-routed';
39
+ readonly url: undefined;
40
+ private readonly defaultTimeout;
41
+ private readonly extraHeaders;
42
+ private readonly fetchImpl;
43
+ constructor(config?: HttpRoutedTransportConfig);
44
+ disconnect(): void;
45
+ call(request: TransportRequest): Promise<SendResult<unknown>>;
46
+ signal(request: TransportRequest): void;
47
+ binary(request: TransportRequest): Promise<SendBinaryResult>;
48
+ stream(request: TransportRequest): Promise<SendStreamResult<unknown>>;
49
+ batch(_requests: TransportRequest[]): Promise<BatchEntry[]>;
50
+ private narrow;
51
+ /**
52
+ * Build absolute URL + RequestInit for a routed call:
53
+ * 1) substitute host/path placeholders 2) append query 3) headers
54
+ * (incl. credential) 4) body per `route.body` mode.
55
+ */
56
+ private buildRequest;
57
+ private decodeError;
58
+ private metaFromResponse;
59
+ private decorate;
60
+ }
61
+ //# sourceMappingURL=http-routed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-routed.d.ts","sourceRoot":"","sources":["../../src/transport/http-routed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAmB,YAAY,EAA0B,MAAM,wBAAwB,CAAA;AAKnG,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEtF,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAezE;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG;IACtD,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB,CAAA;AAED,qBAAa,mBAAoB,YAAW,SAAS;IACnD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAS;IACtC,QAAQ,CAAC,GAAG,YAAY;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YAAY,MAAM,GAAE,yBAA8B,EAIjD;IAED,UAAU,IAAI,IAAI,CAEjB;IAIK,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAyBlE;IAID,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAYtC;IAIK,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAiCjE;IAIK,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAsC1E;IAIK,KAAK,CAAC,SAAS,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAEhE;IAID,OAAO,CAAC,MAAM;IAcd;;;;OAIG;IACH,OAAO,CAAC,YAAY;YA6HN,WAAW;IAuBzB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,QAAQ;CAkBjB"}