@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.
Files changed (57) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +112 -0
  3. package/REFERENCE.md +94 -0
  4. package/dist/gateway/dynamic-subscription-creator.d.ts +52 -0
  5. package/dist/gateway/dynamic-subscription-creator.d.ts.map +1 -0
  6. package/dist/gateway/dynamic-subscription-creator.js +71 -0
  7. package/dist/gateway/dynamic-subscription-creator.js.map +1 -0
  8. package/dist/gateway/dynamic-unary-forwarder.d.ts +130 -0
  9. package/dist/gateway/dynamic-unary-forwarder.d.ts.map +1 -0
  10. package/dist/gateway/dynamic-unary-forwarder.js +185 -0
  11. package/dist/gateway/dynamic-unary-forwarder.js.map +1 -0
  12. package/dist/gateway/index.d.ts +164 -0
  13. package/dist/gateway/index.d.ts.map +1 -0
  14. package/dist/gateway/index.js +195 -0
  15. package/dist/gateway/index.js.map +1 -0
  16. package/dist/index.d.ts +433 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +56 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/native/index.d.ts +182 -0
  21. package/dist/native/index.d.ts.map +1 -0
  22. package/dist/native/index.js +463 -0
  23. package/dist/native/index.js.map +1 -0
  24. package/dist/oidc/contracts.d.ts +334 -0
  25. package/dist/oidc/contracts.d.ts.map +1 -0
  26. package/dist/oidc/contracts.js +15 -0
  27. package/dist/oidc/contracts.js.map +1 -0
  28. package/dist/oidc/index.d.ts +41 -0
  29. package/dist/oidc/index.d.ts.map +1 -0
  30. package/dist/oidc/index.js +825 -0
  31. package/dist/oidc/index.js.map +1 -0
  32. package/dist/providers/index.d.ts +154 -0
  33. package/dist/providers/index.d.ts.map +1 -0
  34. package/dist/providers/index.js +574 -0
  35. package/dist/providers/index.js.map +1 -0
  36. package/dist/request/index.d.ts +10 -0
  37. package/dist/request/index.d.ts.map +1 -0
  38. package/dist/request/index.js +81 -0
  39. package/dist/request/index.js.map +1 -0
  40. package/dist/sessions/cookies.d.ts +104 -0
  41. package/dist/sessions/cookies.d.ts.map +1 -0
  42. package/dist/sessions/cookies.js +295 -0
  43. package/dist/sessions/cookies.js.map +1 -0
  44. package/dist/sessions/opaque.d.ts +163 -0
  45. package/dist/sessions/opaque.d.ts.map +1 -0
  46. package/dist/sessions/opaque.js +268 -0
  47. package/dist/sessions/opaque.js.map +1 -0
  48. package/dist/sessions/signed.d.ts +245 -0
  49. package/dist/sessions/signed.d.ts.map +1 -0
  50. package/dist/sessions/signed.js +534 -0
  51. package/dist/sessions/signed.js.map +1 -0
  52. package/dist/subscriptions/index.d.ts +463 -0
  53. package/dist/subscriptions/index.d.ts.map +1 -0
  54. package/dist/subscriptions/index.js +814 -0
  55. package/dist/subscriptions/index.js.map +1 -0
  56. package/dist/tsconfig.tsbuildinfo +1 -0
  57. package/package.json +37 -0
