@jini-ai/http-kit 0.2.1

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 (227) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +107 -0
  3. package/dist/active-context.d.ts +99 -0
  4. package/dist/active-context.d.ts.map +1 -0
  5. package/dist/active-context.js +77 -0
  6. package/dist/active-context.js.map +1 -0
  7. package/dist/adapter.d.ts +36 -0
  8. package/dist/adapter.d.ts.map +1 -0
  9. package/dist/adapter.js +92 -0
  10. package/dist/adapter.js.map +1 -0
  11. package/dist/agents.d.ts +55 -0
  12. package/dist/agents.d.ts.map +1 -0
  13. package/dist/agents.js +23 -0
  14. package/dist/agents.js.map +1 -0
  15. package/dist/api-security-middleware.d.ts +146 -0
  16. package/dist/api-security-middleware.d.ts.map +1 -0
  17. package/dist/api-security-middleware.js +276 -0
  18. package/dist/api-security-middleware.js.map +1 -0
  19. package/dist/attachments.d.ts +317 -0
  20. package/dist/attachments.d.ts.map +1 -0
  21. package/dist/attachments.js +664 -0
  22. package/dist/attachments.js.map +1 -0
  23. package/dist/cancel-owned-runs.d.ts +44 -0
  24. package/dist/cancel-owned-runs.d.ts.map +1 -0
  25. package/dist/cancel-owned-runs.js +35 -0
  26. package/dist/cancel-owned-runs.js.map +1 -0
  27. package/dist/compat.d.ts +22 -0
  28. package/dist/compat.d.ts.map +1 -0
  29. package/dist/compat.js +17 -0
  30. package/dist/compat.js.map +1 -0
  31. package/dist/component-catalog.d.ts +74 -0
  32. package/dist/component-catalog.d.ts.map +1 -0
  33. package/dist/component-catalog.js +74 -0
  34. package/dist/component-catalog.js.map +1 -0
  35. package/dist/connectors.d.ts +165 -0
  36. package/dist/connectors.d.ts.map +1 -0
  37. package/dist/connectors.js +474 -0
  38. package/dist/connectors.js.map +1 -0
  39. package/dist/daemon-status.d.ts +72 -0
  40. package/dist/daemon-status.d.ts.map +1 -0
  41. package/dist/daemon-status.js +60 -0
  42. package/dist/daemon-status.js.map +1 -0
  43. package/dist/db-ops.d.ts +116 -0
  44. package/dist/db-ops.d.ts.map +1 -0
  45. package/dist/db-ops.js +191 -0
  46. package/dist/db-ops.js.map +1 -0
  47. package/dist/delegated-tools.d.ts +46 -0
  48. package/dist/delegated-tools.d.ts.map +1 -0
  49. package/dist/delegated-tools.js +155 -0
  50. package/dist/delegated-tools.js.map +1 -0
  51. package/dist/express/run-stream.d.ts +15 -0
  52. package/dist/express/run-stream.d.ts.map +1 -0
  53. package/dist/express/run-stream.js +11 -0
  54. package/dist/express/run-stream.js.map +1 -0
  55. package/dist/express-index.d.ts +32 -0
  56. package/dist/express-index.d.ts.map +1 -0
  57. package/dist/express-index.js +14 -0
  58. package/dist/express-index.js.map +1 -0
  59. package/dist/fastify/adapter.d.ts +31 -0
  60. package/dist/fastify/adapter.d.ts.map +1 -0
  61. package/dist/fastify/adapter.js +64 -0
  62. package/dist/fastify/adapter.js.map +1 -0
  63. package/dist/fastify/agents.d.ts +13 -0
  64. package/dist/fastify/agents.d.ts.map +1 -0
  65. package/dist/fastify/agents.js +7 -0
  66. package/dist/fastify/agents.js.map +1 -0
  67. package/dist/fastify/api-security-middleware.d.ts +64 -0
  68. package/dist/fastify/api-security-middleware.d.ts.map +1 -0
  69. package/dist/fastify/api-security-middleware.js +139 -0
  70. package/dist/fastify/api-security-middleware.js.map +1 -0
  71. package/dist/fastify/compat.d.ts +22 -0
  72. package/dist/fastify/compat.d.ts.map +1 -0
  73. package/dist/fastify/compat.js +16 -0
  74. package/dist/fastify/compat.js.map +1 -0
  75. package/dist/fastify/daemon-status.d.ts +22 -0
  76. package/dist/fastify/daemon-status.d.ts.map +1 -0
  77. package/dist/fastify/daemon-status.js +9 -0
  78. package/dist/fastify/daemon-status.js.map +1 -0
  79. package/dist/fastify/host-tools.d.ts +13 -0
  80. package/dist/fastify/host-tools.d.ts.map +1 -0
  81. package/dist/fastify/host-tools.js +8 -0
  82. package/dist/fastify/host-tools.js.map +1 -0
  83. package/dist/fastify/index.d.ts +36 -0
  84. package/dist/fastify/index.d.ts.map +1 -0
  85. package/dist/fastify/index.js +18 -0
  86. package/dist/fastify/index.js.map +1 -0
  87. package/dist/fastify/local-daemon-request.d.ts +43 -0
  88. package/dist/fastify/local-daemon-request.d.ts.map +1 -0
  89. package/dist/fastify/local-daemon-request.js +155 -0
  90. package/dist/fastify/local-daemon-request.js.map +1 -0
  91. package/dist/fastify/origin.d.ts +21 -0
  92. package/dist/fastify/origin.d.ts.map +1 -0
  93. package/dist/fastify/origin.js +14 -0
  94. package/dist/fastify/origin.js.map +1 -0
  95. package/dist/fastify/request.d.ts +20 -0
  96. package/dist/fastify/request.d.ts.map +1 -0
  97. package/dist/fastify/request.js +25 -0
  98. package/dist/fastify/request.js.map +1 -0
  99. package/dist/fastify/response.d.ts +20 -0
  100. package/dist/fastify/response.d.ts.map +1 -0
  101. package/dist/fastify/response.js +41 -0
  102. package/dist/fastify/response.js.map +1 -0
  103. package/dist/fastify/route-registration-guard.d.ts +70 -0
  104. package/dist/fastify/route-registration-guard.d.ts.map +1 -0
  105. package/dist/fastify/route-registration-guard.js +69 -0
  106. package/dist/fastify/route-registration-guard.js.map +1 -0
  107. package/dist/fastify/run-stream.d.ts +18 -0
  108. package/dist/fastify/run-stream.d.ts.map +1 -0
  109. package/dist/fastify/run-stream.js +10 -0
  110. package/dist/fastify/run-stream.js.map +1 -0
  111. package/dist/fastify/runs.d.ts +17 -0
  112. package/dist/fastify/runs.d.ts.map +1 -0
  113. package/dist/fastify/runs.js +33 -0
  114. package/dist/fastify/runs.js.map +1 -0
  115. package/dist/frontend-control.d.ts +131 -0
  116. package/dist/frontend-control.d.ts.map +1 -0
  117. package/dist/frontend-control.js +77 -0
  118. package/dist/frontend-control.js.map +1 -0
  119. package/dist/frontend-sessions.d.ts +100 -0
  120. package/dist/frontend-sessions.d.ts.map +1 -0
  121. package/dist/frontend-sessions.js +180 -0
  122. package/dist/frontend-sessions.js.map +1 -0
  123. package/dist/health.d.ts +91 -0
  124. package/dist/health.d.ts.map +1 -0
  125. package/dist/health.js +53 -0
  126. package/dist/health.js.map +1 -0
  127. package/dist/host-tools.d.ts +174 -0
  128. package/dist/host-tools.d.ts.map +1 -0
  129. package/dist/host-tools.js +338 -0
  130. package/dist/host-tools.js.map +1 -0
  131. package/dist/index.d.ts +86 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +40 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/local-daemon-request.d.ts +44 -0
  136. package/dist/local-daemon-request.d.ts.map +1 -0
  137. package/dist/local-daemon-request.js +145 -0
  138. package/dist/local-daemon-request.js.map +1 -0
  139. package/dist/media.d.ts +131 -0
  140. package/dist/media.d.ts.map +1 -0
  141. package/dist/media.js +352 -0
  142. package/dist/media.js.map +1 -0
  143. package/dist/memory.d.ts +230 -0
  144. package/dist/memory.d.ts.map +1 -0
  145. package/dist/memory.js +331 -0
  146. package/dist/memory.js.map +1 -0
  147. package/dist/model-proxy.d.ts +45 -0
  148. package/dist/model-proxy.d.ts.map +1 -0
  149. package/dist/model-proxy.js +619 -0
  150. package/dist/model-proxy.js.map +1 -0
  151. package/dist/origin-validation.d.ts +64 -0
  152. package/dist/origin-validation.d.ts.map +1 -0
  153. package/dist/origin-validation.js +226 -0
  154. package/dist/origin-validation.js.map +1 -0
  155. package/dist/origin.d.ts +32 -0
  156. package/dist/origin.d.ts.map +1 -0
  157. package/dist/origin.js +14 -0
  158. package/dist/origin.js.map +1 -0
  159. package/dist/pack-http.d.ts +30 -0
  160. package/dist/pack-http.d.ts.map +1 -0
  161. package/dist/pack-http.js +12 -0
  162. package/dist/pack-http.js.map +1 -0
  163. package/dist/raw-sse.d.ts +44 -0
  164. package/dist/raw-sse.d.ts.map +1 -0
  165. package/dist/raw-sse.js +93 -0
  166. package/dist/raw-sse.js.map +1 -0
  167. package/dist/remote-run-events.d.ts +66 -0
  168. package/dist/remote-run-events.d.ts.map +1 -0
  169. package/dist/remote-run-events.js +230 -0
  170. package/dist/remote-run-events.js.map +1 -0
  171. package/dist/request.d.ts +19 -0
  172. package/dist/request.d.ts.map +1 -0
  173. package/dist/request.js +25 -0
  174. package/dist/request.js.map +1 -0
  175. package/dist/research.d.ts +42 -0
  176. package/dist/research.d.ts.map +1 -0
  177. package/dist/research.js +316 -0
  178. package/dist/research.js.map +1 -0
  179. package/dist/response.d.ts +14 -0
  180. package/dist/response.d.ts.map +1 -0
  181. package/dist/response.js +45 -0
  182. package/dist/response.js.map +1 -0
  183. package/dist/route-manifest.d.ts +31 -0
  184. package/dist/route-manifest.d.ts.map +1 -0
  185. package/dist/route-manifest.js +103 -0
  186. package/dist/route-manifest.js.map +1 -0
  187. package/dist/route-registration-guard.d.ts +65 -0
  188. package/dist/route-registration-guard.d.ts.map +1 -0
  189. package/dist/route-registration-guard.js +71 -0
  190. package/dist/route-registration-guard.js.map +1 -0
  191. package/dist/routines.d.ts +114 -0
  192. package/dist/routines.d.ts.map +1 -0
  193. package/dist/routines.js +320 -0
  194. package/dist/routines.js.map +1 -0
  195. package/dist/run-stream.d.ts +60 -0
  196. package/dist/run-stream.d.ts.map +1 -0
  197. package/dist/run-stream.js +108 -0
  198. package/dist/run-stream.js.map +1 -0
  199. package/dist/runs.d.ts +79 -0
  200. package/dist/runs.d.ts.map +1 -0
  201. package/dist/runs.js +232 -0
  202. package/dist/runs.js.map +1 -0
  203. package/dist/sse.d.ts +139 -0
  204. package/dist/sse.d.ts.map +1 -0
  205. package/dist/sse.js +157 -0
  206. package/dist/sse.js.map +1 -0
  207. package/dist/terminals.d.ts +125 -0
  208. package/dist/terminals.d.ts.map +1 -0
  209. package/dist/terminals.js +349 -0
  210. package/dist/terminals.js.map +1 -0
  211. package/dist/tool-catalog.d.ts +68 -0
  212. package/dist/tool-catalog.d.ts.map +1 -0
  213. package/dist/tool-catalog.js +68 -0
  214. package/dist/tool-catalog.js.map +1 -0
  215. package/dist/types.d.ts +58 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +5 -0
  218. package/dist/types.js.map +1 -0
  219. package/dist/workspace-root.d.ts +69 -0
  220. package/dist/workspace-root.d.ts.map +1 -0
  221. package/dist/workspace-root.js +63 -0
  222. package/dist/workspace-root.js.map +1 -0
  223. package/dist/xai.d.ts +86 -0
  224. package/dist/xai.d.ts.map +1 -0
  225. package/dist/xai.js +668 -0
  226. package/dist/xai.js.map +1 -0
  227. package/package.json +58 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-proxy.js","sourceRoot":"","sources":["../src/model-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Same-origin / allow-listed-origin validation primitives for a locally-bound HTTP server:
