@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.
- package/LICENSE +201 -0
- package/README.md +107 -0
- package/dist/active-context.d.ts +99 -0
- package/dist/active-context.d.ts.map +1 -0
- package/dist/active-context.js +77 -0
- package/dist/active-context.js.map +1 -0
- package/dist/adapter.d.ts +36 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +92 -0
- package/dist/adapter.js.map +1 -0
- package/dist/agents.d.ts +55 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +23 -0
- package/dist/agents.js.map +1 -0
- package/dist/api-security-middleware.d.ts +146 -0
- package/dist/api-security-middleware.d.ts.map +1 -0
- package/dist/api-security-middleware.js +276 -0
- package/dist/api-security-middleware.js.map +1 -0
- package/dist/attachments.d.ts +317 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +664 -0
- package/dist/attachments.js.map +1 -0
- package/dist/cancel-owned-runs.d.ts +44 -0
- package/dist/cancel-owned-runs.d.ts.map +1 -0
- package/dist/cancel-owned-runs.js +35 -0
- package/dist/cancel-owned-runs.js.map +1 -0
- package/dist/compat.d.ts +22 -0
- package/dist/compat.d.ts.map +1 -0
- package/dist/compat.js +17 -0
- package/dist/compat.js.map +1 -0
- package/dist/component-catalog.d.ts +74 -0
- package/dist/component-catalog.d.ts.map +1 -0
- package/dist/component-catalog.js +74 -0
- package/dist/component-catalog.js.map +1 -0
- package/dist/connectors.d.ts +165 -0
- package/dist/connectors.d.ts.map +1 -0
- package/dist/connectors.js +474 -0
- package/dist/connectors.js.map +1 -0
- package/dist/daemon-status.d.ts +72 -0
- package/dist/daemon-status.d.ts.map +1 -0
- package/dist/daemon-status.js +60 -0
- package/dist/daemon-status.js.map +1 -0
- package/dist/db-ops.d.ts +116 -0
- package/dist/db-ops.d.ts.map +1 -0
- package/dist/db-ops.js +191 -0
- package/dist/db-ops.js.map +1 -0
- package/dist/delegated-tools.d.ts +46 -0
- package/dist/delegated-tools.d.ts.map +1 -0
- package/dist/delegated-tools.js +155 -0
- package/dist/delegated-tools.js.map +1 -0
- package/dist/express/run-stream.d.ts +15 -0
- package/dist/express/run-stream.d.ts.map +1 -0
- package/dist/express/run-stream.js +11 -0
- package/dist/express/run-stream.js.map +1 -0
- package/dist/express-index.d.ts +32 -0
- package/dist/express-index.d.ts.map +1 -0
- package/dist/express-index.js +14 -0
- package/dist/express-index.js.map +1 -0
- package/dist/fastify/adapter.d.ts +31 -0
- package/dist/fastify/adapter.d.ts.map +1 -0
- package/dist/fastify/adapter.js +64 -0
- package/dist/fastify/adapter.js.map +1 -0
- package/dist/fastify/agents.d.ts +13 -0
- package/dist/fastify/agents.d.ts.map +1 -0
- package/dist/fastify/agents.js +7 -0
- package/dist/fastify/agents.js.map +1 -0
- package/dist/fastify/api-security-middleware.d.ts +64 -0
- package/dist/fastify/api-security-middleware.d.ts.map +1 -0
- package/dist/fastify/api-security-middleware.js +139 -0
- package/dist/fastify/api-security-middleware.js.map +1 -0
- package/dist/fastify/compat.d.ts +22 -0
- package/dist/fastify/compat.d.ts.map +1 -0
- package/dist/fastify/compat.js +16 -0
- package/dist/fastify/compat.js.map +1 -0
- package/dist/fastify/daemon-status.d.ts +22 -0
- package/dist/fastify/daemon-status.d.ts.map +1 -0
- package/dist/fastify/daemon-status.js +9 -0
- package/dist/fastify/daemon-status.js.map +1 -0
- package/dist/fastify/host-tools.d.ts +13 -0
- package/dist/fastify/host-tools.d.ts.map +1 -0
- package/dist/fastify/host-tools.js +8 -0
- package/dist/fastify/host-tools.js.map +1 -0
- package/dist/fastify/index.d.ts +36 -0
- package/dist/fastify/index.d.ts.map +1 -0
- package/dist/fastify/index.js +18 -0
- package/dist/fastify/index.js.map +1 -0
- package/dist/fastify/local-daemon-request.d.ts +43 -0
- package/dist/fastify/local-daemon-request.d.ts.map +1 -0
- package/dist/fastify/local-daemon-request.js +155 -0
- package/dist/fastify/local-daemon-request.js.map +1 -0
- package/dist/fastify/origin.d.ts +21 -0
- package/dist/fastify/origin.d.ts.map +1 -0
- package/dist/fastify/origin.js +14 -0
- package/dist/fastify/origin.js.map +1 -0
- package/dist/fastify/request.d.ts +20 -0
- package/dist/fastify/request.d.ts.map +1 -0
- package/dist/fastify/request.js +25 -0
- package/dist/fastify/request.js.map +1 -0
- package/dist/fastify/response.d.ts +20 -0
- package/dist/fastify/response.d.ts.map +1 -0
- package/dist/fastify/response.js +41 -0
- package/dist/fastify/response.js.map +1 -0
- package/dist/fastify/route-registration-guard.d.ts +70 -0
- package/dist/fastify/route-registration-guard.d.ts.map +1 -0
- package/dist/fastify/route-registration-guard.js +69 -0
- package/dist/fastify/route-registration-guard.js.map +1 -0
- package/dist/fastify/run-stream.d.ts +18 -0
- package/dist/fastify/run-stream.d.ts.map +1 -0
- package/dist/fastify/run-stream.js +10 -0
- package/dist/fastify/run-stream.js.map +1 -0
- package/dist/fastify/runs.d.ts +17 -0
- package/dist/fastify/runs.d.ts.map +1 -0
- package/dist/fastify/runs.js +33 -0
- package/dist/fastify/runs.js.map +1 -0
- package/dist/frontend-control.d.ts +131 -0
- package/dist/frontend-control.d.ts.map +1 -0
- package/dist/frontend-control.js +77 -0
- package/dist/frontend-control.js.map +1 -0
- package/dist/frontend-sessions.d.ts +100 -0
- package/dist/frontend-sessions.d.ts.map +1 -0
- package/dist/frontend-sessions.js +180 -0
- package/dist/frontend-sessions.js.map +1 -0
- package/dist/health.d.ts +91 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +53 -0
- package/dist/health.js.map +1 -0
- package/dist/host-tools.d.ts +174 -0
- package/dist/host-tools.d.ts.map +1 -0
- package/dist/host-tools.js +338 -0
- package/dist/host-tools.js.map +1 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/local-daemon-request.d.ts +44 -0
- package/dist/local-daemon-request.d.ts.map +1 -0
- package/dist/local-daemon-request.js +145 -0
- package/dist/local-daemon-request.js.map +1 -0
- package/dist/media.d.ts +131 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +352 -0
- package/dist/media.js.map +1 -0
- package/dist/memory.d.ts +230 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +331 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-proxy.d.ts +45 -0
- package/dist/model-proxy.d.ts.map +1 -0
- package/dist/model-proxy.js +619 -0
- package/dist/model-proxy.js.map +1 -0
- package/dist/origin-validation.d.ts +64 -0
- package/dist/origin-validation.d.ts.map +1 -0
- package/dist/origin-validation.js +226 -0
- package/dist/origin-validation.js.map +1 -0
- package/dist/origin.d.ts +32 -0
- package/dist/origin.d.ts.map +1 -0
- package/dist/origin.js +14 -0
- package/dist/origin.js.map +1 -0
- package/dist/pack-http.d.ts +30 -0
- package/dist/pack-http.d.ts.map +1 -0
- package/dist/pack-http.js +12 -0
- package/dist/pack-http.js.map +1 -0
- package/dist/raw-sse.d.ts +44 -0
- package/dist/raw-sse.d.ts.map +1 -0
- package/dist/raw-sse.js +93 -0
- package/dist/raw-sse.js.map +1 -0
- package/dist/remote-run-events.d.ts +66 -0
- package/dist/remote-run-events.d.ts.map +1 -0
- package/dist/remote-run-events.js +230 -0
- package/dist/remote-run-events.js.map +1 -0
- package/dist/request.d.ts +19 -0
- package/dist/request.d.ts.map +1 -0
- package/dist/request.js +25 -0
- package/dist/request.js.map +1 -0
- package/dist/research.d.ts +42 -0
- package/dist/research.d.ts.map +1 -0
- package/dist/research.js +316 -0
- package/dist/research.js.map +1 -0
- package/dist/response.d.ts +14 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/response.js +45 -0
- package/dist/response.js.map +1 -0
- package/dist/route-manifest.d.ts +31 -0
- package/dist/route-manifest.d.ts.map +1 -0
- package/dist/route-manifest.js +103 -0
- package/dist/route-manifest.js.map +1 -0
- package/dist/route-registration-guard.d.ts +65 -0
- package/dist/route-registration-guard.d.ts.map +1 -0
- package/dist/route-registration-guard.js +71 -0
- package/dist/route-registration-guard.js.map +1 -0
- package/dist/routines.d.ts +114 -0
- package/dist/routines.d.ts.map +1 -0
- package/dist/routines.js +320 -0
- package/dist/routines.js.map +1 -0
- package/dist/run-stream.d.ts +60 -0
- package/dist/run-stream.d.ts.map +1 -0
- package/dist/run-stream.js +108 -0
- package/dist/run-stream.js.map +1 -0
- package/dist/runs.d.ts +79 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +232 -0
- package/dist/runs.js.map +1 -0
- package/dist/sse.d.ts +139 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +157 -0
- package/dist/sse.js.map +1 -0
- package/dist/terminals.d.ts +125 -0
- package/dist/terminals.d.ts.map +1 -0
- package/dist/terminals.js +349 -0
- package/dist/terminals.js.map +1 -0
- package/dist/tool-catalog.d.ts +68 -0
- package/dist/tool-catalog.d.ts.map +1 -0
- package/dist/tool-catalog.js +68 -0
- package/dist/tool-catalog.js.map +1 -0
- package/dist/types.d.ts +58 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace-root.d.ts +69 -0
- package/dist/workspace-root.d.ts.map +1 -0
- package/dist/workspace-root.js +63 -0
- package/dist/workspace-root.js.map +1 -0
- package/dist/xai.d.ts +86 -0
- package/dist/xai.d.ts.map +1 -0
- package/dist/xai.js +668 -0
- package/dist/xai.js.map +1 -0
- 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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"}
|
package/dist/origin.d.ts
ADDED
|
@@ -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"}
|
package/dist/raw-sse.js
ADDED
|
@@ -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"}
|