@astrale-os/kernel-server 0.4.12 → 0.4.14
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/dist/app/create.d.ts +3 -3
- package/dist/app/create.d.ts.map +1 -1
- package/dist/app/create.js +8 -7
- package/dist/app/create.js.map +1 -1
- package/dist/app/index.d.ts +1 -1
- package/dist/app/index.d.ts.map +1 -1
- package/dist/app/multiplexed.d.ts +11 -11
- package/dist/app/multiplexed.d.ts.map +1 -1
- package/dist/app/multiplexed.js +16 -15
- package/dist/app/multiplexed.js.map +1 -1
- package/dist/app/ws-upgrade.d.ts +7 -8
- package/dist/app/ws-upgrade.d.ts.map +1 -1
- package/dist/app/ws-upgrade.js +10 -9
- package/dist/app/ws-upgrade.js.map +1 -1
- package/dist/capabilities/contract.d.ts +8 -0
- package/dist/capabilities/contract.d.ts.map +1 -0
- package/dist/capabilities/contract.js +2 -0
- package/dist/capabilities/contract.js.map +1 -0
- package/dist/capabilities/defer.d.ts +4 -0
- package/dist/capabilities/defer.d.ts.map +1 -0
- package/dist/capabilities/defer.js +2 -0
- package/dist/capabilities/defer.js.map +1 -0
- package/dist/capabilities/hono.d.ts +8 -0
- package/dist/capabilities/hono.d.ts.map +1 -0
- package/dist/capabilities/hono.js +13 -0
- package/dist/capabilities/hono.js.map +1 -0
- package/dist/capabilities/index.d.ts +6 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +3 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/lifecycle.d.ts +17 -0
- package/dist/capabilities/lifecycle.d.ts.map +1 -0
- package/dist/capabilities/lifecycle.js +37 -0
- package/dist/capabilities/lifecycle.js.map +1 -0
- package/dist/capabilities/sleep.d.ts +4 -0
- package/dist/capabilities/sleep.d.ts.map +1 -0
- package/dist/capabilities/sleep.js +8 -0
- package/dist/capabilities/sleep.js.map +1 -0
- package/dist/envelope/batch.d.ts +3 -2
- package/dist/envelope/batch.d.ts.map +1 -1
- package/dist/envelope/batch.js +9 -3
- package/dist/envelope/batch.js.map +1 -1
- package/dist/envelope/http.d.ts +7 -6
- package/dist/envelope/http.d.ts.map +1 -1
- package/dist/envelope/http.js +17 -13
- package/dist/envelope/http.js.map +1 -1
- package/dist/envelope/ws.d.ts +6 -3
- package/dist/envelope/ws.d.ts.map +1 -1
- package/dist/envelope/ws.js +15 -9
- package/dist/envelope/ws.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/invocation/dispatch.d.ts +32 -0
- package/dist/invocation/dispatch.d.ts.map +1 -0
- package/dist/invocation/dispatch.js +68 -0
- package/dist/invocation/dispatch.js.map +1 -0
- package/dist/invocation/dispatcher.d.ts +19 -0
- package/dist/invocation/dispatcher.d.ts.map +1 -0
- package/dist/invocation/dispatcher.js +9 -0
- package/dist/invocation/dispatcher.js.map +1 -0
- package/dist/invocation/index.d.ts +3 -0
- package/dist/invocation/index.d.ts.map +1 -0
- package/dist/invocation/index.js +3 -0
- package/dist/invocation/index.js.map +1 -0
- package/dist/routed/handler.d.ts +5 -3
- package/dist/routed/handler.d.ts.map +1 -1
- package/dist/routed/handler.js +11 -7
- package/dist/routed/handler.js.map +1 -1
- package/package.json +3 -3
package/dist/app/create.d.ts
CHANGED
|
@@ -10,17 +10,17 @@
|
|
|
10
10
|
* fixed to the Authorization header; route bindings can override via
|
|
11
11
|
* `route.credential`.
|
|
12
12
|
*/
|
|
13
|
-
import type { KernelAPI } from '@astrale-os/kernel-api';
|
|
14
13
|
import type { MountableContract } from '@astrale-os/kernel-api/routed';
|
|
15
14
|
import type { Hono } from 'hono';
|
|
16
15
|
import type { CorsConfig } from '../cors.js';
|
|
16
|
+
import type { Dispatcher } from '../invocation/index.js';
|
|
17
17
|
import type { JwksKeys } from '../jwks/index.js';
|
|
18
18
|
import type { MountPlan, ServerHost } from '../plan/index.js';
|
|
19
19
|
import { type WsAdapter } from './ws-upgrade.js';
|
|
20
20
|
export type { WsAdapter };
|
|
21
21
|
export type KernelAppConfig = {
|
|
22
|
-
/** The
|
|
23
|
-
|
|
22
|
+
/** The dispatcher handling hosted invocations. */
|
|
23
|
+
dispatcher: Dispatcher;
|
|
24
24
|
/** The domain's mountable contracts — produced by defineMethods(schema, methods). */
|
|
25
25
|
domain: MountableContract[];
|
|
26
26
|
/** Server host URL. Functions anchor against this (ambient functions mount here). */
|
package/dist/app/create.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../app/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../app/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAA;AAIzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAO7D,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE/D,YAAY,EAAE,SAAS,EAAE,CAAA;AAIzB,MAAM,MAAM,eAAe,GAAG;IAC5B,kDAAkD;IAClD,UAAU,EAAE,UAAU,CAAA;IACtB,qFAAqF;IACrF,MAAM,EAAE,iBAAiB,EAAE,CAAA;IAC3B,qFAAqF;IACrF,IAAI,EAAE,UAAU,CAAA;IAChB,4DAA4D;IAC5D,IAAI,EAAE,QAAQ,CAAA;IACd,+DAA+D;IAC/D,UAAU,CAAC,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IACvC,uDAAuD;IACvD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACvB,+DAA+D;IAC/D,GAAG,CAAC,EAAE,IAAI,CAAA;IACV;;;OAGG;IACH,EAAE,CAAC,EAAE,SAAS,CAAA;CACf,CAAA;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CAyFvF"}
|
package/dist/app/create.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* `route.credential`.
|
|
12
12
|
*/
|
|
13
13
|
import { Hono as HonoCtor } from 'hono';
|
|
14
|
+
import { honoCapabilityHost } from '../capabilities/index.js';
|
|
14
15
|
import { createKernelDispatcher } from '../envelope/http.js';
|
|
15
16
|
import { mountJwks } from '../jwks/keys.js';
|
|
16
17
|
import { extractHostParams, walkDomain } from '../plan/index.js';
|
|
@@ -40,7 +41,7 @@ export function createKernelApp(config) {
|
|
|
40
41
|
const hostParams = plan.hostMatcher
|
|
41
42
|
? (req) => extractHostParams(plan.hostMatcher, req)
|
|
42
43
|
: undefined;
|
|
43
|
-
const
|
|
44
|
+
const envelope = createKernelDispatcher(cors, { hostParams });
|
|
44
45
|
const basePaths = new Set();
|
|
45
46
|
for (const basePath of plan.kernelMounts.keys()) {
|
|
46
47
|
basePaths.add(basePath === '' ? '/' : basePath);
|
|
@@ -55,13 +56,13 @@ export function createKernelApp(config) {
|
|
|
55
56
|
`(hono/bun, @hono/node-ws, hono/deno).`);
|
|
56
57
|
}
|
|
57
58
|
for (const wsPath of basePaths) {
|
|
58
|
-
mountKernelWs(app, wsPath, config.ws, config.
|
|
59
|
+
mountKernelWs(app, wsPath, config.ws, config.dispatcher);
|
|
59
60
|
}
|
|
60
61
|
}
|
|
61
62
|
// 4b. HTTP POST envelope + OPTIONS preflight for each base path.
|
|
62
63
|
for (const path of basePaths) {
|
|
63
|
-
app.post(path, (c) =>
|
|
64
|
-
app.options(path, (c) =>
|
|
64
|
+
app.post(path, (c) => envelope(c.req.raw, config.dispatcher, honoCapabilityHost(c)));
|
|
65
|
+
app.options(path, (c) => envelope(c.req.raw, config.dispatcher, honoCapabilityHost(c)));
|
|
65
66
|
}
|
|
66
67
|
// 6. Route bindings — one Hono handler per mounted route.
|
|
67
68
|
for (const mountedRoute of plan.routes) {
|
|
@@ -70,7 +71,7 @@ export function createKernelApp(config) {
|
|
|
70
71
|
const handler = createRouteHandler({
|
|
71
72
|
method: mountedRoute.contract.ref,
|
|
72
73
|
route,
|
|
73
|
-
|
|
74
|
+
dispatcher: config.dispatcher,
|
|
74
75
|
cors,
|
|
75
76
|
hostParams,
|
|
76
77
|
auth: mountedRoute.contract.binding?.auth,
|
|
@@ -83,7 +84,7 @@ export function createKernelApp(config) {
|
|
|
83
84
|
if (value !== undefined)
|
|
84
85
|
pathParams[name] = decodeURIComponent(value);
|
|
85
86
|
}
|
|
86
|
-
return handler(c.req.raw, pathParams);
|
|
87
|
+
return handler(c.req.raw, pathParams, honoCapabilityHost(c));
|
|
87
88
|
};
|
|
88
89
|
if (route.method === '*') {
|
|
89
90
|
app.all(honoPath, mountHandler);
|
|
@@ -93,7 +94,7 @@ export function createKernelApp(config) {
|
|
|
93
94
|
app[verb](honoPath, mountHandler);
|
|
94
95
|
}
|
|
95
96
|
// Always allow CORS preflight on routes.
|
|
96
|
-
app.options(honoPath, (c) => handler(c.req.raw, {}));
|
|
97
|
+
app.options(honoPath, (c) => handler(c.req.raw, {}, honoCapabilityHost(c)));
|
|
97
98
|
}
|
|
98
99
|
return { app, plan };
|
|
99
100
|
}
|
package/dist/app/create.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../app/create.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../app/create.ts"],"names":[],"mappings":"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"}
|
package/dist/app/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { createKernelApp, type KernelAppConfig, type WsAdapter } from './create.js';
|
|
2
|
-
export { createMultiplexedKernelApp, type MultiplexedKernelAppConfig, type
|
|
2
|
+
export { createMultiplexedKernelApp, type MultiplexedKernelAppConfig, type DispatcherResolver, } from './multiplexed.js';
|
|
3
3
|
export { mountKernelWs } from './ws-upgrade.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/app/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EACL,0BAA0B,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AACnF,OAAO,EACL,0BAA0B,EAC1B,KAAK,0BAA0B,EAC/B,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA"}
|
|
@@ -2,34 +2,34 @@
|
|
|
2
2
|
* createMultiplexedKernelApp — Hono app for multi-instance kernel hosting.
|
|
3
3
|
*
|
|
4
4
|
* One HTTP server hosts many kernel instances under `/{id}/...` paths. Each
|
|
5
|
-
* incoming request is resolved to a
|
|
5
|
+
* incoming request is resolved to a dispatcher via `resolve()`
|
|
6
6
|
* function. The manager kernel (if any) is mounted at its own static prefix.
|
|
7
7
|
*
|
|
8
8
|
* Both the envelope HTTP dispatcher and the WS upgrade handler are built
|
|
9
|
-
* once at startup. The
|
|
10
|
-
* handler resolves its
|
|
9
|
+
* once at startup. The HTTP handler takes `(req, dispatcher)` per request; the WS
|
|
10
|
+
* handler resolves its dispatcher once at upgrade time and pins it to the
|
|
11
11
|
* connection for its entire lifetime.
|
|
12
12
|
*
|
|
13
13
|
* Note: this skips per-instance domain mount-walking (no `domain` argument
|
|
14
14
|
* per request) — multiplexed servers dispatch all calls to the kernel layer
|
|
15
15
|
* regardless of binding. Anchored functions still work, since the binding is
|
|
16
|
-
* carried by the contract registered in the
|
|
16
|
+
* carried by the contract registered in the kernel.
|
|
17
17
|
*/
|
|
18
|
-
import type { KernelAPI } from '@astrale-os/kernel-api';
|
|
19
18
|
import type { Hono } from 'hono';
|
|
20
19
|
import type { CorsConfig } from '../cors.js';
|
|
20
|
+
import type { Dispatcher } from '../invocation/index.js';
|
|
21
21
|
import type { JwksKeys, MultiplexedJwks } from '../jwks/index.js';
|
|
22
22
|
import { type WsAdapter } from './ws-upgrade.js';
|
|
23
23
|
/**
|
|
24
|
-
* Resolves a
|
|
24
|
+
* Resolves a dispatcher from an incoming request.
|
|
25
25
|
*/
|
|
26
|
-
export type
|
|
26
|
+
export type DispatcherResolver = (req: Request) => Dispatcher | null | Promise<Dispatcher | null>;
|
|
27
27
|
export type MultiplexedKernelAppConfig = {
|
|
28
|
-
/** Per-request
|
|
29
|
-
resolve:
|
|
30
|
-
/** Optional manager
|
|
28
|
+
/** Per-request dispatcher resolver (the selected instance handles its own auth). */
|
|
29
|
+
resolve: DispatcherResolver;
|
|
30
|
+
/** Optional manager dispatcher hosted at a static prefix. */
|
|
31
31
|
manager?: {
|
|
32
|
-
|
|
32
|
+
dispatcher: Dispatcher;
|
|
33
33
|
prefix: string;
|
|
34
34
|
jwks: JwksKeys;
|
|
35
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiplexed.d.ts","sourceRoot":"","sources":["../../app/multiplexed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"multiplexed.d.ts","sourceRoot":"","sources":["../../app/multiplexed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAA;AAIzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAKjE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI/D;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;AAEjG,MAAM,MAAM,0BAA0B,GAAG;IACvC,oFAAoF;IACpF,OAAO,EAAE,kBAAkB,CAAA;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,EAAE;QAAE,UAAU,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAA;IACpE,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gCAAgC;IAChC,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAA;IACvB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV;;;;OAIG;IACH,EAAE,CAAC,EAAE,SAAS,CAAA;CACf,CAAA;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,0BAA0B,GAAG;IAAE,GAAG,EAAE,IAAI,CAAA;CAAE,CA+C5F"}
|
package/dist/app/multiplexed.js
CHANGED
|
@@ -2,20 +2,21 @@
|
|
|
2
2
|
* createMultiplexedKernelApp — Hono app for multi-instance kernel hosting.
|
|
3
3
|
*
|
|
4
4
|
* One HTTP server hosts many kernel instances under `/{id}/...` paths. Each
|
|
5
|
-
* incoming request is resolved to a
|
|
5
|
+
* incoming request is resolved to a dispatcher via `resolve()`
|
|
6
6
|
* function. The manager kernel (if any) is mounted at its own static prefix.
|
|
7
7
|
*
|
|
8
8
|
* Both the envelope HTTP dispatcher and the WS upgrade handler are built
|
|
9
|
-
* once at startup. The
|
|
10
|
-
* handler resolves its
|
|
9
|
+
* once at startup. The HTTP handler takes `(req, dispatcher)` per request; the WS
|
|
10
|
+
* handler resolves its dispatcher once at upgrade time and pins it to the
|
|
11
11
|
* connection for its entire lifetime.
|
|
12
12
|
*
|
|
13
13
|
* Note: this skips per-instance domain mount-walking (no `domain` argument
|
|
14
14
|
* per request) — multiplexed servers dispatch all calls to the kernel layer
|
|
15
15
|
* regardless of binding. Anchored functions still work, since the binding is
|
|
16
|
-
* carried by the contract registered in the
|
|
16
|
+
* carried by the contract registered in the kernel.
|
|
17
17
|
*/
|
|
18
18
|
import { Hono as HonoCtor } from 'hono';
|
|
19
|
+
import { honoCapabilityHost } from '../capabilities/index.js';
|
|
19
20
|
import { createKernelDispatcher } from '../envelope/http.js';
|
|
20
21
|
import { mountInstanceJwks, mountJwks } from '../jwks/keys.js';
|
|
21
22
|
import { mountKernelWs } from './ws-upgrade.js';
|
|
@@ -27,34 +28,34 @@ export function createMultiplexedKernelApp(config) {
|
|
|
27
28
|
if (config.health !== false) {
|
|
28
29
|
app.get(typeof config.health === 'string' ? config.health : '/health', (c) => c.json({ status: 'ok' }));
|
|
29
30
|
}
|
|
30
|
-
// Single
|
|
31
|
-
const
|
|
31
|
+
// Single HTTP handler, reused across manager + all instance dispatchers.
|
|
32
|
+
const envelope = createKernelDispatcher(cors);
|
|
32
33
|
// Manager kernel (if any) — static prefix, fixed kernel.
|
|
33
34
|
// POST + OPTIONS handle HTTP dispatch; GET is reserved for WS upgrade
|
|
34
35
|
// (matches createKernelApp's mount layout).
|
|
35
36
|
if (config.manager) {
|
|
36
|
-
const
|
|
37
|
+
const managerDispatcher = config.manager.dispatcher;
|
|
37
38
|
const managerPath = `${config.manager.prefix}/`;
|
|
38
|
-
app.post(managerPath, (c) =>
|
|
39
|
-
app.options(managerPath, (c) =>
|
|
39
|
+
app.post(managerPath, (c) => envelope(c.req.raw, managerDispatcher, honoCapabilityHost(c)));
|
|
40
|
+
app.options(managerPath, (c) => envelope(c.req.raw, managerDispatcher, honoCapabilityHost(c)));
|
|
40
41
|
mountJwks(app, { ...config.manager.jwks, cors });
|
|
41
42
|
if (config.ws) {
|
|
42
|
-
mountKernelWs(app, managerPath, config.ws,
|
|
43
|
+
mountKernelWs(app, managerPath, config.ws, managerDispatcher);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
// Per-instance JWKS
|
|
46
47
|
mountInstanceJwks(app, instancePrefix, { ...config.jwks, cors });
|
|
47
|
-
// Per-instance kernel envelope —
|
|
48
|
+
// Per-instance kernel envelope — dispatcher resolved per request.
|
|
48
49
|
const instancePath = `${instancePrefix}/`;
|
|
49
50
|
const httpDispatch = async (c) => {
|
|
50
|
-
const
|
|
51
|
-
if (!
|
|
51
|
+
const dispatcher = await config.resolve(c.req.raw);
|
|
52
|
+
if (!dispatcher)
|
|
52
53
|
return new Response('Instance not found', { status: 404 });
|
|
53
|
-
return
|
|
54
|
+
return envelope(c.req.raw, dispatcher, honoCapabilityHost(c));
|
|
54
55
|
};
|
|
55
56
|
app.post(instancePath, httpDispatch);
|
|
56
57
|
app.options(instancePath, httpDispatch);
|
|
57
|
-
// Per-instance WS upgrade —
|
|
58
|
+
// Per-instance WS upgrade — dispatcher resolved at upgrade time and pinned.
|
|
58
59
|
if (config.ws) {
|
|
59
60
|
mountKernelWs(app, instancePath, config.ws, config.resolve);
|
|
60
61
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiplexed.js","sourceRoot":"","sources":["../../app/multiplexed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"multiplexed.js","sourceRoot":"","sources":["../../app/multiplexed.ts"],"names":[],"mappings":"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"}
|
package/dist/app/ws-upgrade.d.ts
CHANGED
|
@@ -5,22 +5,21 @@
|
|
|
5
5
|
* The adapter is supplied by the caller (`hono/bun`, `@hono/node-ws`,
|
|
6
6
|
* `hono/deno`) so that this module remains free of runtime imports.
|
|
7
7
|
*
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* entire lifetime.
|
|
8
|
+
* The dispatcher can be either fixed or resolved per request by a resolver
|
|
9
|
+
* called at upgrade time with the upgrade request. Once resolved, it is pinned
|
|
10
|
+
* to the WS connection.
|
|
12
11
|
*/
|
|
13
|
-
import type { KernelAPI } from '@astrale-os/kernel-api';
|
|
14
12
|
import type { Hono } from 'hono';
|
|
15
13
|
import type { UpgradeWebSocket } from 'hono/ws';
|
|
14
|
+
import type { Dispatcher } from '../invocation/index.js';
|
|
16
15
|
export type WsAdapter = {
|
|
17
16
|
upgradeWebSocket: UpgradeWebSocket;
|
|
18
17
|
};
|
|
19
18
|
/**
|
|
20
|
-
*
|
|
19
|
+
* Invocation source for a WS mount — either a fixed dispatcher or a per-request
|
|
21
20
|
* resolver. Resolvers may be async and return `null` to reject the upgrade.
|
|
22
21
|
*/
|
|
23
|
-
export type
|
|
22
|
+
export type WsInvocationSource = Dispatcher | ((req: Request) => Dispatcher | null | Promise<Dispatcher | null>);
|
|
24
23
|
/**
|
|
25
24
|
* Mount the kernel WS handler at `path` on the Hono app.
|
|
26
25
|
*
|
|
@@ -31,5 +30,5 @@ export type WsKernelSource = KernelAPI | ((req: Request) => KernelAPI | null | P
|
|
|
31
30
|
* result closes the socket with code 4004 (instance not found) before any
|
|
32
31
|
* messages are exchanged.
|
|
33
32
|
*/
|
|
34
|
-
export declare function mountKernelWs(app: Hono, path: string, ws: WsAdapter, source:
|
|
33
|
+
export declare function mountKernelWs(app: Hono, path: string, ws: WsAdapter, source: WsInvocationSource): void;
|
|
35
34
|
//# sourceMappingURL=ws-upgrade.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-upgrade.d.ts","sourceRoot":"","sources":["../../app/ws-upgrade.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ws-upgrade.d.ts","sourceRoot":"","sources":["../../app/ws-upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAa,MAAM,SAAS,CAAA;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAMxD,MAAM,MAAM,SAAS,GAAG;IACtB,gBAAgB,EAAE,gBAAgB,CAAA;CACnC,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,UAAU,GACV,CAAC,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,IAAI,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAA;AAuBtE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,SAAS,EACb,MAAM,EAAE,kBAAkB,GACzB,IAAI,CAmDN"}
|
package/dist/app/ws-upgrade.js
CHANGED
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
* The adapter is supplied by the caller (`hono/bun`, `@hono/node-ws`,
|
|
6
6
|
* `hono/deno`) so that this module remains free of runtime imports.
|
|
7
7
|
*
|
|
8
|
-
* The
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* entire lifetime.
|
|
8
|
+
* The dispatcher can be either fixed or resolved per request by a resolver
|
|
9
|
+
* called at upgrade time with the upgrade request. Once resolved, it is pinned
|
|
10
|
+
* to the WS connection.
|
|
12
11
|
*/
|
|
12
|
+
import { honoCapabilityHost } from '../capabilities/index.js';
|
|
13
13
|
import { negotiateWsCodec } from '../envelope/codec.js';
|
|
14
14
|
import { KernelWsConnection } from '../envelope/ws.js';
|
|
15
15
|
function adaptHonoWs(ws) {
|
|
@@ -42,6 +42,7 @@ function isResolver(source) {
|
|
|
42
42
|
export function mountKernelWs(app, path, ws, source) {
|
|
43
43
|
const route = ws.upgradeWebSocket((c) => {
|
|
44
44
|
const upgradeRequest = c.req.raw;
|
|
45
|
+
const capabilityHost = honoCapabilityHost(c);
|
|
45
46
|
const codec = negotiateWsCodec(upgradeRequest);
|
|
46
47
|
let conn = null;
|
|
47
48
|
return {
|
|
@@ -50,9 +51,9 @@ export function mountKernelWs(app, path, ws, source) {
|
|
|
50
51
|
wsCtx.close(4000, 'Unsupported codec');
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
|
-
let
|
|
54
|
+
let dispatcher;
|
|
54
55
|
try {
|
|
55
|
-
|
|
56
|
+
dispatcher = isResolver(source) ? await source(upgradeRequest) : source;
|
|
56
57
|
}
|
|
57
58
|
catch (err) {
|
|
58
59
|
// A mount-time failure (e.g. a child kernel boot throwing) must not
|
|
@@ -63,16 +64,16 @@ export function mountKernelWs(app, path, ws, source) {
|
|
|
63
64
|
// log the error so a programmer bug (e.g. an unrelated TypeError
|
|
64
65
|
// bubbling up from the resolver) isn't silently masked as a benign
|
|
65
66
|
// mount fail.
|
|
66
|
-
//
|
|
67
|
+
// oxlint-disable-next-line no-console
|
|
67
68
|
console.error('[ws-upgrade] mount failed (socket closed 4005):', err);
|
|
68
69
|
wsCtx.close(4005, 'mount failed');
|
|
69
70
|
return;
|
|
70
71
|
}
|
|
71
|
-
if (!
|
|
72
|
+
if (!dispatcher) {
|
|
72
73
|
wsCtx.close(4004, 'Instance not found');
|
|
73
74
|
return;
|
|
74
75
|
}
|
|
75
|
-
conn = new KernelWsConnection(adaptHonoWs(wsCtx), codec,
|
|
76
|
+
conn = new KernelWsConnection(adaptHonoWs(wsCtx), codec, dispatcher, capabilityHost);
|
|
76
77
|
conn.start();
|
|
77
78
|
},
|
|
78
79
|
onMessage(evt) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-upgrade.js","sourceRoot":"","sources":["../../app/ws-upgrade.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ws-upgrade.js","sourceRoot":"","sources":["../../app/ws-upgrade.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Defer } from './defer.js';
|
|
2
|
+
import type { Sleep } from './sleep.js';
|
|
3
|
+
/** Host-provided capabilities available while an invocation is executing. */
|
|
4
|
+
export type Capabilities = {
|
|
5
|
+
defer: Defer;
|
|
6
|
+
sleep: Sleep;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../capabilities/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAEvC,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,KAAK,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;CACb,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../capabilities/contract.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defer.d.ts","sourceRoot":"","sources":["../../capabilities/defer.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAE5D,MAAM,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defer.js","sourceRoot":"","sources":["../../capabilities/defer.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CapabilityHost } from './lifecycle.js';
|
|
2
|
+
/** Adapt Hono's optional request context to the generic execution host. */
|
|
3
|
+
export declare function honoCapabilityHost(c: {
|
|
4
|
+
readonly executionCtx?: {
|
|
5
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
6
|
+
};
|
|
7
|
+
}): CapabilityHost | undefined;
|
|
8
|
+
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["../../capabilities/hono.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;KAAE,CAAA;CACvE,GAAG,cAAc,GAAG,SAAS,CAQ7B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Adapt Hono's optional request context to the generic execution host. */
|
|
2
|
+
export function honoCapabilityHost(c) {
|
|
3
|
+
try {
|
|
4
|
+
const execution = c.executionCtx;
|
|
5
|
+
if (!execution)
|
|
6
|
+
return undefined;
|
|
7
|
+
return { register: (promise) => execution.waitUntil(promise) };
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=hono.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"","sources":["../../capabilities/hono.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,MAAM,UAAU,kBAAkB,CAAC,CAElC;IACC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAA;QAChC,IAAI,CAAC,SAAS;YAAE,OAAO,SAAS,CAAA;QAChC,OAAO,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { honoCapabilityHost } from './hono.js';
|
|
2
|
+
export { createCapabilityLifecycle, type CapabilityHost, type CapabilityLifecycle, } from './lifecycle.js';
|
|
3
|
+
export type { Defer, DeferredTask } from './defer.js';
|
|
4
|
+
export type { Capabilities } from './contract.js';
|
|
5
|
+
export type { Sleep } from './sleep.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EACL,yBAAyB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EACL,yBAAyB,GAG1B,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Capabilities } from './contract.js';
|
|
2
|
+
import type { Sleep } from './sleep.js';
|
|
3
|
+
/** Host adapter that keeps a promise alive after the response is returned. */
|
|
4
|
+
export type CapabilityHost = {
|
|
5
|
+
register(promise: Promise<unknown>): void;
|
|
6
|
+
sleep?: Sleep;
|
|
7
|
+
};
|
|
8
|
+
export type CapabilityLifecycle = {
|
|
9
|
+
capabilities: Capabilities;
|
|
10
|
+
settle(): Promise<void>;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Create one capability lifecycle. Hosts retain deferred promises; callers without
|
|
14
|
+
* a retention host drain them before completing so work is never abandoned.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createCapabilityLifecycle(host?: CapabilityHost): CapabilityLifecycle;
|
|
17
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../capabilities/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAIvC,8EAA8E;AAC9E,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IACzC,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB,CAAA;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,CAAC,EAAE,cAAc,GAAG,mBAAmB,CA6BpF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { sleep } from './sleep.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create one capability lifecycle. Hosts retain deferred promises; callers without
|
|
4
|
+
* a retention host drain them before completing so work is never abandoned.
|
|
5
|
+
*/
|
|
6
|
+
export function createCapabilityLifecycle(host) {
|
|
7
|
+
const pending = [];
|
|
8
|
+
return {
|
|
9
|
+
capabilities: {
|
|
10
|
+
defer(task) {
|
|
11
|
+
const promise = Promise.resolve().then(task);
|
|
12
|
+
if (host)
|
|
13
|
+
host.register(promise);
|
|
14
|
+
else
|
|
15
|
+
pending.push(promise);
|
|
16
|
+
},
|
|
17
|
+
sleep: host?.sleep ?? sleep,
|
|
18
|
+
},
|
|
19
|
+
async settle() {
|
|
20
|
+
if (host || pending.length === 0)
|
|
21
|
+
return;
|
|
22
|
+
let cursor = 0;
|
|
23
|
+
while (cursor < pending.length) {
|
|
24
|
+
const batch = pending.slice(cursor);
|
|
25
|
+
cursor = pending.length;
|
|
26
|
+
const results = await Promise.allSettled(batch);
|
|
27
|
+
for (const result of results) {
|
|
28
|
+
if (result.status === 'rejected') {
|
|
29
|
+
// oxlint-disable-next-line no-console
|
|
30
|
+
console.error('[capabilities] deferred task failed:', result.reason);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../capabilities/lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAalC;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAqB;IAC7D,MAAM,OAAO,GAAuB,EAAE,CAAA;IAEtC,OAAO;QACL,YAAY,EAAE;YACZ,KAAK,CAAC,IAAI;gBACR,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAC5C,IAAI,IAAI;oBAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;;oBAC3B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK;SAC5B;QACD,KAAK,CAAC,MAAM;YACV,IAAI,IAAI,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAM;YAExC,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACnC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;gBACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;wBACjC,sCAAsC;wBACtC,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;oBACtE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../capabilities/sleep.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAEzD,yEAAyE;AACzE,wBAAsB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM7D"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Default non-durable sleep used when the host does not provide one. */
|
|
2
|
+
export async function sleep(durationMs) {
|
|
3
|
+
if (!Number.isFinite(durationMs) || durationMs < 0) {
|
|
4
|
+
throw new RangeError('Sleep duration must be a finite, non-negative number');
|
|
5
|
+
}
|
|
6
|
+
await new Promise((resolve) => setTimeout(resolve, durationMs));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=sleep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../capabilities/sleep.ts"],"names":[],"mappings":"AAEA,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,UAAkB;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAA;IAC9E,CAAC;IAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;AACvE,CAAC"}
|
package/dist/envelope/batch.d.ts
CHANGED
|
@@ -6,7 +6,8 @@
|
|
|
6
6
|
* collected into an array. Notifications are dropped from the response;
|
|
7
7
|
* streams and binary results are rejected (those need their own connection).
|
|
8
8
|
*/
|
|
9
|
-
import type {
|
|
9
|
+
import type { CapabilityHost } from '../capabilities/index.js';
|
|
10
|
+
import type { Dispatcher } from '../invocation/index.js';
|
|
10
11
|
import { type CodecEntry } from './codec.js';
|
|
11
|
-
export declare function handleBatch(raw: unknown[],
|
|
12
|
+
export declare function handleBatch(raw: unknown[], dispatcher: Dispatcher, codecEntry: CodecEntry, req: Request, corsHeaders: Record<string, string>, host?: CapabilityHost): Promise<Response>;
|
|
12
13
|
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../envelope/batch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../envelope/batch.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAG5C,wBAAsB,WAAW,CAC/B,GAAG,EAAE,OAAO,EAAE,EACd,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,OAAO,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,QAAQ,CAAC,CAuFnB"}
|