3
+ * loopback + private-LAN host/IP classification, an explicit origin allow-list read from env,
4
+ * and the top-level `isLocalSameOrigin` decision `origin-guard.ts` wraps in the module's
5
+ * `Result` pipeline. Framework-independent — operates on plain header values, not an Express
6
+ * `Request`.
7
+ */
8
+ export interface ParsedHostHeader {
9
+ hostname: string;
10
+ host: string;
11
+ port: string;
12
+ }
13
+ export interface RequestWithOriginHeaders {
14
+ headers?: {
15
+ host?: unknown;
16
+ origin?: unknown;
17
+ 'sec-fetch-site'?: unknown;
18
+ };
19
+ }
20
+ /**
21
+ * Extra allow-listed origins, comma-separated, read from `JINI_ALLOWED_ORIGINS`.
22
+ *
23
+ * Deliberately never throws. This runs inside {@link isLocalSameOrigin}, which every same-origin
24
+ * check across the whole HTTP surface calls fresh on every incoming request — a config typo here
25
+ * used to throw a `TypeError` synchronously, and depending on which route it happened to hit, that
26
+ * either 500'd every request for the process's life or, worse, became an unhandled promise
27
+ * rejection with nothing to catch it (`attachments.ts`'s hand-mounted routes, `model-proxy.ts`'s
28
+ * `:provider` catch-all — see each file's own regression test). A malformed entry is dropped from
29
+ * the allow-list and logged instead, so the daemon degrades to "one fewer trusted origin," never
30
+ * "every request breaks." Call {@link assertValidAllowedOrigins} once at host startup to catch a
31
+ * misconfiguration loudly before any request-serving traffic exists at all — that is where a typo
32
+ * should actually be caught, not on the hot path.
33
+ */
34
+ export declare function configuredAllowedOrigins(env?: NodeJS.ProcessEnv): string[];
35
+ /**
36
+ * Boot-time companion to {@link configuredAllowedOrigins}: throws, naming every malformed entry,
37
+ * instead of silently dropping them. Meant to be called exactly once, early in host startup
38
+ * (before the HTTP server accepts connections), so a misconfigured `JINI_ALLOWED_ORIGINS` fails
39
+ * the boot loudly rather than quietly serving with a smaller-than-intended allow-list — or, before
40
+ * this function existed, throwing on the first request that happened to reach the same-origin
41
+ * guard instead of at boot.
42
+ */
43
+ export declare function assertValidAllowedOrigins(env?: NodeJS.ProcessEnv): void;
44
+ export declare function configuredAllowedHosts(origins?: string[]): string[];
45
+ /** The primary bound port plus an optional secondary web port from `JINI_WEB_PORT`. */
46
+ export declare function allowedBrowserPorts(port: number | string | null | undefined, env?: NodeJS.ProcessEnv): number[];
47
+ export declare function parseHostHeader(value: unknown): ParsedHostHeader | null;
48
+ export declare function isPrivateIpv4(hostname: unknown): boolean;
49
+ export declare function isIpLiteralHostname(hostname: unknown): boolean;
50
+ export declare function isLoopbackOrPrivateLanHost(hostname: unknown): boolean;
51
+ export declare function isAllowedBrowserHost(hostHeader: unknown, ports: number[], bindHost: string, extraAllowedOrigins: string[]): boolean;
52
+ export declare function isAllowedBrowserOrigin(origin: unknown, hostHeader: unknown, ports: number[], bindHost: string, extraAllowedOrigins: string[]): boolean;
53
+ /**
54
+ * Top-level same-origin decision for a locally-bound HTTP server: same-origin GETs (which
55
+ * browsers may send with no `Origin` header per the Fetch spec) are accepted via the `Host`
56
+ * header + `Sec-Fetch-Site: same-origin` signal (a header set by the user agent, unforgeable
57
+ * from JavaScript); cross-origin requests must present an `Origin` that resolves to a loopback,
58
+ * private-LAN, or explicitly allow-listed (`JINI_ALLOWED_ORIGINS`) origin. Reverse-proxy
59
+ * deployments are supported by trusting an `Origin` that exactly matches an allow-listed entry,
60
+ * since the `Host` header a proxied daemon sees is the proxy's upstream address, not the
61
+ * browser-visible origin.
62
+ */
63
+ export declare function isLocalSameOrigin(req: RequestWithOriginHeaders, port: number | string | null | undefined, env?: NodeJS.ProcessEnv): boolean;
64
+ //# sourceMappingURL=origin-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-validation.d.ts","sourceRoot":"","sources":["../src/origin-validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,CAAC;CACH;AA6BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,EAAE,CAavF;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,IAAI,CAOpF;AAED,wBAAgB,sBAAsB,CAAC,OAAO,WAA6B,GAAG,MAAM,EAAE,CAErF;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,EAAE,CAOV;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CASvE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAaxD;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAQ9D;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAWrE;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,OAAO,CAaT;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,UAAU,EAAE,OAAO,EACnB,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,MAAM,EAAE,GAC5B,OAAO,CA4BT;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,wBAAwB,EAC7B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAsBT"}
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Same-origin / allow-listed-origin validation primitives for a locally-bound HTTP server:
3
+ * loopback + private-LAN host/IP classification, an explicit origin allow-list read from env,
4
+ * and the top-level `isLocalSameOrigin` decision `origin-guard.ts` wraps in the module's
5
+ * `Result` pipeline. Framework-independent — operates on plain header values, not an Express
6
+ * `Request`.
7
+ */
8
+ /**
9
+ * Splits and trims the raw `JINI_ALLOWED_ORIGINS` value into individual candidate entries.
10
+ * Shared by {@link configuredAllowedOrigins} (lenient, per-request) and
11
+ * {@link assertValidAllowedOrigins} (strict, boot-time) so the two can never drift on what counts
12
+ * as "one entry."
13
+ */
14
+ function splitAllowedOriginsEnv(env) {
15
+ const raw = env.JINI_ALLOWED_ORIGINS || '';
16
+ if (!raw.trim())
17
+ return [];
18
+ return raw
19
+ .split(',')
20
+ .map((origin) => origin.trim())
21
+ .filter(Boolean);
22
+ }
23
+ /** Normalizes one `JINI_ALLOWED_ORIGINS` entry into a `protocol://host` origin, or `undefined` if it isn't a valid http(s) origin. */
24
+ function parseAllowedOrigin(entry) {
25
+ let parsed;
26
+ try {
27
+ parsed = new URL(entry);
28
+ }
29
+ catch {
30
+ return undefined;
31
+ }
32
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
33
+ return undefined;
34
+ return parsed.origin;
35
+ }
36
+ /**
37
+ * Extra allow-listed origins, comma-separated, read from `JINI_ALLOWED_ORIGINS`.
38
+ *
39
+ * Deliberately never throws. This runs inside {@link isLocalSameOrigin}, which every same-origin
40
+ * check across the whole HTTP surface calls fresh on every incoming request — a config typo here
41
+ * used to throw a `TypeError` synchronously, and depending on which route it happened to hit, that
42
+ * either 500'd every request for the process's life or, worse, became an unhandled promise
43
+ * rejection with nothing to catch it (`attachments.ts`'s hand-mounted routes, `model-proxy.ts`'s
44
+ * `:provider` catch-all — see each file's own regression test). A malformed entry is dropped from
45
+ * the allow-list and logged instead, so the daemon degrades to "one fewer trusted origin," never
46
+ * "every request breaks." Call {@link assertValidAllowedOrigins} once at host startup to catch a
47
+ * misconfiguration loudly before any request-serving traffic exists at all — that is where a typo
48
+ * should actually be caught, not on the hot path.
49
+ */
50
+ export function configuredAllowedOrigins(env = process.env) {
51
+ const origins = [];
52
+ for (const entry of splitAllowedOriginsEnv(env)) {
53
+ const origin = parseAllowedOrigin(entry);
54
+ if (origin === undefined) {
55
+ console.warn(`[@jini-ai/http-kit] ignoring malformed JINI_ALLOWED_ORIGINS entry (must be an http:// or https:// origin): ${entry}`);
56
+ continue;
57
+ }
58
+ origins.push(origin);
59
+ }
60
+ return origins;
61
+ }
62
+ /**
63
+ * Boot-time companion to {@link configuredAllowedOrigins}: throws, naming every malformed entry,
64
+ * instead of silently dropping them. Meant to be called exactly once, early in host startup
65
+ * (before the HTTP server accepts connections), so a misconfigured `JINI_ALLOWED_ORIGINS` fails
66
+ * the boot loudly rather than quietly serving with a smaller-than-intended allow-list — or, before
67
+ * this function existed, throwing on the first request that happened to reach the same-origin
68
+ * guard instead of at boot.
69
+ */
70
+ export function assertValidAllowedOrigins(env = process.env) {
71
+ const invalid = splitAllowedOriginsEnv(env).filter((entry) => parseAllowedOrigin(entry) === undefined);
72
+ if (invalid.length === 0)
73
+ return;
74
+ throw new Error(`JINI_ALLOWED_ORIGINS has ${invalid.length} invalid entr${invalid.length === 1 ? 'y' : 'ies'} ` +
75
+ `(must be http:// or https:// origins): ${invalid.join(', ')}`);
76
+ }
77
+ export function configuredAllowedHosts(origins = configuredAllowedOrigins()) {
78
+ return origins.map((origin) => new URL(origin).host);
79
+ }
80
+ /** The primary bound port plus an optional secondary web port from `JINI_WEB_PORT`. */
81
+ export function allowedBrowserPorts(port, env = process.env) {
82
+ const ports = [];
83
+ const primary = Number(port);
84
+ if (primary)
85
+ ports.push(primary);
86
+ const webPort = Number(env.JINI_WEB_PORT);
87
+ if (webPort && webPort !== primary)
88
+ ports.push(webPort);
89
+ return ports;
90
+ }
91
+ export function parseHostHeader(value) {
92
+ const raw = String(headerValue(value) || '').trim();
93
+ if (!raw)
94
+ return null;
95
+ try {
96
+ const parsed = new URL(`http://${raw}`);
97
+ return { hostname: parsed.hostname, host: parsed.host, port: parsed.port || '80' };
98
+ }
99
+ catch {
100
+ return null;
101
+ }
102
+ }
103
+ export function isPrivateIpv4(hostname) {
104
+ const parts = String(hostname || '').split('.');
105
+ if (parts.length !== 4)
106
+ return false;
107
+ if (!parts.every((part) => /^\d+$/.test(part)))
108
+ return false;
109
+ const octets = parts.map((part) => Number(part));
110
+ if (!octets.every((n) => Number.isInteger(n) && n >= 0 && n <= 255))
111
+ return false;
112
+ const [a, b] = octets;
113
+ return (a === 10 ||
114
+ (a === 172 && b >= 16 && b <= 31) ||
115
+ (a === 192 && b === 168) ||
116
+ (a === 169 && b === 254));
117
+ }
118
+ export function isIpLiteralHostname(hostname) {
119
+ const host = String(hostname || '').trim();
120
+ if (!host)
121
+ return false;
122
+ if (host.startsWith('[') && host.endsWith(']'))
123
+ return true;
124
+ const parts = host.split('.');
125
+ if (parts.length !== 4)
126
+ return false;
127
+ if (!parts.every((part) => /^\d+$/.test(part)))
128
+ return false;
129
+ return parts.map(Number).every((n) => Number.isInteger(n) && n >= 0 && n <= 255);
130
+ }
131
+ export function isLoopbackOrPrivateLanHost(hostname) {
132
+ const host = String(hostname || '').toLowerCase();
133
+ return (host === 'localhost' ||
134
+ host === '127.0.0.1' ||
135
+ host === '::1' ||
136
+ host === '[::1]' ||
137
+ host === '0.0.0.0' ||
138
+ host === '::' ||
139
+ isPrivateIpv4(host));
140
+ }
141
+ export function isAllowedBrowserHost(hostHeader, ports, bindHost, extraAllowedOrigins) {
142
+ const requestHost = parseHostHeader(hostHeader);
143
+ if (!requestHost)
144
+ return false;
145
+ const loopbackHosts = ['127.0.0.1', 'localhost', '[::1]'];
146
+ const explicitHosts = new Set([
147
+ ...ports.flatMap((p) => [...loopbackHosts.map((h) => `${h}:${p}`), `${bindHost}:${p}`]),
148
+ ...configuredAllowedHosts(extraAllowedOrigins),
149
+ ]);
150
+ if (explicitHosts.has(requestHost.host))
151
+ return true;
152
+ if (!ports.map(String).includes(requestHost.port))
153
+ return false;
154
+ return isLoopbackOrPrivateLanHost(requestHost.hostname);
155
+ }
156
+ export function isAllowedBrowserOrigin(origin, hostHeader, ports, bindHost, extraAllowedOrigins) {
157
+ if (extraAllowedOrigins.includes(String(origin)))
158
+ return true;
159
+ let parsedOrigin;
160
+ try {
161
+ parsedOrigin = new URL(String(origin));
162
+ }
163
+ catch {
164
+ return false;
165
+ }
166
+ if (parsedOrigin.protocol !== 'http:' && parsedOrigin.protocol !== 'https:')
167
+ return false;
168
+ const requestHost = parseHostHeader(hostHeader);
169
+ if (!requestHost)
170
+ return false;
171
+ const schemes = ['http', 'https'];
172
+ const loopbackHosts = ['127.0.0.1', 'localhost', '[::1]'];
173
+ const explicitOrigins = new Set(ports.flatMap((p) => [
174
+ ...schemes.flatMap((s) => loopbackHosts.map((h) => `${s}://${h}:${p}`)),
175
+ ...schemes.map((s) => `${s}://${bindHost}:${p}`),
176
+ ]));
177
+ if (explicitOrigins.has(String(origin)))
178
+ return true;
179
+ const originPort = parsedOrigin.port || (parsedOrigin.protocol === 'https:' ? '443' : '80');
180
+ if (!ports.map(String).includes(originPort))
181
+ return false;
182
+ if (parsedOrigin.hostname !== requestHost.hostname)
183
+ return false;
184
+ return isLoopbackOrPrivateLanHost(parsedOrigin.hostname);
185
+ }
186
+ /**
187
+ * Top-level same-origin decision for a locally-bound HTTP server: same-origin GETs (which
188
+ * browsers may send with no `Origin` header per the Fetch spec) are accepted via the `Host`
189
+ * header + `Sec-Fetch-Site: same-origin` signal (a header set by the user agent, unforgeable
190
+ * from JavaScript); cross-origin requests must present an `Origin` that resolves to a loopback,
191
+ * private-LAN, or explicitly allow-listed (`JINI_ALLOWED_ORIGINS`) origin. Reverse-proxy
192
+ * deployments are supported by trusting an `Origin` that exactly matches an allow-listed entry,
193
+ * since the `Host` header a proxied daemon sees is the proxy's upstream address, not the
194
+ * browser-visible origin.
195
+ */
196
+ export function isLocalSameOrigin(req, port, env = process.env) {
197
+ const host = String(headerValue(req.headers?.host) || '');
198
+ const origin = headerValue(req.headers?.origin);
199
+ const ports = allowedBrowserPorts(port, env);
200
+ const bindHost = env.JINI_BIND_HOST || '127.0.0.1';
201
+ const extraAllowedOrigins = configuredAllowedOrigins(env);
202
+ const ipOnlyExtraOrigins = extraAllowedOrigins.filter((o) => isIpLiteralHostname(new URL(o).hostname));
203
+ const localHostAllowed = isAllowedBrowserHost(host, ports, bindHost, ipOnlyExtraOrigins);
204
+ if (origin == null || origin === '') {
205
+ if (localHostAllowed)
206
+ return true;
207
+ const fetchSite = headerValue(req.headers?.['sec-fetch-site']);
208
+ if (fetchSite === 'same-origin') {
209
+ return isAllowedBrowserHost(host, ports, bindHost, extraAllowedOrigins);
210
+ }
211
+ return false;
212
+ }
213
+ if (extraAllowedOrigins.includes(origin))
214
+ return true;
215
+ if (!isAllowedBrowserHost(host, ports, bindHost, extraAllowedOrigins))
216
+ return false;
217
+ return isAllowedBrowserOrigin(origin, host, ports, bindHost, extraAllowedOrigins);
218
+ }
219
+ function headerValue(value) {
220
+ if (Array.isArray(value)) {
221
+ const first = value[0];
222
+ return first == null ? undefined : String(first);
223
+ }
224
+ return value == null ? undefined : String(value);
225
+ }
226
+ //# sourceMappingURL=origin-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin-validation.js","sourceRoot":"","sources":["../src/origin-validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Same-origin security guard: wraps `isLocalSameOrigin` in the module's `Result` pipeline so
3
+ * the Adapter can treat an origin failure the same as a parse/handle failure.
4
+ */
5
+ import type { Request } from 'express';
6
+ import { type Result } from './types.js';
7
+ /** The subset of server startup state `guardSameOrigin` needs: the resolved local port, and the
8
+ * environment the origin policy is read from. */
9
+ export interface OriginContext {
10
+ resolvedPortRef: {
11
+ current: number;
12
+ };
13
+ /**
14
+ * Environment `JINI_BIND_HOST`, `JINI_ALLOWED_ORIGINS` and `JINI_WEB_PORT` are read from.
15
+ *
16
+ * @default `process.env`
17
+ *
18
+ * Present because a host can inject its own environment (`@jini-ai/server`'s
19
+ * `createLocalNodeDaemon`/`composeJiniKernel` `env` option), and that injection already reaches
20
+ * the origin-guard *middleware* — which is handed an explicit `env`. Without the same seam here,
21
+ * the two halves of one decision read two different environments: the middleware admits an origin
22
+ * the host configured and the per-route guard then rejects it, or a bind host the host never set
23
+ * decides what counts as same-origin.
24
+ */
25
+ env?: NodeJS.ProcessEnv;
26
+ }
27
+ /**
28
+ * Wraps `isLocalSameOrigin` so the HTTP Adapter can fold the origin decision into the same
29
+ * error-handling pipeline as parse/handle failures.
30
+ */
31
+ export declare function guardSameOrigin(req: Request, origin: OriginContext): Result<void>;
32
+ //# sourceMappingURL=origin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.d.ts","sourceRoot":"","sources":["../src/origin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAGvC,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD;iDACiD;AACjD,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACrC;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAKjF"}
package/dist/origin.js ADDED
@@ -0,0 +1,14 @@
1
+ import { createApiError } from '@jini-ai/protocol';
2
+ import { isLocalSameOrigin } from './origin-validation.js';
3
+ import { err, ok } from './types.js';
4
+ /**
5
+ * Wraps `isLocalSameOrigin` so the HTTP Adapter can fold the origin decision into the same
6
+ * error-handling pipeline as parse/handle failures.
7
+ */
8
+ export function guardSameOrigin(req, origin) {
9
+ if (isLocalSameOrigin(req, origin.resolvedPortRef.current, origin.env ?? process.env)) {
10
+ return ok(undefined);
11
+ }
12
+ return err(createApiError('FORBIDDEN', 'cross-origin request rejected'));
13
+ }
14
+ //# sourceMappingURL=origin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"origin.js","sourceRoot":"","sources":["../src/origin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,YAAY,CAAC;AAqBlD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,MAAqB;IACjE,IAAI,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,+BAA+B,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Route-pack registrar: mounts every composed pack's `http` registrar (`Pack.http`, typed
3
+ * `(app: unknown, services) => void` in `@jini-ai/core` so the kernel never depends on any one HTTP
4
+ * framework) onto a concrete app instance. This is the piece of extraction-plan.md §3's
5
+ * "@jini-ai/http-kit — HTTP/SSE transport + route-pack registrar" that ties a `Daemon` composed by
6
+ * `createDaemon` to a real HTTP surface: a pack that declares an `http(app, services)` function
7
+ * gets called with the *same* app and the *same* services object `@jini-ai/cli` would receive via
8
+ * `Pack.cli` (extraction-plan.md §2.3). `app` is typed `unknown` here (mirroring `Pack.http`'s own
9
+ * signature) rather than a concrete Express app type, since this registrar itself never touches
10
+ * `app` beyond passing it straight through to each pack's own `http(app, services)`.
11
+ *
12
+ * Injecting an `ExecutionDelegate` for the tool-execution boundary (extraction-plan.md §2.5,
13
+ * §10 task 6) is explicitly out of scope here — no `ToolExecutor` exists in this codebase yet.
14
+ * `mountPackHttp` only wires the transport-neutral pack composition already built in
15
+ * `@jini-ai/core`; a future task adds delegate injection once the boundary itself exists.
16
+ *
17
+ * **Note for pack authors:** a pack's own `http(app, services)` registrar receives the concrete
18
+ * Express instance the caller assembled — write it against Express's own API, or (preferred) build
19
+ * it on `@jini-ai/http-kit`'s own `defineJsonRoute`/`mountJsonRoute`.
20
+ */
21
+ import type { Daemon, Pack } from '@jini-ai/core';
22
+ type AnyPack = Pack<any, any, string>;
23
+ /**
24
+ * Calls `pack.http(app, services)` for every pack in `packs` that declares an `http` registrar,
25
+ * passing the services object `createDaemon` already composed for that pack. Packs with no
26
+ * `http` registrar (e.g. a CLI-only or headless pack) are skipped.
27
+ */
28
+ export declare function mountPackHttp<const Packs extends readonly AnyPack[]>(app: unknown, packs: Packs, daemon: Daemon<Packs>): void;
29
+ export {};
30
+ //# sourceMappingURL=pack-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-http.d.ts","sourceRoot":"","sources":["../src/pack-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAElD,KAAK,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAEtC;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAClE,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GACpB,IAAI,CAKN"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Calls `pack.http(app, services)` for every pack in `packs` that declares an `http` registrar,
3
+ * passing the services object `createDaemon` already composed for that pack. Packs with no
4
+ * `http` registrar (e.g. a CLI-only or headless pack) are skipped.
5
+ */
6
+ export function mountPackHttp(app, packs, daemon) {
7
+ const services = daemon.services;
8
+ for (const pack of packs) {
9
+ pack.http?.(app, services[pack.name]);
10
+ }
11
+ }
12
+ //# sourceMappingURL=pack-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack-http.js","sourceRoot":"","sources":["../src/pack-http.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAY,EACZ,KAAY,EACZ,MAAqB;IAErB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAmC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @module sse
3
+ *
4
+ * A Server-Sent Events primitive typed only against `node:http`'s `IncomingMessage`/
5
+ * `ServerResponse` — Express's `req`/`res` already satisfy these directly (`Response` extends
6
+ * `http.ServerResponse`), so `frontend-sessions.ts`'s `handleFrontendSessionStream` hands them
7
+ * straight through with no adapter of its own.
8
+ */
9
+ import type { IncomingMessage, ServerResponse } from 'node:http';
10
+ /**
11
+ * Cap on messages buffered for one client while its socket reports backpressure. Mirrors
12
+ * `sse.ts`'s `DEFAULT_MAX_QUEUED_SSE_EVENTS` (SEC-006) — the two SSE primitives in this package
13
+ * should not disagree about how much a stalled consumer may cost the server. Once exceeded the
14
+ * connection is dropped rather than growing memory without bound.
15
+ */
16
+ export declare const DEFAULT_MAX_QUEUED_SSE_MESSAGES = 1000;
17
+ export interface CreateSseResponseOptions {
18
+ /** Milliseconds between keepalive ping comment lines, sent to keep an idle connection from being closed by an intermediary/timeout. Defaults to 15000. */
19
+ readonly keepAliveMs?: number;
20
+ /** Invoked exactly once, the first time this connection closes for any reason (an explicit `close()` call, or the client disconnecting) — the caller's seam for its own cleanup (e.g. unsubscribing from an event source). */
21
+ readonly onClose?: () => void;
22
+ /** Buffered-message ceiling before the connection is dropped. Defaults to {@link DEFAULT_MAX_QUEUED_SSE_MESSAGES}. */
23
+ readonly maxQueuedMessages?: number;
24
+ }
25
+ export interface SseConnection {
26
+ /** Writes one SSE `data:` event, JSON-serializing `data`. A no-op once the connection has closed. */
27
+ send(data: unknown): void;
28
+ /** Closes the connection: stops the keepalive interval and ends the response. Idempotent — safe to call more than once, or after the client has already disconnected. */
29
+ close(): void;
30
+ /** `true` once this connection has closed, whether via an explicit `close()` call or the client disconnecting. */
31
+ readonly closed: boolean;
32
+ }
33
+ /**
34
+ * Opens `res` as a Server-Sent Events stream: writes the `text/event-stream` response headers
35
+ * immediately, arms a keepalive interval, and wires client-disconnect detection.
36
+ *
37
+ * @param req - The raw request (Express's `Request` already satisfies this).
38
+ * @param res - The raw response (Express's `Response` already satisfies this).
39
+ * @returns An `SseConnection` the caller pushes events through and closes when done.
40
+ * @complexity O(1) to open; `send` is O(1) plus `JSON.stringify`'s cost in the payload's size.
41
+ * @overallScore 100/100
42
+ */
43
+ export declare function createSseResponse(req: IncomingMessage, res: ServerResponse, options?: CreateSseResponseOptions): SseConnection;
44
+ //# sourceMappingURL=raw-sse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-sse.d.ts","sourceRoot":"","sources":["../src/raw-sse.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,OAAO,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,0JAA0J;IAC1J,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,8NAA8N;IAC9N,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,sHAAsH;IACtH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,yKAAyK;IACzK,KAAK,IAAI,IAAI,CAAC;IACd,kHAAkH;IAClH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE,wBAA6B,GACrC,aAAa,CA+Ef"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Cap on messages buffered for one client while its socket reports backpressure. Mirrors
3
+ * `sse.ts`'s `DEFAULT_MAX_QUEUED_SSE_EVENTS` (SEC-006) — the two SSE primitives in this package
4
+ * should not disagree about how much a stalled consumer may cost the server. Once exceeded the
5
+ * connection is dropped rather than growing memory without bound.
6
+ */
7
+ export const DEFAULT_MAX_QUEUED_SSE_MESSAGES = 1000;
8
+ /**
9
+ * Opens `res` as a Server-Sent Events stream: writes the `text/event-stream` response headers
10
+ * immediately, arms a keepalive interval, and wires client-disconnect detection.
11
+ *
12
+ * @param req - The raw request (Express's `Request` already satisfies this).
13
+ * @param res - The raw response (Express's `Response` already satisfies this).
14
+ * @returns An `SseConnection` the caller pushes events through and closes when done.
15
+ * @complexity O(1) to open; `send` is O(1) plus `JSON.stringify`'s cost in the payload's size.
16
+ * @overallScore 100/100
17
+ */
18
+ export function createSseResponse(req, res, options = {}) {
19
+ let closed = false;
20
+ const maxQueuedMessages = options.maxQueuedMessages ?? DEFAULT_MAX_QUEUED_SSE_MESSAGES;
21
+ // Frames held back because the socket reported backpressure, flushed on `'drain'`. Every write
22
+ // this connection makes — events and keepalive pings alike — goes through this queue, so there is
23
+ // no second path that could bypass the bound.
24
+ const queue = [];
25
+ let writable = true;
26
+ res.writeHead(200, {
27
+ 'Content-Type': 'text/event-stream',
28
+ 'Cache-Control': 'no-cache, no-transform',
29
+ Connection: 'keep-alive',
30
+ });
31
+ /**
32
+ * Writes as much of the queue as the socket will accept. `res.write()` returning `false` means
33
+ * Node has buffered the frame internally and wants no more until `'drain'` — ignoring that (as
34
+ * this primitive used to) lets a client that simply stops reading accumulate the entire output of
35
+ * a run in memory, which is a denial of service reachable by anyone who can open a stream.
36
+ */
37
+ function pump() {
38
+ while (!closed && writable && queue.length > 0) {
39
+ const frame = queue.shift();
40
+ if (res.write(frame) === false)
41
+ writable = false;
42
+ }
43
+ }
44
+ /**
45
+ * Queues one frame, dropping the connection if the backlog has outgrown its bound. Disconnecting
46
+ * a stalled client is the deliberate choice over either growing without limit or silently
47
+ * discarding frames — a consumer that missed events in the middle of a stream cannot tell, while
48
+ * a closed stream is an observable signal it can reconnect from.
49
+ */
50
+ function enqueue(frame) {
51
+ if (closed)
52
+ return;
53
+ if (queue.length >= maxQueuedMessages) {
54
+ close();
55
+ return;
56
+ }
57
+ queue.push(frame);
58
+ pump();
59
+ }
60
+ const keepAliveMs = options.keepAliveMs ?? 15_000;
61
+ const keepAliveTimer = setInterval(() => {
62
+ enqueue(': ping\n\n');
63
+ }, keepAliveMs);
64
+ keepAliveTimer.unref?.();
65
+ function close() {
66
+ if (closed)
67
+ return;
68
+ closed = true;
69
+ queue.length = 0;
70
+ clearInterval(keepAliveTimer);
71
+ options.onClose?.();
72
+ res.end();
73
+ }
74
+ res.on('drain', () => {
75
+ writable = true;
76
+ pump();
77
+ });
78
+ // `IncomingMessage`'s `'close'` fires when the request/response cycle ends or the connection
79
+ // drops — not when a bodyless request merely finishes arriving — so this is the client-disconnect
80
+ // signal it reads as. `raw-sse.test.ts` pins that against a real socket rather than a fake
81
+ // emitter, because it is the kind of contract a mock will happily agree with either way.
82
+ req.on('close', close);
83
+ return {
84
+ send(data) {
85
+ enqueue(`data: ${JSON.stringify(data)}\n\n`);
86
+ },
87
+ close,
88
+ get closed() {
89
+ return closed;
90
+ },
91
+ };
92
+ }
93
+ //# sourceMappingURL=raw-sse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-sse.js","sourceRoot":"","sources":["../src/raw-sse.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,CAAC;AAoBpD;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAoB,EACpB,GAAmB,EACnB,UAAoC,EAAE;IAEtC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,+BAA+B,CAAC;IACvF,+FAA+F;IAC/F,kGAAkG;IAClG,8CAA8C;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,mBAAmB;QACnC,eAAe,EAAE,wBAAwB;QACzC,UAAU,EAAE,YAAY;KACzB,CAAC,CAAC;IAEH;;;;;OAKG;IACH,SAAS,IAAI;QACX,OAAO,CAAC,MAAM,IAAI,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;YAC7B,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK;gBAAE,QAAQ,GAAG,KAAK,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,OAAO,CAAC,KAAa;QAC5B,IAAI,MAAM;YAAE,OAAO;QACnB,IAAI,KAAK,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;YACtC,KAAK,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,EAAE,CAAC;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;IAClD,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACtC,OAAO,CAAC,YAAY,CAAC,CAAC;IACxB,CAAC,EAAE,WAAW,CAAC,CAAC;IAChB,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;IAEzB,SAAS,KAAK;QACZ,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,aAAa,CAAC,cAAc,CAAC,CAAC;QAC9B,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACpB,GAAG,CAAC,GAAG,EAAE,CAAC;IACZ,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACnB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,6FAA6F;IAC7F,kGAAkG;IAClG,2FAA2F;IAC3F,yFAAyF;IACzF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAEvB,OAAO;QACL,IAAI,CAAC,IAAa;YAChB,OAAO,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK;QACL,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}