@rotorsoft/act-http 1.11.1 → 1.11.3
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/README.md +2 -5
- package/dist/.tsbuildinfo +1 -1
- package/dist/@types/api/actor.d.ts +4 -6
- package/dist/@types/api/actor.d.ts.map +1 -1
- package/dist/@types/api/dispatch.d.ts +46 -1
- package/dist/@types/api/dispatch.d.ts.map +1 -1
- package/dist/@types/api/index.d.ts +3 -3
- package/dist/@types/api/sse-wiring.d.ts +4 -4
- package/dist/@types/api/sse-wiring.d.ts.map +1 -1
- package/dist/@types/hono/index.d.ts +80 -13
- package/dist/@types/hono/index.d.ts.map +1 -1
- package/dist/@types/openapi/index.d.ts.map +1 -1
- package/dist/@types/receiver/extract.d.ts +4 -4
- package/dist/@types/receiver/hono/index.d.ts +1 -1
- package/dist/@types/receiver/verify.d.ts +2 -2
- package/dist/@types/sse/apply-patch.d.ts.map +1 -1
- package/dist/@types/sse/broadcast.d.ts +6 -24
- package/dist/@types/sse/broadcast.d.ts.map +1 -1
- package/dist/@types/sse/state-cache.d.ts +1 -1
- package/dist/@types/sse/types.d.ts +4 -5
- package/dist/@types/sse/types.d.ts.map +1 -1
- package/dist/@types/trpc/index.d.ts +107 -35
- package/dist/@types/trpc/index.d.ts.map +1 -1
- package/dist/@types/webhook/index.d.ts +1 -1
- package/dist/@types/webhook/index.d.ts.map +1 -1
- package/dist/@types/webhook/types.d.ts +1 -1
- package/dist/api/index.cjs +1 -3
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.js +2 -2
- package/dist/{chunk-MKD3SM3N.js → chunk-BOJG4555.js} +1 -1
- package/dist/chunk-BOJG4555.js.map +1 -0
- package/dist/{chunk-EERALS5E.js → chunk-CVCTDLJA.js} +1 -1
- package/dist/chunk-CVCTDLJA.js.map +1 -0
- package/dist/{chunk-G5FNOSDX.js → chunk-ET2PACPO.js} +1 -1
- package/dist/chunk-ET2PACPO.js.map +1 -0
- package/dist/{chunk-TTVMQYNN.js → chunk-OEMQP5ZM.js} +2 -2
- package/dist/chunk-OEMQP5ZM.js.map +1 -0
- package/dist/{chunk-5KZI37IT.js → chunk-QSH2Y3YR.js} +3 -3
- package/dist/chunk-QSH2Y3YR.js.map +1 -0
- package/dist/{chunk-FSN52BXM.js → chunk-YEDAY2PC.js} +3 -5
- package/dist/chunk-YEDAY2PC.js.map +1 -0
- package/dist/hono/index.cjs +1 -3
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.js +4 -4
- package/dist/hono/index.js.map +1 -1
- package/dist/openapi/index.cjs +103 -35
- package/dist/openapi/index.cjs.map +1 -1
- package/dist/openapi/index.js +104 -36
- package/dist/openapi/index.js.map +1 -1
- package/dist/receiver/express/index.cjs.map +1 -1
- package/dist/receiver/express/index.js +1 -1
- package/dist/receiver/fastify/index.cjs.map +1 -1
- package/dist/receiver/fastify/index.js +1 -1
- package/dist/receiver/hono/index.cjs.map +1 -1
- package/dist/receiver/hono/index.js +2 -2
- package/dist/receiver/index.cjs.map +1 -1
- package/dist/receiver/index.js +3 -3
- package/dist/receiver/index.js.map +1 -1
- package/dist/receiver/trpc/index.cjs.map +1 -1
- package/dist/receiver/trpc/index.js +1 -1
- package/dist/sse/index.cjs +7 -25
- package/dist/sse/index.cjs.map +1 -1
- package/dist/sse/index.js +8 -26
- package/dist/sse/index.js.map +1 -1
- package/dist/trpc/index.cjs +2 -8
- package/dist/trpc/index.cjs.map +1 -1
- package/dist/trpc/index.js +5 -9
- package/dist/trpc/index.js.map +1 -1
- package/dist/webhook/index.cjs.map +1 -1
- package/dist/webhook/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-5KZI37IT.js.map +0 -1
- package/dist/chunk-EERALS5E.js.map +0 -1
- package/dist/chunk-FSN52BXM.js.map +0 -1
- package/dist/chunk-G5FNOSDX.js.map +0 -1
- package/dist/chunk-MKD3SM3N.js.map +0 -1
- package/dist/chunk-TTVMQYNN.js.map +0 -1
|
@@ -6,15 +6,13 @@ import type { Actor } from "@rotorsoft/act";
|
|
|
6
6
|
* for this single closure that every transport (tRPC, Hono, OpenAPI
|
|
7
7
|
* docs) composes against.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* transport-agnostic means one extractor implementation plugs into
|
|
13
|
-
* every adapter unchanged.
|
|
9
|
+
* Each transport types `request` as what it hands over: the Hono
|
|
10
|
+
* `Context`, or the host's tRPC context. An extractor that takes
|
|
11
|
+
* `unknown` still plugs into every transport unchanged.
|
|
14
12
|
*
|
|
15
13
|
* Async is allowed so the extractor can verify a JWT against a
|
|
16
14
|
* remote JWKS endpoint without forcing every host to synchronously
|
|
17
15
|
* cache.
|
|
18
16
|
*/
|
|
19
|
-
export type ActorExtractor = (request:
|
|
17
|
+
export type ActorExtractor<TRequest = unknown> = (request: TRequest) => Actor | Promise<Actor>;
|
|
20
18
|
//# sourceMappingURL=actor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../../src/api/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C
|
|
1
|
+
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../../src/api/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAE5C;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,cAAc,CAAC,QAAQ,GAAG,OAAO,IAAI,CAC/C,OAAO,EAAE,QAAQ,KACd,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type { Actor, Target } from "@rotorsoft/act";
|
|
1
|
+
import type { Act, Actor, Registry, Schema, Schemas, Snapshot, Target } from "@rotorsoft/act";
|
|
2
2
|
import type { IdempotencyStore } from "@rotorsoft/act-ops/idempotency";
|
|
3
|
+
import type { ZodType } from "zod";
|
|
3
4
|
/**
|
|
4
5
|
* The Act surface the generated transports walk: the registry's action
|
|
5
6
|
* name → owning-state map and `do(...)`. A structural bound lets `TApp`
|
|
@@ -11,10 +12,54 @@ export type ActSurface = {
|
|
|
11
12
|
actions: Record<string, {
|
|
12
13
|
readonly name: string;
|
|
13
14
|
readonly actions: Record<string, unknown>;
|
|
15
|
+
/** The state's schema and its events', which the OpenAPI doc describes responses with. */
|
|
16
|
+
readonly state?: ZodType;
|
|
17
|
+
readonly events?: Readonly<Record<string, ZodType>>;
|
|
14
18
|
}>;
|
|
15
19
|
};
|
|
16
20
|
do(action: string, target: Target, payload: unknown): Promise<unknown>;
|
|
17
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* The registry types of a built app, read back so a generated API keeps
|
|
24
|
+
* them: each action's payload, the state it leaves, the events, and the
|
|
25
|
+
* state names. A bare {@link ActSurface} has none, so its actions take and
|
|
26
|
+
* return `unknown`.
|
|
27
|
+
*/
|
|
28
|
+
type AppRegistry<TApp> = TApp extends {
|
|
29
|
+
readonly registry: Registry<infer S, infer E, infer A, infer N>;
|
|
30
|
+
} ? {
|
|
31
|
+
states: S;
|
|
32
|
+
events: E;
|
|
33
|
+
actions: A;
|
|
34
|
+
names: N;
|
|
35
|
+
} : {
|
|
36
|
+
states: Record<string, Schema>;
|
|
37
|
+
events: Schemas;
|
|
38
|
+
actions: Record<string, unknown>;
|
|
39
|
+
names: string;
|
|
40
|
+
};
|
|
41
|
+
/** The payload each action of `TApp` takes, by action name. */
|
|
42
|
+
export type AppActions<TApp> = AppRegistry<TApp>["actions"];
|
|
43
|
+
/** The state names of `TApp`. */
|
|
44
|
+
export type AppStateNames<TApp> = AppRegistry<TApp>["names"];
|
|
45
|
+
/** The state named `N` in `TApp`, as the SSE channel carries it. */
|
|
46
|
+
export type AppState<TApp, N> = (TApp extends Act<any, any, any, infer M, any> ? N extends keyof M ? M[N] : Schema : Schema) & {
|
|
47
|
+
_v: number;
|
|
48
|
+
};
|
|
49
|
+
/** What `app.do` returns for action `K` of `TApp`. */
|
|
50
|
+
export type ActionResult<TApp, K> = Snapshot<K extends keyof AppRegistry<TApp>["states"] ? AppRegistry<TApp>["states"][K] : Schema, AppRegistry<TApp>["events"]>[];
|
|
51
|
+
/**
|
|
52
|
+
* What a `stream` or `expectedVersion` resolver receives: the action's
|
|
53
|
+
* name, its parsed payload and the transport's context, as one tuple per
|
|
54
|
+
* action, so checking the name narrows the payload.
|
|
55
|
+
*/
|
|
56
|
+
export type ResolverArgs<TApp, C> = {
|
|
57
|
+
[K in keyof AppActions<TApp> & string]: [
|
|
58
|
+
action_name: K,
|
|
59
|
+
input: AppActions<TApp>[K],
|
|
60
|
+
ctx: C
|
|
61
|
+
];
|
|
62
|
+
}[keyof AppActions<TApp> & string];
|
|
18
63
|
/** The target resolvers a generated transport takes, over its own context. */
|
|
19
64
|
type TargetResolvers<C> = {
|
|
20
65
|
readonly stream: (action_name: string, input: unknown, ctx: C) => string | Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/api/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../src/api/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
*
|
|
24
24
|
* Sibling subpaths in the same package consume the utilities here:
|
|
25
25
|
*
|
|
26
|
-
* - `@rotorsoft/act-http/trpc` — tRPC adapter
|
|
27
|
-
* - `@rotorsoft/act-http/hono` — Hono adapter
|
|
28
|
-
* - `@rotorsoft/act-http/openapi` — OpenAPI emitter
|
|
26
|
+
* - `@rotorsoft/act-http/trpc` — tRPC adapter.
|
|
27
|
+
* - `@rotorsoft/act-http/hono` — Hono adapter.
|
|
28
|
+
* - `@rotorsoft/act-http/openapi` — OpenAPI emitter.
|
|
29
29
|
*
|
|
30
30
|
* Existing siblings unrelated to the generated-API work:
|
|
31
31
|
*
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BroadcastChannel } from "../sse/broadcast.js";
|
|
2
|
-
import { type BroadcastState } from "../sse/types.js";
|
|
2
|
+
import { type BroadcastState, type PatchMessage } from "../sse/types.js";
|
|
3
3
|
/**
|
|
4
4
|
* SSE wiring options shared by the auto-generated `trpc` and `hono`
|
|
5
5
|
* transports. When supplied, each transport emits one streaming
|
|
@@ -61,7 +61,7 @@ export type SseOptions = {
|
|
|
61
61
|
*
|
|
62
62
|
* Version-neutral frames (`_overlay`, `_resync`) are never dropped
|
|
63
63
|
* silently — they create no gap to notice, so a backlog made only of
|
|
64
|
-
* them collapses into a single `_resync` instead
|
|
64
|
+
* them collapses into a single `_resync` instead.
|
|
65
65
|
*
|
|
66
66
|
* Default `256`. Validated range `[1, 100_000]`.
|
|
67
67
|
*/
|
|
@@ -101,7 +101,7 @@ export declare const DEFAULT_SSE_HEARTBEAT_MS = 30000;
|
|
|
101
101
|
* version-keyed patch, so the consumer sees the gap and converges on
|
|
102
102
|
* current state regardless of which intermediate versions it missed.
|
|
103
103
|
* Version-neutral frames create no gap, so they collapse into a
|
|
104
|
-
* `_resync` rather than being dropped silently
|
|
104
|
+
* `_resync` rather than being dropped silently.
|
|
105
105
|
*/
|
|
106
106
|
export declare const DEFAULT_SSE_MAX_PENDING_PER_CONNECTION = 256;
|
|
107
107
|
/**
|
|
@@ -165,7 +165,7 @@ export type SseSubscriptionFrame<S> = {
|
|
|
165
165
|
readonly data: S;
|
|
166
166
|
} | {
|
|
167
167
|
readonly kind: "patch";
|
|
168
|
-
readonly data: unknown;
|
|
168
|
+
readonly data: S extends BroadcastState ? PatchMessage<S> : unknown;
|
|
169
169
|
};
|
|
170
170
|
/**
|
|
171
171
|
* Subscription accounting hook. Implementations have a chance to
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-wiring.d.ts","sourceRoot":"","sources":["../../../src/api/sse-wiring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"sse-wiring.d.ts","sourceRoot":"","sources":["../../../src/api/sse-wiring.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,10 @@ import type { Actor } from "@rotorsoft/act";
|
|
|
2
2
|
import type { IdempotencyStore } from "@rotorsoft/act-ops/idempotency";
|
|
3
3
|
import type { Context, MiddlewareHandler } from "hono";
|
|
4
4
|
import { Hono } from "hono";
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import type { MergePath, TypedResponse } from "hono/types";
|
|
6
|
+
import type { JSONParsed } from "hono/utils/types";
|
|
7
|
+
import { type ActionResult, type ActSurface, type AppActions, type AppStateNames, type ResolverArgs } from "../api/dispatch.js";
|
|
8
|
+
import { type ActorExtractor, type ApiError, type SseOptions } from "../api/index.js";
|
|
7
9
|
/**
|
|
8
10
|
* Hono context variables this subpath contributes. The generic on
|
|
9
11
|
* the returned middleware threads it through so routes downstream
|
|
@@ -27,8 +29,8 @@ export type ActMiddlewareVariables = {
|
|
|
27
29
|
* - `expectedVersion` (optional) — optimistic-concurrency resolver.
|
|
28
30
|
* Hosts typically read it from an `If-Match` header on the
|
|
29
31
|
* request, or from the client's last-known snapshot. Returning
|
|
30
|
-
* `undefined`
|
|
31
|
-
*
|
|
32
|
+
* `undefined` leaves the call to the version the action loads; a
|
|
33
|
+
* number pins it, and a pinned conflict is never retried.
|
|
32
34
|
* - `idempotency` (optional) — when set, the route honors
|
|
33
35
|
* `Idempotency-Key` via {@link withIdempotency}. The host
|
|
34
36
|
* supplies the `IdempotencyStore`; `keyFrom` defaults to reading
|
|
@@ -42,10 +44,10 @@ export type ActMiddlewareVariables = {
|
|
|
42
44
|
* - `basePath` (optional, default `"/api"`) — Hono basePath the
|
|
43
45
|
* routes mount under.
|
|
44
46
|
*/
|
|
45
|
-
export type HonoOptions = {
|
|
46
|
-
readonly actor: ActorExtractor
|
|
47
|
-
readonly stream: (
|
|
48
|
-
readonly expectedVersion?: (
|
|
47
|
+
export type HonoOptions<TApp = ActSurface> = {
|
|
48
|
+
readonly actor: ActorExtractor<Context>;
|
|
49
|
+
readonly stream: (...args: ResolverArgs<TApp, Context>) => string | Promise<string>;
|
|
50
|
+
readonly expectedVersion?: (...args: ResolverArgs<TApp, Context>) => number | undefined | Promise<number | undefined>;
|
|
49
51
|
readonly idempotency?: {
|
|
50
52
|
readonly store: IdempotencyStore;
|
|
51
53
|
readonly keyFrom?: (c: Context) => string | undefined;
|
|
@@ -88,11 +90,13 @@ export type HonoOptions = {
|
|
|
88
90
|
* ```
|
|
89
91
|
*
|
|
90
92
|
* Errors thrown by the extractor surface as `401 Unauthorized` with
|
|
91
|
-
* the shared {@link ApiError} envelope.
|
|
93
|
+
* the shared {@link ApiError} envelope. Mounted on a route
|
|
94
|
+
* (`api.get("/me", authenticated(extract), handler)`), the `401` is in
|
|
95
|
+
* the route's type, so `hc` and `testClient` see it.
|
|
92
96
|
*/
|
|
93
|
-
export declare function authenticated(extractor: ActorExtractor): MiddlewareHandler<{
|
|
97
|
+
export declare function authenticated(extractor: ActorExtractor<Context>): MiddlewareHandler<{
|
|
94
98
|
Variables: ActMiddlewareVariables;
|
|
95
|
-
}
|
|
99
|
+
}, string, {}, Response & TypedResponse<JSONParsed<ApiError>, 401, "json">>;
|
|
96
100
|
/**
|
|
97
101
|
* Build a typed Hono REST surface from a built `Act` instance.
|
|
98
102
|
*
|
|
@@ -125,7 +129,70 @@ export declare function authenticated(extractor: ActorExtractor): MiddlewareHand
|
|
|
125
129
|
* @returns A Hono app covering every registered action under
|
|
126
130
|
* `<basePath>/actions/<name>`.
|
|
127
131
|
*/
|
|
128
|
-
export declare function hono<TApp extends ActSurface = ActSurface>(app: TApp, options: HonoOptions
|
|
132
|
+
export declare function hono<TApp extends ActSurface = ActSurface, TBase extends string = "/api">(app: TApp, options: HonoOptions<TApp> & {
|
|
133
|
+
readonly basePath?: TBase;
|
|
134
|
+
readonly sse: NonNullable<HonoOptions["sse"]>;
|
|
135
|
+
}): Hono<{
|
|
129
136
|
Variables: ActMiddlewareVariables;
|
|
130
|
-
}>;
|
|
137
|
+
}, ActionRoutes<TApp, TBase> & SseRoutes<TApp, TBase>, TBase>;
|
|
138
|
+
export declare function hono<TApp extends ActSurface = ActSurface, TBase extends string = "/api">(app: TApp, options: HonoOptions<TApp> & {
|
|
139
|
+
readonly basePath?: TBase;
|
|
140
|
+
}): Hono<{
|
|
141
|
+
Variables: ActMiddlewareVariables;
|
|
142
|
+
}, ActionRoutes<TApp, TBase>, TBase>;
|
|
143
|
+
/**
|
|
144
|
+
* One `GET <basePath>/sse/<state>?stream=<id>` per state of `TApp`, with
|
|
145
|
+
* `sse`: an event stream on `200`, {@link ApiError} on an error status.
|
|
146
|
+
*/
|
|
147
|
+
export type SseRoutes<TApp, TBase extends string> = {
|
|
148
|
+
[N in AppStateNames<TApp> as MergePath<TBase, `/sse/${N}`>]: {
|
|
149
|
+
$get: {
|
|
150
|
+
input: {
|
|
151
|
+
query: {
|
|
152
|
+
stream: string;
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
output: {};
|
|
156
|
+
outputFormat: "body";
|
|
157
|
+
status: 200;
|
|
158
|
+
} | {
|
|
159
|
+
input: {
|
|
160
|
+
query: {
|
|
161
|
+
stream: string;
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
output: ApiError;
|
|
165
|
+
outputFormat: "json";
|
|
166
|
+
status: 400 | 401 | 503;
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
/** Every status a generated action route answers with the error envelope. */
|
|
171
|
+
type ErrorStatus = 400 | 401 | 409 | 410 | 412 | 422 | 500 | 503;
|
|
172
|
+
/**
|
|
173
|
+
* The routes {@link hono} builds, one `POST <basePath>/actions/<name>` per
|
|
174
|
+
* action of `TApp`: the action's payload as the JSON body, the snapshots
|
|
175
|
+
* `app.do` returns (as JSON) on `200`, and {@link ApiError} on an error
|
|
176
|
+
* status. `hc<typeof api>` and `testClient(api)` read it.
|
|
177
|
+
*/
|
|
178
|
+
export type ActionRoutes<TApp, TBase extends string> = {
|
|
179
|
+
[K in keyof AppActions<TApp> & string as MergePath<TBase, `/actions/${K}`>]: {
|
|
180
|
+
$post: {
|
|
181
|
+
input: {
|
|
182
|
+
json: AppActions<TApp>[K];
|
|
183
|
+
};
|
|
184
|
+
output: JSONParsed<ActionResult<TApp, K>>;
|
|
185
|
+
outputFormat: "json";
|
|
186
|
+
status: 200;
|
|
187
|
+
} | {
|
|
188
|
+
input: {
|
|
189
|
+
json: AppActions<TApp>[K];
|
|
190
|
+
};
|
|
191
|
+
output: ApiError;
|
|
192
|
+
outputFormat: "json";
|
|
193
|
+
status: ErrorStatus;
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
export {};
|
|
131
198
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hono/index.ts"],"names":[],"mappings":"AAiDA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hono/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openapi/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/openapi/index.ts"],"names":[],"mappings":"AA6DA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CACzB,MAAM,EACN;QACE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B,CACF,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CACtB,MAAM,EACN;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAC7C,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IACE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CACvB,MAAM,EACN;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAC7C,CAAC;CACH,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CACrD,CAAC;AA4VF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,OAAO,CAAC,IAAI,SAAS,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,EAC/D,GAAG,EAAE,IAAI,EACT,OAAO,EAAE,cAAc,GACtB,eAAe,CA0CjB"}
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
* Pair with `IdempotencyStore.claim` from
|
|
13
13
|
* `@rotorsoft/act-ops/idempotency`: extract the key from the inbound
|
|
14
14
|
* request, claim it on the store, return a `deduped` marker when the
|
|
15
|
-
* claim fails. The
|
|
16
|
-
* together
|
|
15
|
+
* claim fails. The receiver subpaths' `webhookMiddleware` wires these
|
|
16
|
+
* together.
|
|
17
17
|
*
|
|
18
18
|
* Validation beyond "is there a usable key?" (length bounds, format
|
|
19
19
|
* checks, normalization) is intentionally out of scope. Receivers
|
|
20
|
-
* picking a policy can layer it on top
|
|
21
|
-
*
|
|
20
|
+
* picking a policy can layer it on top, or use the middleware's
|
|
21
|
+
* defaults.
|
|
22
22
|
*/
|
|
23
23
|
export declare function extractIdempotencyKey(headers: Record<string, string | string[] | undefined>): string | undefined;
|
|
24
24
|
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
* finalizes the claim automatically after `await next()`: a downstream
|
|
37
37
|
* 2xx/3xx **commits** the key (later retries dedup); any **4xx or 5xx**
|
|
38
38
|
* (or a thrown handler) **releases** it, so the sender's corrected retry
|
|
39
|
-
* re-processes instead of being silently dropped
|
|
39
|
+
* re-processes instead of being silently dropped. Fail-safe is
|
|
40
40
|
* toward reprocessing: releasing a deterministic 4xx costs bounded
|
|
41
41
|
* re-delivery, while committing it would lose a delivery the handler
|
|
42
42
|
* never accepted (the shipped `receiver()` returns 422 on a schema
|
|
@@ -47,8 +47,8 @@ export type VerifyOptions = {
|
|
|
47
47
|
* The signed payload is `${timestamp}.${body}`, so `body` must be
|
|
48
48
|
* the **raw request body bytes**. Any pre-parse normalization
|
|
49
49
|
* (whitespace trimming, JSON re-stringification) would change the
|
|
50
|
-
* hash and reject every otherwise-valid request.
|
|
51
|
-
*
|
|
50
|
+
* hash and reject every otherwise-valid request. The receiver
|
|
51
|
+
* subpaths' adapters pass the raw body alongside the parsed one.
|
|
52
52
|
*
|
|
53
53
|
* Uses Node's `crypto.timingSafeEqual` for the final comparison to
|
|
54
54
|
* avoid signature-equality timing attacks.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../../src/sse/apply-patch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAC7D;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,EACxD,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3B,WAAW,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../../src/sse/apply-patch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAC7D;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACtB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAA;CAAE,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,cAAc,EACxD,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,EACpB,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAC3B,WAAW,CAAC,CAAC,CAAC,CA8DhB"}
|
|
@@ -78,34 +78,16 @@ export declare class BroadcastChannel<S extends BroadcastState = BroadcastState>
|
|
|
78
78
|
*/
|
|
79
79
|
private broadcast_resync;
|
|
80
80
|
/**
|
|
81
|
-
* The LRU dropped an entry.
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* would silently lack presence a live client is still showing (#1648).
|
|
85
|
-
*
|
|
86
|
-
* `overlay()` was hardened for the same loss on its own path (#1423);
|
|
87
|
-
* catching it here covers `publish()` too, and does it at the moment the
|
|
88
|
-
* data is lost rather than at a later commit that may never come. Reading
|
|
89
|
-
* the marker off the entry being evicted is what avoids the parallel
|
|
90
|
-
* bookkeeping structure the `OVERLAY_KEYS` design explicitly rejected.
|
|
81
|
+
* The LRU dropped an entry. Overlay-contributed keys lived only in the
|
|
82
|
+
* cache, so their loss is reported now, when it happens, rather than at a
|
|
83
|
+
* later commit that may never come.
|
|
91
84
|
*/
|
|
92
85
|
private on_cache_evict;
|
|
93
86
|
/**
|
|
94
87
|
* Overlay-contributed state for `streamId` is gone. Recover first, report
|
|
95
|
-
* second
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
* the way `fan_out` contains subscribers: a bad consumer must not break the
|
|
99
|
-
* publisher (#1423), and the same applies to a bad observer. Without this,
|
|
100
|
-
* a throwing `onOverlayMiss` escapes on the eviction path — which runs
|
|
101
|
-
* inside `publish()`, before that stream's own `fan_out` — so one host bug
|
|
102
|
-
* costs the evicted stream its recovery frame *and* an unrelated stream the
|
|
103
|
-
* frame for a version already written to the cache. The evicted stream's
|
|
104
|
-
* clients never self-heal from that, which is the silent loss #1648 exists
|
|
105
|
-
* to end.
|
|
106
|
-
*
|
|
107
|
-
* Routing the throw to `onSubscriberError` rather than swallowing it keeps
|
|
108
|
-
* it wherever the host already reads framework delivery failures.
|
|
88
|
+
* second: the resync goes out before the host hook, and a throwing hook is
|
|
89
|
+
* routed to `onSubscriberError`. Eviction runs inside `publish()` for
|
|
90
|
+
* another stream, so an escaping throw would cost that stream its frame.
|
|
109
91
|
*/
|
|
110
92
|
private report_overlay_miss;
|
|
111
93
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/sse/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/sse/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AA0GpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACrE,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,eAAe,CAA6B;IAEpD,YAAY,OAAO,CAAC,EAAE;QACpB,sEAAsE;QACtE,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;;;;;;;;;;;;;;WAcG;QACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C;;;;;WAKG;QACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QAC/D;;;;WAIG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,EAQA;IAED;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAKtB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAS3B;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,OAAO,CAAC,CAAC,CAAC,EAAO,GACzB,YAAY,CAAC,CAAC,CAAC,CAkCjB;IAED;;;;OAIG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CA8B7B;IAED;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CASzD;IAED,kDAAkD;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExC;IAED,8EAA8E;IAC9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAErC;IAED,4DAA4D;IAC5D,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAE7B;IAED,oEAAoE;IACpE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7C;IAED,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEzC;IAED,+EAA+E;IAC/E,IAAI,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAEzB;CACF"}
|
|
@@ -17,7 +17,7 @@ export declare class StateCache<S extends BroadcastState = BroadcastState> {
|
|
|
17
17
|
* @param maxSize - Max entries before the LRU drops its oldest.
|
|
18
18
|
* @param onEvict - Called with the entry the LRU just dropped. Eviction is
|
|
19
19
|
* the moment cached-only data is lost, so it is the only place a caller
|
|
20
|
-
* can still see what went
|
|
20
|
+
* can still see what went.
|
|
21
21
|
*/
|
|
22
22
|
constructor(maxSize?: number, onEvict?: (key: string, state: S) => void);
|
|
23
23
|
/** Get a cached state, promoting it to MRU position. */
|
|
@@ -20,11 +20,10 @@ export type BroadcastState = Record<string, unknown> & {
|
|
|
20
20
|
* stale). Ordinary version-bumping patches from `publish()` omit it.
|
|
21
21
|
*
|
|
22
22
|
* `_resync` carries no versions at all. The server emits it when it cannot
|
|
23
|
-
* construct a patch
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* live subscribers silently
|
|
27
|
-
* way to notice (#1423).
|
|
23
|
+
* construct a patch: when overlay-contributed state is lost, because
|
|
24
|
+
* `overlay()` finds no cached baseline or the LRU evicts an entry that
|
|
25
|
+
* carried overlay keys. A client that receives one always reports `behind`
|
|
26
|
+
* and refetches, so live subscribers don't silently miss updates.
|
|
28
27
|
*/
|
|
29
28
|
export type PatchMessage<S extends BroadcastState = BroadcastState> = Record<number, DeepPartial<S>> & {
|
|
30
29
|
readonly _overlay?: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CAC1E,MAAM,EACN,WAAW,CAAC,CAAC,CAAC,CACf,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,CAClE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;AAEV;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,cAAc,OAAK,YAAY,CAAC,CAAC,CAChC,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,cAAc,OACpD,YAAY,CAAC,CAAC,CAAC,KACnB,OAAwD,CAAC"}
|