@@ -0,0 +1,463 @@
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, create, fromBinary, toBinary } from "@bufbuild/protobuf";
15
+ import { Code, ConnectError, createClient, } from "@connectrpc/connect";
16
+ import { CommandService, QueryService, SubscriptionSchema, SubscriptionService, SubscriptionUpdateSchema, TopicSchema, } from "@spine-event-engine/proto/client";
17
+ import { AuthenticationService } from "@spine-event-engine/proto/auth";
18
+ const relayDefaults = {
19
+ maxMessages: 64,
20
+ maxBytes: 1_048_576,
21
+ };
22
+ /**
23
+ * A bounded asynchronous FIFO relay between one private backend stream and one public Connect stream.
24
+ */
25
+ export class SubscriptionUpdateRelay {
26
+ #limits;
27
+ #queue = [];
28
+ #waiters = [];
29
+ #bytes = 0;
30
+ #terminal;
31
+ #closed = false;
32
+ /**
33
+ * Creates a bounded FIFO relay.
34
+ * @param limits The optional message and byte bounds.
35
+ */
36
+ constructor(limits = {}) {
37
+ this.#limits = NativeGatewayValues.relayLimits(limits);
38
+ }
39
+ /**
40
+ * Copies and validates an update before FIFO admission. Count precedes bytes;
41
+ * either bound rejects with `ResourceExhausted`.
42
+ * @param update The update bytes to admit.
43
+ * @returns Completes after the update is admitted or rejected.
44
+ */
45
+ push(update) {
46
+ try {
47
+ if (this.#closed)
48
+ throw NativeGatewayValues.terminalError(this.#terminal);
49
+ const nextMessages = this.#queue.length + 1;
50
+ if (nextMessages > this.#limits.maxMessages)
51
+ return this.#failOverflow("message", this.#limits.maxMessages, nextMessages);
52
+ const bytes = update.bytes.slice();
53
+ let decoded;
54
+ try {
55
+ decoded = fromBinary(SubscriptionUpdateSchema, bytes);
56
+ }
57
+ catch (error) {
58
+ bytes.fill(0);
59
+ this.#finish(error);
60
+ throw error;
61
+ }
62
+ const nextBytes = this.#bytes + bytes.byteLength;
63
+ if (nextBytes > this.#limits.maxBytes) {
64
+ bytes.fill(0);
65
+ return this.#failOverflow("byte", this.#limits.maxBytes, nextBytes);
66
+ }
67
+ const waiter = this.#waiters.shift();
68
+ if (waiter !== undefined) {
69
+ waiter.resolve({ done: false, value: clone(SubscriptionUpdateSchema, decoded) });
70
+ bytes.fill(0);
71
+ return Promise.resolve();
72
+ }
73
+ this.#bytes = nextBytes;
74
+ this.#queue.push(bytes);
75
+ return Promise.resolve();
76
+ }
77
+ catch (error) {
78
+ return NativeRelayValues.rejectedRelayPromise(error);
79
+ }
80
+ }
81
+ /**
82
+ * Starts graceful FIFO drain; later cancellation or failure supersedes it and purges queued bytes.
83
+ */
84
+ close() {
85
+ this.#finish();
86
+ }
87
+ /**
88
+ * Throws queued and future consumers, purging bytes.
89
+ * @param reason The terminal failure reason.
90
+ */
91
+ fail(reason) {
92
+ this.#finish(reason);
93
+ }
94
+ /**
95
+ * Returns the public iterator; `return()` cancels it and purges queued bytes, while `throw()` fails it.
96
+ * @returns The single public update iterator.
97
+ */
98
+ [Symbol.asyncIterator]() {
99
+ return {
100
+ next: () => this.#next(),
101
+ return: () => {
102
+ this.#finish(new ConnectError("subscription stream cancelled", Code.Canceled));
103
+ return Promise.resolve({ done: true, value: undefined });
104
+ },
105
+ throw: (reason) => {
106
+ this.#finish(reason);
107
+ return NativeRelayValues.rejectedRelayPromise(reason);
108
+ },
109
+ };
110
+ }
111
+ async #next() {
112
+ const bytes = this.#queue.shift();
113
+ if (bytes !== undefined) {
114
+ this.#bytes -= bytes.byteLength;
115
+ try {
116
+ return {
117
+ done: false,
118
+ value: clone(SubscriptionUpdateSchema, fromBinary(SubscriptionUpdateSchema, bytes)),
119
+ };
120
+ }
121
+ finally {
122
+ bytes.fill(0);
123
+ }
124
+ }
125
+ if (this.#closed) {
126
+ if (this.#terminal !== undefined)
127
+ throw NativeGatewayValues.terminalError(this.#terminal);
128
+ return { done: true, value: undefined };
129
+ }
130
+ return new Promise((resolve, reject) => this.#waiters.push({ resolve, reject }));
131
+ }
132
+ #failOverflow(dimension, limit, observed) {
133
+ const error = new ConnectError(`subscription relay ${dimension} limit ${String(limit)} exceeded by ${String(observed)}`, Code.ResourceExhausted);
134
+ this.#finish(error);
135
+ throw error;
136
+ }
137
+ #finish(reason) {
138
+ if (this.#closed) {
139
+ if (this.#terminal !== undefined || reason === undefined)
140
+ return;
141
+ this.#terminal = reason;
142
+ for (const bytes of this.#queue)
143
+ bytes.fill(0);
144
+ this.#queue.length = 0;
145
+ this.#bytes = 0;
146
+ return;
147
+ }
148
+ this.#closed = true;
149
+ this.#terminal = reason;
150
+ if (reason !== undefined) {
151
+ for (const bytes of this.#queue)
152
+ bytes.fill(0);
153
+ this.#queue.length = 0;
154
+ this.#bytes = 0;
155
+ }
156
+ const waiters = this.#waiters.splice(0);
157
+ for (const waiter of waiters) {
158
+ if (reason === undefined)
159
+ waiter.resolve({ done: true, value: undefined });
160
+ else
161
+ waiter.reject(reason);
162
+ }
163
+ }
164
+ }
165
+ /**
166
+ * Creates completed native-relay rejection values.
167
+ */
168
+ const NativeRelayValues = Object.freeze({
169
+ rejectedRelayPromise(reason) {
170
+ return Promise.resolve().then(() => {
171
+ throw reason;
172
+ });
173
+ },
174
+ });
175
+ /**
176
+ * Native Connect adapter. Post/Read use their matching Command/Query descriptors;
177
+ * Subscribe/Activate/Cancel/Dispose use the shared Subscription descriptors.
178
+ * Every call receives only an admitted AbortSignal, never browser credentials or facts.
179
+ */
180
+ export class NativeSubscriptionCreator {
181
+ #transport;
182
+ /**
183
+ * Creates a native adapter over one Connect transport.
184
+ * @param transport The native Connect transport.
185
+ */
186
+ constructor(transport) {
187
+ this.#transport = transport;
188
+ }
189
+ /**
190
+ * Sends an admitted Post or Read envelope through its matching native descriptor.
191
+ * @param request The admitted unary request envelope.
192
+ * @returns The encoded native response.
193
+ */
194
+ async forward(request) {
195
+ if (request.service === "spine.client.CommandService" && request.method === "Post")
196
+ return toBinary(CommandService.method.post.output, await createClient(CommandService, this.#transport).post(fromBinary(CommandService.method.post.input, request.value), ...(request.signal === undefined ? [] : [{ signal: request.signal }])));
197
+ if (request.service === "spine.client.QueryService" && request.method === "Read")
198
+ return toBinary(QueryService.method.read.output, await createClient(QueryService, this.#transport).read(fromBinary(QueryService.method.read.input, request.value), ...(request.signal === undefined ? [] : [{ signal: request.signal }])));
199
+ throw new ConnectError("unsupported native unary operation", Code.Unimplemented);
200
+ }
201
+ /**
202
+ * Creates a native subscription with the supplied admitted cancellation signal.
203
+ * @param request The admitted canonical subscription definition.
204
+ * @param signal The admitted cancellation signal.
205
+ * @returns The private backend subscription envelope.
206
+ */
207
+ async subscribe(request, signal) {
208
+ const result = await createClient(SubscriptionService, this.#transport).subscribe(fromBinary(SubscriptionSchema, request.bytes).topic ?? create(TopicSchema), { signal });
209
+ return { kind: "backend-subscription-envelope", bytes: toBinary(SubscriptionSchema, result) };
210
+ }
211
+ /**
212
+ * Streams native Activate updates through the supplied asynchronous public-update sink.
213
+ * @param request The private native subscription envelope and update sink.
214
+ * @param signal The admitted cancellation signal.
215
+ * @returns Completes after native activation ends.
216
+ */
217
+ async activate(request, signal) {
218
+ const subscription = fromBinary(SubscriptionSchema, request.wire.bytes);
219
+ for await (const update of createClient(SubscriptionService, this.#transport).activate(subscription, { signal }))
220
+ await request.updates({
221
+ kind: "subscription-update",
222
+ bytes: toBinary(SubscriptionUpdateSchema, update),
223
+ });
224
+ }
225
+ /**
226
+ * Cancels the native subscription represented by the canonical definition.
227
+ * @param request The canonical subscription definition.
228
+ * @param signal The admitted cancellation signal.
229
+ * @returns Completes after native cancellation ends.
230
+ */
231
+ async cancel(request, signal) {
232
+ await createClient(SubscriptionService, this.#transport).cancel(fromBinary(SubscriptionSchema, request.wire.bytes), { signal });
233
+ }
234
+ /**
235
+ * Performs mandatory native cancellation/disposal compensation for a private envelope.
236
+ * @param envelope The private backend subscription envelope.
237
+ * @param signal The admitted cancellation signal.
238
+ * @returns Completes after native disposal ends.
239
+ */
240
+ async dispose(envelope, signal) {
241
+ await createClient(SubscriptionService, this.#transport).cancel(fromBinary(SubscriptionSchema, envelope.bytes), { signal });
242
+ }
243
+ }
244
+ /**
245
+ * Creates native handlers without exposing private envelopes.
246
+ *
247
+ * Unauthenticated requests map to `Unauthenticated`; forbidden or denied requests to
248
+ * `PermissionDenied`; request/capacity limits to `ResourceExhausted`; busy bindings to `Aborted`;
249
+ * and unknown operations to `Unimplemented`. Malformed, stale-context, backend-envelope, and other
250
+ * validation rejections map to `InvalidArgument`. Terminal context/iterator paths abort native
251
+ * work. Natural completion drains FIFO updates, whereas failure or iterator cancellation purges
252
+ * them.
253
+ * @param options The unary, subscription, context, and relay dependencies.
254
+ * @returns The native Connect service implementations.
255
+ */
256
+ export function createNativeGatewayServices(options) {
257
+ return {
258
+ authentication: {
259
+ resolveContext: async (request, context) => NativeGatewayValues.resolveContext(options, request, context),
260
+ },
261
+ command: {
262
+ post: async (request, context) => NativeGatewayValues.commandResponse(options, request, context),
263
+ },
264
+ query: {
265
+ read: async (request, context) => NativeGatewayValues.queryResponse(options, request, context),
266
+ },
267
+ subscription: {
268
+ subscribe: async (request, context) => {
269
+ const result = await options.subscriptions.handle(NativeGatewayValues.subscriptionRequest("Subscribe", toBinary(TopicSchema, request), context, options.requests));
270
+ if (result.kind !== "subscribed")
271
+ throw NativeGatewayValues.gatewayResultError(result);
272
+ return fromBinary(SubscriptionSchema, result.wire.bytes);
273
+ },
274
+ activate: (request, context) => NativeGatewayValues.activate(options, request, context),
275
+ cancel: async (request, context) => {
276
+ const result = await options.subscriptions.handle(NativeGatewayValues.subscriptionRequest("Cancel", toBinary(SubscriptionSchema, request), context, options.requests));
277
+ if (result.kind !== "cancelled")
278
+ throw NativeGatewayValues.gatewayResultError(result);
279
+ return create(SubscriptionService.method.cancel.output);
280
+ },
281
+ },
282
+ };
283
+ }
284
+ /**
285
+ * Converts native Connect gateway inputs, responses, and errors.
286
+ */
287
+ const NativeGatewayValues = Object.freeze({
288
+ async resolveContext(options, request, context) {
289
+ const result = await options.unary.handle({
290
+ service: "spine.auth.AuthenticationService",
291
+ method: "ResolveContext",
292
+ value: toBinary(AuthenticationService.method.resolveContext.input, request),
293
+ credential: options.requests.credential(context),
294
+ transport: options.requests.transport(context),
295
+ signal: context.signal,
296
+ });
297
+ if (result.kind === "rejected")
298
+ throw NativeGatewayValues.unaryError(result);
299
+ if (result.kind !== "resolved")
300
+ throw new ConnectError("gateway forwarded ResolveContext unexpectedly", Code.Internal);
301
+ return fromBinary(AuthenticationService.method.resolveContext.output, result.value);
302
+ },
303
+ async commandResponse(options, request, context) {
304
+ const result = await options.unary.handle({
305
+ service: "spine.client.CommandService",
306
+ method: "Post",
307
+ value: toBinary(CommandService.method.post.input, request),
308
+ credential: options.requests.credential(context),
309
+ transport: options.requests.transport(context),
310
+ signal: context.signal,
311
+ });
312
+ if (result.kind === "rejected")
313
+ throw NativeGatewayValues.unaryError(result);
314
+ return fromBinary(CommandService.method.post.output, result.value);
315
+ },
316
+ async queryResponse(options, request, context) {
317
+ const result = await options.unary.handle({
318
+ service: "spine.client.QueryService",
319
+ method: "Read",
320
+ value: toBinary(QueryService.method.read.input, request),
321
+ credential: options.requests.credential(context),
322
+ transport: options.requests.transport(context),
323
+ signal: context.signal,
324
+ });
325
+ if (result.kind === "rejected")
326
+ throw NativeGatewayValues.unaryError(result);
327
+ return fromBinary(QueryService.method.read.output, result.value);
328
+ },
329
+ activate(options, request, context) {
330
+ const relay = new SubscriptionUpdateRelay(options.relay);
331
+ const controller = new AbortController();
332
+ let closed = false;
333
+ let started = false;
334
+ let cancellation;
335
+ const cancel = () => {
336
+ cancellation ??= options.subscriptions
337
+ .handle(NativeGatewayValues.subscriptionRequest("Cancel", toBinary(SubscriptionSchema, request), context, options.requests))
338
+ .then(() => undefined, () => undefined);
339
+ return cancellation;
340
+ };
341
+ const close = (reason, abort) => {
342
+ if (closed) {
343
+ if (reason === undefined)
344
+ return;
345
+ context.signal.removeEventListener("abort", onAbort);
346
+ if (abort)
347
+ controller.abort();
348
+ relay.fail(reason);
349
+ return;
350
+ }
351
+ closed = true;
352
+ if (abort)
353
+ controller.abort();
354
+ if (reason === undefined)
355
+ relay.close();
356
+ else {
357
+ context.signal.removeEventListener("abort", onAbort);
358
+ relay.fail(reason);
359
+ }
360
+ };
361
+ const onAbort = () => {
362
+ close(new ConnectError("subscription stream cancelled", Code.Canceled), true);
363
+ if (started)
364
+ void cancel();
365
+ };
366
+ context.signal.addEventListener("abort", onAbort, { once: true });
367
+ if (context.signal.aborted) {
368
+ onAbort();
369
+ return NativeGatewayValues.activationStream(relay, (reason) => {
370
+ close(reason, true);
371
+ });
372
+ }
373
+ started = true;
374
+ void options.subscriptions
375
+ .handle({
376
+ ...NativeGatewayValues.subscriptionRequest("Activate", toBinary(SubscriptionSchema, request), context, options.requests),
377
+ updates: (update) => relay.push(update),
378
+ signal: controller.signal,
379
+ })
380
+ .then((result) => {
381
+ if (result.kind !== "activated")
382
+ close(NativeGatewayValues.gatewayResultError(result), true);
383
+ else
384
+ close(undefined, false);
385
+ })
386
+ .catch((error) => {
387
+ close(error, true);
388
+ });
389
+ return NativeGatewayValues.activationStream(relay, (reason) => {
390
+ close(reason, true);
391
+ });
392
+ },
393
+ activationStream(relay, onClose) {
394
+ return {
395
+ [Symbol.asyncIterator]() {
396
+ const iterator = relay[Symbol.asyncIterator]();
397
+ return {
398
+ next: () => iterator.next(),
399
+ return: () => {
400
+ onClose(new ConnectError("subscription stream cancelled", Code.Canceled));
401
+ return Promise.resolve({ done: true, value: undefined });
402
+ },
403
+ throw: (reason) => {
404
+ onClose(reason);
405
+ return NativeRelayValues.rejectedRelayPromise(reason);
406
+ },
407
+ };
408
+ },
409
+ };
410
+ },
411
+ subscriptionRequest(method, bytes, context, requests) {
412
+ return {
413
+ service: "spine.client.SubscriptionService",
414
+ method,
415
+ wire: method === "Subscribe"
416
+ ? { kind: "subscription-topic", bytes }
417
+ : { kind: "public-subscription", bytes },
418
+ credential: requests.credential(context),
419
+ transport: requests.transport(context),
420
+ };
421
+ },
422
+ unaryError(result) {
423
+ const code = result.reason === "unauthenticated"
424
+ ? Code.Unauthenticated
425
+ : result.reason === "forbidden"
426
+ ? Code.PermissionDenied
427
+ : result.reason === "request-too-large"
428
+ ? Code.ResourceExhausted
429
+ : result.reason === "unknown-operation"
430
+ ? Code.Unimplemented
431
+ : Code.InvalidArgument;
432
+ return new ConnectError(`gateway rejected ${result.reason}`, code);
433
+ },
434
+ gatewayResultError(result) {
435
+ if (result.kind !== "rejected")
436
+ return new ConnectError("subscription gateway returned an unexpected operation result", Code.Internal);
437
+ const code = result.reason === "unauthenticated"
438
+ ? Code.Unauthenticated
439
+ : result.reason === "forbidden" || result.reason === "denied"
440
+ ? Code.PermissionDenied
441
+ : result.reason === "request-too-large"
442
+ ? Code.ResourceExhausted
443
+ : result.reason === "binding-busy"
444
+ ? Code.Aborted
445
+ : result.reason === "unknown-operation"
446
+ ? Code.Unimplemented
447
+ : Code.InvalidArgument;
448
+ return new ConnectError(`gateway rejected ${result.reason}`, code);
449
+ },
450
+ relayLimits(input) {
451
+ const limits = { ...relayDefaults, ...input };
452
+ for (const limit of Object.values(limits))
453
+ if (!Number.isSafeInteger(limit) || limit <= 0)
454
+ throw new RangeError("subscription relay limits must be positive safe integers");
455
+ return limits;
456
+ },
457
+ terminalError(reason) {
458
+ return reason instanceof Error
459
+ ? reason
460
+ : new ConnectError("subscription stream closed", Code.Canceled);
461
+ },
462
+ });
463
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"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"}