@spine-event-engine/auth 2.0.0-snapshot.2
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 +112 -0
- package/REFERENCE.md +94 -0
- package/dist/gateway/dynamic-subscription-creator.d.ts +52 -0
- package/dist/gateway/dynamic-subscription-creator.d.ts.map +1 -0
- package/dist/gateway/dynamic-subscription-creator.js +71 -0
- package/dist/gateway/dynamic-subscription-creator.js.map +1 -0
- package/dist/gateway/dynamic-unary-forwarder.d.ts +130 -0
- package/dist/gateway/dynamic-unary-forwarder.d.ts.map +1 -0
- package/dist/gateway/dynamic-unary-forwarder.js +185 -0
- package/dist/gateway/dynamic-unary-forwarder.js.map +1 -0
- package/dist/gateway/index.d.ts +164 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +195 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/index.d.ts +433 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/native/index.d.ts +182 -0
- package/dist/native/index.d.ts.map +1 -0
- package/dist/native/index.js +463 -0
- package/dist/native/index.js.map +1 -0
- package/dist/oidc/contracts.d.ts +334 -0
- package/dist/oidc/contracts.d.ts.map +1 -0
- package/dist/oidc/contracts.js +15 -0
- package/dist/oidc/contracts.js.map +1 -0
- package/dist/oidc/index.d.ts +41 -0
- package/dist/oidc/index.d.ts.map +1 -0
- package/dist/oidc/index.js +825 -0
- package/dist/oidc/index.js.map +1 -0
- package/dist/providers/index.d.ts +154 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +574 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/request/index.d.ts +10 -0
- package/dist/request/index.d.ts.map +1 -0
- package/dist/request/index.js +81 -0
- package/dist/request/index.js.map +1 -0
- package/dist/sessions/cookies.d.ts +104 -0
- package/dist/sessions/cookies.d.ts.map +1 -0
- package/dist/sessions/cookies.js +295 -0
- package/dist/sessions/cookies.js.map +1 -0
- package/dist/sessions/opaque.d.ts +163 -0
- package/dist/sessions/opaque.d.ts.map +1 -0
- package/dist/sessions/opaque.js +268 -0
- package/dist/sessions/opaque.js.map +1 -0
- package/dist/sessions/signed.d.ts +245 -0
- package/dist/sessions/signed.d.ts.map +1 -0
- package/dist/sessions/signed.js +534 -0
- package/dist/sessions/signed.js.map +1 -0
- package/dist/subscriptions/index.d.ts +463 -0
- package/dist/subscriptions/index.d.ts.map +1 -0
- package/dist/subscriptions/index.js +814 -0
- package/dist/subscriptions/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { ApplicationNode } from "@spine-event-engine/deployment";
|
|
2
|
+
import type { ILogLayer } from "loglayer";
|
|
3
|
+
import type { UnaryForwarder } from "./index.js";
|
|
4
|
+
import type { PublicSubscriptionWire, SubscriptionCreator, SubscriptionUpdateSink } from "../subscriptions/index.js";
|
|
5
|
+
/**
|
|
6
|
+
* Represents a connected unary backend with deterministic disposal.
|
|
7
|
+
*/
|
|
8
|
+
export interface DynamicUnaryClient extends UnaryForwarder, SubscriptionCreator {
|
|
9
|
+
/**
|
|
10
|
+
* Returns after releasing this connection when its node leaves membership.
|
|
11
|
+
*
|
|
12
|
+
* @returns Completion of connection cleanup.
|
|
13
|
+
*/
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Configures unary clients for discovered application nodes.
|
|
18
|
+
*/
|
|
19
|
+
export interface DynamicUnaryOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Creates a client for one discovered application node.
|
|
22
|
+
*
|
|
23
|
+
* @param node Supplies the discovered application node.
|
|
24
|
+
* @param signal Cancels client creation.
|
|
25
|
+
* @returns The connected unary client.
|
|
26
|
+
*/
|
|
27
|
+
readonly create: (node: ApplicationNode, signal: AbortSignal) => Promise<DynamicUnaryClient>;
|
|
28
|
+
/**
|
|
29
|
+
* Limits parallel client starts when supplied.
|
|
30
|
+
*/
|
|
31
|
+
readonly maxConcurrentStarts?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Limits one backend subscription envelope when supplied.
|
|
34
|
+
*/
|
|
35
|
+
readonly maxBackendEnvelopeBytes?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Receives adapter-local diagnostic records when supplied.
|
|
38
|
+
*/
|
|
39
|
+
readonly logger?: ILogLayer;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Adapts Gateway unary operations to the deployment-owned membership kernel.
|
|
43
|
+
* Durable logical ownership remains in the Gateway's subscription bindings.
|
|
44
|
+
*/
|
|
45
|
+
export declare class DynamicUnaryForwarder implements UnaryForwarder {
|
|
46
|
+
#private;
|
|
47
|
+
/**
|
|
48
|
+
* Creates the Gateway adapter around the deployment membership kernel.
|
|
49
|
+
*
|
|
50
|
+
* @param options Configures discovery clients and resource bounds.
|
|
51
|
+
*/
|
|
52
|
+
constructor(options: DynamicUnaryOptions);
|
|
53
|
+
/**
|
|
54
|
+
* Updates connected clients from a complete application-node snapshot.
|
|
55
|
+
*
|
|
56
|
+
* @param nodes Supplies the complete node snapshot.
|
|
57
|
+
* @returns Completion of client reconciliation.
|
|
58
|
+
*/
|
|
59
|
+
reconcile(nodes: readonly ApplicationNode[]): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Returns a unary response from the selected backend client.
|
|
62
|
+
*
|
|
63
|
+
* @param request Supplies the request to forward.
|
|
64
|
+
* @returns The backend response bytes.
|
|
65
|
+
*/
|
|
66
|
+
forward(request: Parameters<UnaryForwarder["forward"]>[0]): Promise<Uint8Array>;
|
|
67
|
+
/**
|
|
68
|
+
* Closes all live backend clients.
|
|
69
|
+
*
|
|
70
|
+
* @returns Completion of backend cleanup.
|
|
71
|
+
*/
|
|
72
|
+
close(): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Creates backend children for one logical Gateway subscription.
|
|
75
|
+
*
|
|
76
|
+
* @param request Supplies the public subscription wire.
|
|
77
|
+
* @param signal Cancels child creation.
|
|
78
|
+
* @param maxBackendEnvelopeBytes Limits one backend envelope when supplied.
|
|
79
|
+
* @returns Completion of child creation.
|
|
80
|
+
*/
|
|
81
|
+
subscribeDefinition(request: PublicSubscriptionWire, signal: AbortSignal, maxBackendEnvelopeBytes?: number): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Updates backend children for a retained Gateway subscription.
|
|
84
|
+
*
|
|
85
|
+
* @param request Supplies the retained public subscription wire.
|
|
86
|
+
* @param maxBackendEnvelopeBytes Limits one backend envelope when supplied.
|
|
87
|
+
* @returns Completion of child recreation.
|
|
88
|
+
*/
|
|
89
|
+
rehydrateDefinition(request: PublicSubscriptionWire, maxBackendEnvelopeBytes?: number): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* Activates backend update relay for one Gateway subscription.
|
|
92
|
+
*
|
|
93
|
+
* @param wire Supplies the public subscription wire.
|
|
94
|
+
* @param updates Receives relayed subscription updates.
|
|
95
|
+
* @param signal Cancels update relay.
|
|
96
|
+
* @returns Completion after cancellation.
|
|
97
|
+
*/
|
|
98
|
+
activateDefinition(wire: PublicSubscriptionWire, updates: SubscriptionUpdateSink, signal: AbortSignal): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Cancels backend children for one Gateway subscription.
|
|
101
|
+
*
|
|
102
|
+
* @param wire Supplies the public subscription wire.
|
|
103
|
+
* @param signal Cancels child cleanup when supported.
|
|
104
|
+
* @returns Completion of child cleanup.
|
|
105
|
+
*/
|
|
106
|
+
cancelDefinition(wire: PublicSubscriptionWire, signal: AbortSignal): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Resolves when the supplied signal aborts.
|
|
109
|
+
*
|
|
110
|
+
* @param signal Supplies the signal to observe.
|
|
111
|
+
* @returns Completion after the signal aborts.
|
|
112
|
+
*/
|
|
113
|
+
static waitForAbort(signal: AbortSignal): Promise<void>;
|
|
114
|
+
/**
|
|
115
|
+
* Returns the logical identifier encoded in public subscription bytes.
|
|
116
|
+
*
|
|
117
|
+
* @param bytes Supplies the public subscription bytes.
|
|
118
|
+
* @returns The logical identifier, when present.
|
|
119
|
+
*/
|
|
120
|
+
static definitionKey(bytes: Uint8Array): string | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Returns bytes with only the immediate child subscription identifier rewritten.
|
|
123
|
+
*
|
|
124
|
+
* @param bytes Supplies the parent subscription bytes.
|
|
125
|
+
* @param node Supplies the child application node.
|
|
126
|
+
* @returns The rewritten child subscription bytes.
|
|
127
|
+
*/
|
|
128
|
+
static childDefinition(bytes: Uint8Array, node: ApplicationNode): Uint8Array;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=dynamic-unary-forwarder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-unary-forwarder.d.ts","sourceRoot":"","sources":["../../src/gateway/dynamic-unary-forwarder.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAEV,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,cAAc,EAAE,mBAAmB;IAG7E;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAGlC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE7F;;OAEG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAEtC;;OAEG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAE1C;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;;IAQ1D;;;;OAIG;gBACS,OAAO,EAAE,mBAAmB;IAsDxC;;;;;OAKG;IACH,SAAS,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAM/E;;;;OAIG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB;;;;;;;OAOG;IACH,mBAAmB,CACjB,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,WAAW,EACnB,uBAAuB,CAAC,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;OAMG;IACG,mBAAmB,CACvB,OAAO,EAAE,sBAAsB,EAC/B,uBAAuB,CAAC,EAAE,MAAM,GAC/B,OAAO,CAAC,IAAI,CAAC;IAWhB;;;;;;;OAOG;IACH,kBAAkB,CAChB,IAAI,EAAE,sBAAsB,EAC5B,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;OAMG;IACH,gBAAgB,CAAC,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlF;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS;IAI3D;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,eAAe,GAAG,UAAU;CAiB7E"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026, CodeMatters. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
|
|
5
|
+
* in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
*
|
|
7
|
+
* https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* Unless required by applicable law or agreed to in writing, software distributed under the License
|
|
10
|
+
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
|
|
11
|
+
* or implied. See the License for the specific language governing permissions and limitations under
|
|
12
|
+
* the License.
|
|
13
|
+
*/
|
|
14
|
+
import { clone, fromBinary, toBinary } from "@bufbuild/protobuf";
|
|
15
|
+
import { ApplicationNode } from "@spine-event-engine/deployment";
|
|
16
|
+
import { BackendMembershipKernel } from "@spine-event-engine/deployment/internal/backend-membership-kernel";
|
|
17
|
+
import { SubscriptionSchema } from "@spine-event-engine/proto/client";
|
|
18
|
+
/**
|
|
19
|
+
* Adapts Gateway unary operations to the deployment-owned membership kernel.
|
|
20
|
+
* Durable logical ownership remains in the Gateway's subscription bindings.
|
|
21
|
+
*/
|
|
22
|
+
export class DynamicUnaryForwarder {
|
|
23
|
+
#kernel;
|
|
24
|
+
/**
|
|
25
|
+
* Creates the Gateway adapter around the deployment membership kernel.
|
|
26
|
+
*
|
|
27
|
+
* @param options Configures discovery clients and resource bounds.
|
|
28
|
+
*/
|
|
29
|
+
constructor(options) {
|
|
30
|
+
if (options.maxBackendEnvelopeBytes !== undefined &&
|
|
31
|
+
(!Number.isSafeInteger(options.maxBackendEnvelopeBytes) ||
|
|
32
|
+
options.maxBackendEnvelopeBytes < 1))
|
|
33
|
+
throw new RangeError("maxBackendEnvelopeBytes must be a positive safe integer.");
|
|
34
|
+
this.#kernel = new BackendMembershipKernel({
|
|
35
|
+
create: async (node, signal) => {
|
|
36
|
+
const client = await options.create(node, signal);
|
|
37
|
+
return {
|
|
38
|
+
forward: (request) => client.forward(request),
|
|
39
|
+
subscribe: (definition, childSignal) => client.subscribe({ kind: "public-subscription", bytes: definition.slice() }, childSignal),
|
|
40
|
+
activate: (child, updates, childSignal) => client.activate({
|
|
41
|
+
wire: { kind: "backend-subscription-envelope", bytes: child.bytes.slice() },
|
|
42
|
+
updates,
|
|
43
|
+
}, childSignal),
|
|
44
|
+
dispose: (child, childSignal) => client.dispose({ kind: "backend-subscription-envelope", bytes: child.bytes.slice() }, childSignal),
|
|
45
|
+
close: () => client.close(),
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
memberKey: (node) => node.id,
|
|
49
|
+
sameMember: (left, right) => left.endpoint === right.endpoint && left.tlsServerName === right.tlsServerName,
|
|
50
|
+
definitionKey: (definition) => DynamicUnaryForwarder.definitionKey(definition),
|
|
51
|
+
childDefinition: (definition, node) => DynamicUnaryForwarder.childDefinition(definition, node),
|
|
52
|
+
childSize: (child) => child.bytes.byteLength,
|
|
53
|
+
...(options.maxConcurrentStarts === undefined
|
|
54
|
+
? {}
|
|
55
|
+
: { maxConcurrentStarts: options.maxConcurrentStarts }),
|
|
56
|
+
...(options.maxBackendEnvelopeBytes === undefined
|
|
57
|
+
? {}
|
|
58
|
+
: { maxChildBytes: options.maxBackendEnvelopeBytes }),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Updates connected clients from a complete application-node snapshot.
|
|
63
|
+
*
|
|
64
|
+
* @param nodes Supplies the complete node snapshot.
|
|
65
|
+
* @returns Completion of client reconciliation.
|
|
66
|
+
*/
|
|
67
|
+
reconcile(nodes) {
|
|
68
|
+
return this.#kernel.reconcile(nodes);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns a unary response from the selected backend client.
|
|
72
|
+
*
|
|
73
|
+
* @param request Supplies the request to forward.
|
|
74
|
+
* @returns The backend response bytes.
|
|
75
|
+
*/
|
|
76
|
+
forward(request) {
|
|
77
|
+
return this.#kernel
|
|
78
|
+
.forward(request)
|
|
79
|
+
.catch((error) => DynamicUnaryForwarder.#gatewayError(error));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Closes all live backend clients.
|
|
83
|
+
*
|
|
84
|
+
* @returns Completion of backend cleanup.
|
|
85
|
+
*/
|
|
86
|
+
close() {
|
|
87
|
+
return this.#kernel.close();
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates backend children for one logical Gateway subscription.
|
|
91
|
+
*
|
|
92
|
+
* @param request Supplies the public subscription wire.
|
|
93
|
+
* @param signal Cancels child creation.
|
|
94
|
+
* @param maxBackendEnvelopeBytes Limits one backend envelope when supplied.
|
|
95
|
+
* @returns Completion of child creation.
|
|
96
|
+
*/
|
|
97
|
+
subscribeDefinition(request, signal, maxBackendEnvelopeBytes) {
|
|
98
|
+
if (maxBackendEnvelopeBytes !== undefined &&
|
|
99
|
+
(!Number.isSafeInteger(maxBackendEnvelopeBytes) || maxBackendEnvelopeBytes < 1))
|
|
100
|
+
throw new RangeError("maxBackendEnvelopeBytes must be a positive safe integer.");
|
|
101
|
+
return this.#kernel
|
|
102
|
+
.subscribe(request.bytes, signal, maxBackendEnvelopeBytes)
|
|
103
|
+
.catch((error) => DynamicUnaryForwarder.#gatewayError(error));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Updates backend children for a retained Gateway subscription.
|
|
107
|
+
*
|
|
108
|
+
* @param request Supplies the retained public subscription wire.
|
|
109
|
+
* @param maxBackendEnvelopeBytes Limits one backend envelope when supplied.
|
|
110
|
+
* @returns Completion of child recreation.
|
|
111
|
+
*/
|
|
112
|
+
async rehydrateDefinition(request, maxBackendEnvelopeBytes) {
|
|
113
|
+
if (maxBackendEnvelopeBytes !== undefined &&
|
|
114
|
+
(!Number.isSafeInteger(maxBackendEnvelopeBytes) || maxBackendEnvelopeBytes < 1))
|
|
115
|
+
throw new RangeError("maxBackendEnvelopeBytes must be a positive safe integer.");
|
|
116
|
+
await this.#kernel
|
|
117
|
+
.rehydrate(request.bytes, maxBackendEnvelopeBytes)
|
|
118
|
+
.catch((error) => DynamicUnaryForwarder.#gatewayError(error));
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Activates backend update relay for one Gateway subscription.
|
|
122
|
+
*
|
|
123
|
+
* @param wire Supplies the public subscription wire.
|
|
124
|
+
* @param updates Receives relayed subscription updates.
|
|
125
|
+
* @param signal Cancels update relay.
|
|
126
|
+
* @returns Completion after cancellation.
|
|
127
|
+
*/
|
|
128
|
+
activateDefinition(wire, updates, signal) {
|
|
129
|
+
return this.#kernel.activate(wire.bytes, updates, signal);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Cancels backend children for one Gateway subscription.
|
|
133
|
+
*
|
|
134
|
+
* @param wire Supplies the public subscription wire.
|
|
135
|
+
* @param signal Cancels child cleanup when supported.
|
|
136
|
+
* @returns Completion of child cleanup.
|
|
137
|
+
*/
|
|
138
|
+
cancelDefinition(wire, signal) {
|
|
139
|
+
return this.#kernel.cancel(wire.bytes, signal);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Resolves when the supplied signal aborts.
|
|
143
|
+
*
|
|
144
|
+
* @param signal Supplies the signal to observe.
|
|
145
|
+
* @returns Completion after the signal aborts.
|
|
146
|
+
*/
|
|
147
|
+
static waitForAbort(signal) {
|
|
148
|
+
return BackendMembershipKernel.waitForAbort(signal);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Returns the logical identifier encoded in public subscription bytes.
|
|
152
|
+
*
|
|
153
|
+
* @param bytes Supplies the public subscription bytes.
|
|
154
|
+
* @returns The logical identifier, when present.
|
|
155
|
+
*/
|
|
156
|
+
static definitionKey(bytes) {
|
|
157
|
+
return fromBinary(SubscriptionSchema, bytes).id?.value;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Returns bytes with only the immediate child subscription identifier rewritten.
|
|
161
|
+
*
|
|
162
|
+
* @param bytes Supplies the parent subscription bytes.
|
|
163
|
+
* @param node Supplies the child application node.
|
|
164
|
+
* @returns The rewritten child subscription bytes.
|
|
165
|
+
*/
|
|
166
|
+
static childDefinition(bytes, node) {
|
|
167
|
+
const subscription = clone(SubscriptionSchema, fromBinary(SubscriptionSchema, bytes));
|
|
168
|
+
const id = subscription.id?.value;
|
|
169
|
+
if (id === undefined || id.length === 0)
|
|
170
|
+
return bytes.slice();
|
|
171
|
+
const subscriptionId = subscription.id;
|
|
172
|
+
if (subscriptionId === undefined)
|
|
173
|
+
return bytes.slice();
|
|
174
|
+
subscriptionId.value = `${id}/${node.id}`;
|
|
175
|
+
return toBinary(SubscriptionSchema, subscription);
|
|
176
|
+
}
|
|
177
|
+
static #gatewayError(error) {
|
|
178
|
+
if (error instanceof Error && error.message === "backend membership is unavailable.")
|
|
179
|
+
throw new Error("Gateway backend is absent.");
|
|
180
|
+
if (error instanceof Error && error.message === "backend membership kernel is closed.")
|
|
181
|
+
throw new Error("Gateway dynamic owner is closed.");
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=dynamic-unary-forwarder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-unary-forwarder.js","sourceRoot":"","sources":["../../src/gateway/dynamic-unary-forwarder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { TypeRegistryLookup } from "@spine-event-engine/core";
|
|
2
|
+
import type { AuthorizationPolicy, Clock, ContextResolver, RequestCredential, SessionResolver, TransportRequestContext } from "../index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Owned request bytes and canonical operation identity accepted by the B2 gateway.
|
|
5
|
+
*/
|
|
6
|
+
export interface UnaryGatewayRequest {
|
|
7
|
+
/**
|
|
8
|
+
* Identifies the requested gRPC service.
|
|
9
|
+
*/
|
|
10
|
+
readonly service: string;
|
|
11
|
+
/**
|
|
12
|
+
* Identifies the requested gRPC method.
|
|
13
|
+
*/
|
|
14
|
+
readonly method: string;
|
|
15
|
+
/**
|
|
16
|
+
* Holds the owned request bytes.
|
|
17
|
+
*/
|
|
18
|
+
readonly value: Uint8Array;
|
|
19
|
+
/**
|
|
20
|
+
* Holds the credential resolved by the gateway.
|
|
21
|
+
*/
|
|
22
|
+
readonly credential?: RequestCredential | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Holds the allowlisted request transport facts.
|
|
25
|
+
*/
|
|
26
|
+
readonly transport: TransportRequestContext;
|
|
27
|
+
/**
|
|
28
|
+
* Downstream cancellation capability forwarded only to the admitted native effect.
|
|
29
|
+
*/
|
|
30
|
+
readonly signal?: AbortSignal;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* B4-mappable forwarding boundary; credentials and transport extras are never supplied.
|
|
34
|
+
*/
|
|
35
|
+
export interface UnaryForwarder {
|
|
36
|
+
/**
|
|
37
|
+
* Routes an authorized request to its backend service.
|
|
38
|
+
* @param request Holds the canonical request forwarded to the backend.
|
|
39
|
+
* @returns Resolves to the backend response bytes.
|
|
40
|
+
*/
|
|
41
|
+
forward(request: {
|
|
42
|
+
readonly service: string;
|
|
43
|
+
readonly method: string;
|
|
44
|
+
readonly value: Uint8Array;
|
|
45
|
+
readonly signal?: AbortSignal;
|
|
46
|
+
}): Promise<Uint8Array>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Selects exactly one Gateway admission mode.
|
|
50
|
+
*
|
|
51
|
+
* Supply `sessions` for authenticated requests, or `publicAccess: true` for a
|
|
52
|
+
* deliberately public Gateway. Admission establishes a principal only:
|
|
53
|
+
* `authorize` decides whether that principal may perform a decoded request,
|
|
54
|
+
* and `contexts` independently resolves its trusted actor and tenant context.
|
|
55
|
+
* The modes are mutually exclusive.
|
|
56
|
+
*/
|
|
57
|
+
export type GatewayAdmission = {
|
|
58
|
+
/**
|
|
59
|
+
* Resolves authenticated application sessions from incoming credentials.
|
|
60
|
+
*/
|
|
61
|
+
readonly sessions: SessionResolver;
|
|
62
|
+
/**
|
|
63
|
+
* Excludes non-session public admission from authenticated mode.
|
|
64
|
+
*/
|
|
65
|
+
readonly publicAccess?: never;
|
|
66
|
+
} | {
|
|
67
|
+
/**
|
|
68
|
+
* Excludes session resolution from public mode.
|
|
69
|
+
*/
|
|
70
|
+
readonly sessions?: never;
|
|
71
|
+
/**
|
|
72
|
+
* Admits requests under the framework-owned non-session public principal.
|
|
73
|
+
*/
|
|
74
|
+
readonly publicAccess: true;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Common collaborators for every unary Gateway admission mode.
|
|
78
|
+
*
|
|
79
|
+
* Pair these with exactly one {@link GatewayAdmission} to form
|
|
80
|
+
* {@link UnaryGatewayOptions}.
|
|
81
|
+
*/
|
|
82
|
+
export interface UnaryGatewayCollaborators {
|
|
83
|
+
/**
|
|
84
|
+
* Fixed application registry used only to decode command content for policy and context collaborators.
|
|
85
|
+
*/
|
|
86
|
+
readonly registry?: TypeRegistryLookup;
|
|
87
|
+
/**
|
|
88
|
+
* Limits the number of request bytes accepted by the gateway.
|
|
89
|
+
*/
|
|
90
|
+
readonly maxRequestBytes: number;
|
|
91
|
+
/**
|
|
92
|
+
* Allows or rejects an admitted principal for each decoded request.
|
|
93
|
+
*/
|
|
94
|
+
readonly authorize: AuthorizationPolicy["authorize"];
|
|
95
|
+
/**
|
|
96
|
+
* Independently resolves trusted actor and tenant context after authorization.
|
|
97
|
+
*/
|
|
98
|
+
readonly contexts: ContextResolver;
|
|
99
|
+
/**
|
|
100
|
+
* Provides trusted timestamps for context resolution.
|
|
101
|
+
*/
|
|
102
|
+
readonly clock: Clock;
|
|
103
|
+
/**
|
|
104
|
+
* Forwards authorized bytes to the backend service.
|
|
105
|
+
*/
|
|
106
|
+
readonly forward: UnaryForwarder["forward"];
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Gateway collaborators, one admission mode, and a finite byte ownership limit.
|
|
110
|
+
*/
|
|
111
|
+
export type UnaryGatewayOptions = UnaryGatewayCollaborators & GatewayAdmission;
|
|
112
|
+
/**
|
|
113
|
+
* Transport-neutral B4-mappable rejection reasons.
|
|
114
|
+
*/
|
|
115
|
+
export type UnaryGatewayRejection = "request-too-large" | "unknown-operation" | "malformed-request" | "unauthenticated" | "forbidden" | "context-stale";
|
|
116
|
+
/**
|
|
117
|
+
* Forwarded/resolved bytes or a B4-mappable rejection.
|
|
118
|
+
*/
|
|
119
|
+
export type UnaryGatewayResult = {
|
|
120
|
+
/**
|
|
121
|
+
* Identifies a backend-forwarded result.
|
|
122
|
+
*/
|
|
123
|
+
readonly kind: "forwarded";
|
|
124
|
+
/**
|
|
125
|
+
* Holds the backend response bytes.
|
|
126
|
+
*/
|
|
127
|
+
readonly value: Uint8Array;
|
|
128
|
+
} | {
|
|
129
|
+
/**
|
|
130
|
+
* Identifies a resolved trusted-context result.
|
|
131
|
+
*/
|
|
132
|
+
readonly kind: "resolved";
|
|
133
|
+
/**
|
|
134
|
+
* Holds the encoded trusted context.
|
|
135
|
+
*/
|
|
136
|
+
readonly value: Uint8Array;
|
|
137
|
+
} | {
|
|
138
|
+
/**
|
|
139
|
+
* Identifies a rejected request.
|
|
140
|
+
*/
|
|
141
|
+
readonly kind: "rejected";
|
|
142
|
+
/**
|
|
143
|
+
* Explains why the request was rejected.
|
|
144
|
+
*/
|
|
145
|
+
readonly reason: UnaryGatewayRejection;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Transport-neutral B2 unary admission and context-replacement pipeline.
|
|
149
|
+
*/
|
|
150
|
+
export declare class UnaryGateway {
|
|
151
|
+
#private;
|
|
152
|
+
/**
|
|
153
|
+
* Creates a unary admission gateway.
|
|
154
|
+
* @param options Configures admission, authorization, context, and forwarding collaborators.
|
|
155
|
+
*/
|
|
156
|
+
constructor(options: UnaryGatewayOptions);
|
|
157
|
+
/**
|
|
158
|
+
* Handles one admitted unary request.
|
|
159
|
+
* @param request Supplies owned request bytes, credential, and transport facts.
|
|
160
|
+
* @returns Resolves to forwarded bytes, a trusted context, or a rejection.
|
|
161
|
+
*/
|
|
162
|
+
handle(request: UnaryGatewayRequest): Promise<UnaryGatewayResult>;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gateway/index.ts"],"names":[],"mappings":"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"}
|