@spine-event-engine/server 2.0.0-snapshot.25 → 2.0.0-snapshot.28

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 (207) hide show
  1. package/README.md +104 -16
  2. package/REFERENCE.md +486 -57
  3. package/dist/agent/agent-history.d.ts +19 -3
  4. package/dist/agent/agent-history.d.ts.map +1 -1
  5. package/dist/agent/agent-history.js +41 -10
  6. package/dist/agent/agent-history.js.map +1 -1
  7. package/dist/agent/agent-live-ai-runtime.d.ts +1 -1
  8. package/dist/agent/agent-live-ai-runtime.js +1 -1
  9. package/dist/agent/agent-live-budget.d.ts +1 -1
  10. package/dist/agent/agent-live-budget.js +1 -1
  11. package/dist/agent/agent-live-read-runtime.d.ts +13 -2
  12. package/dist/agent/agent-live-read-runtime.d.ts.map +1 -1
  13. package/dist/agent/agent-live-read-runtime.js +6 -5
  14. package/dist/agent/agent-live-read-runtime.js.map +1 -1
  15. package/dist/browser/browser-admission.d.ts +47 -0
  16. package/dist/browser/browser-admission.d.ts.map +1 -0
  17. package/dist/browser/browser-admission.js +200 -0
  18. package/dist/browser/browser-admission.js.map +1 -0
  19. package/dist/browser/browser-server.d.ts +171 -1
  20. package/dist/browser/browser-server.d.ts.map +1 -1
  21. package/dist/browser/browser-server.js +1027 -303
  22. package/dist/browser/browser-server.js.map +1 -1
  23. package/dist/browser/durable-subscription-bindings.d.ts +5 -0
  24. package/dist/browser/durable-subscription-bindings.d.ts.map +1 -1
  25. package/dist/browser/durable-subscription-bindings.js +226 -38
  26. package/dist/browser/durable-subscription-bindings.js.map +1 -1
  27. package/dist/browser/index.d.ts +1 -1
  28. package/dist/browser/index.d.ts.map +1 -1
  29. package/dist/browser/options.d.ts +53 -2
  30. package/dist/browser/options.d.ts.map +1 -1
  31. package/dist/bus/command-bus.d.ts +9 -1
  32. package/dist/bus/command-bus.d.ts.map +1 -1
  33. package/dist/bus/command-bus.js +75 -10
  34. package/dist/bus/command-bus.js.map +1 -1
  35. package/dist/bus/command-errors.d.ts +20 -4
  36. package/dist/bus/command-errors.d.ts.map +1 -1
  37. package/dist/bus/command-errors.js +47 -7
  38. package/dist/bus/command-errors.js.map +1 -1
  39. package/dist/bus/event-bus.d.ts +9 -1
  40. package/dist/bus/event-bus.d.ts.map +1 -1
  41. package/dist/bus/event-bus.js +136 -9
  42. package/dist/bus/event-bus.js.map +1 -1
  43. package/dist/context/bounded-context.d.ts +59 -39
  44. package/dist/context/bounded-context.d.ts.map +1 -1
  45. package/dist/context/bounded-context.js +277 -262
  46. package/dist/context/bounded-context.js.map +1 -1
  47. package/dist/context/entity-inbox.d.ts +12 -17
  48. package/dist/context/entity-inbox.d.ts.map +1 -1
  49. package/dist/context/entity-inbox.js +106 -119
  50. package/dist/context/entity-inbox.js.map +1 -1
  51. package/dist/context/local-inbox-handoff.d.ts +13 -13
  52. package/dist/context/local-inbox-handoff.d.ts.map +1 -1
  53. package/dist/context/local-inbox-handoff.js +60 -32
  54. package/dist/context/local-inbox-handoff.js.map +1 -1
  55. package/dist/context/persistent-tenant-index.d.ts +81 -0
  56. package/dist/context/persistent-tenant-index.d.ts.map +1 -0
  57. package/dist/context/persistent-tenant-index.js +270 -0
  58. package/dist/context/persistent-tenant-index.js.map +1 -0
  59. package/dist/context/projection-handoff.d.ts +9 -9
  60. package/dist/context/projection-handoff.d.ts.map +1 -1
  61. package/dist/context/projection-handoff.js +31 -23
  62. package/dist/context/projection-handoff.js.map +1 -1
  63. package/dist/context/tenant-index.d.ts +7 -6
  64. package/dist/context/tenant-index.d.ts.map +1 -1
  65. package/dist/context/tenant-index.js +2 -188
  66. package/dist/context/tenant-index.js.map +1 -1
  67. package/dist/context/tenant-unknown-error.d.ts +2 -2
  68. package/dist/context/tenant-unknown-error.d.ts.map +1 -1
  69. package/dist/context/tenant-unknown-error.js +4 -1
  70. package/dist/context/tenant-unknown-error.js.map +1 -1
  71. package/dist/delivery/delivery-supervisor.d.ts.map +1 -1
  72. package/dist/delivery/delivery-supervisor.js +12 -3
  73. package/dist/delivery/delivery-supervisor.js.map +1 -1
  74. package/dist/delivery/delivery.d.ts +4 -3
  75. package/dist/delivery/delivery.d.ts.map +1 -1
  76. package/dist/delivery/delivery.js +82 -34
  77. package/dist/delivery/delivery.js.map +1 -1
  78. package/dist/delivery/reception-observation.d.ts +3 -3
  79. package/dist/delivery/reception-observation.js +2 -2
  80. package/dist/entity/entity.d.ts +59 -0
  81. package/dist/entity/entity.d.ts.map +1 -1
  82. package/dist/entity/entity.js +60 -0
  83. package/dist/entity/entity.js.map +1 -1
  84. package/dist/handler/app-query-handler.d.ts +60 -0
  85. package/dist/handler/app-query-handler.d.ts.map +1 -0
  86. package/dist/handler/app-query-handler.js +23 -0
  87. package/dist/handler/app-query-handler.js.map +1 -0
  88. package/dist/handler/generated-registry-discovery.d.ts +6 -0
  89. package/dist/handler/generated-registry-discovery.d.ts.map +1 -1
  90. package/dist/handler/generated-registry-discovery.js +71 -2
  91. package/dist/handler/generated-registry-discovery.js.map +1 -1
  92. package/dist/handler/handler-decorators.d.ts +8 -29
  93. package/dist/handler/handler-decorators.d.ts.map +1 -1
  94. package/dist/handler/handler-decorators.js +33 -210
  95. package/dist/handler/handler-decorators.js.map +1 -1
  96. package/dist/handler/spine-metadata-inventory.d.ts +99 -0
  97. package/dist/handler/spine-metadata-inventory.d.ts.map +1 -0
  98. package/dist/handler/spine-metadata-inventory.js +162 -0
  99. package/dist/handler/spine-metadata-inventory.js.map +1 -0
  100. package/dist/index.d.ts +9 -4
  101. package/dist/index.d.ts.map +1 -1
  102. package/dist/index.js +6 -2
  103. package/dist/index.js.map +1 -1
  104. package/dist/repository/command-routing.d.ts +1 -1
  105. package/dist/repository/command-routing.js +1 -1
  106. package/dist/repository/event-routing.d.ts +1 -1
  107. package/dist/repository/event-routing.js +1 -1
  108. package/dist/repository/repository.d.ts +61 -26
  109. package/dist/repository/repository.d.ts.map +1 -1
  110. package/dist/repository/repository.js +612 -306
  111. package/dist/repository/repository.js.map +1 -1
  112. package/dist/repository/state-update-routing.d.ts +1 -1
  113. package/dist/repository/state-update-routing.js +1 -1
  114. package/dist/runtime/signal-publisher.d.ts +23 -8
  115. package/dist/runtime/signal-publisher.d.ts.map +1 -1
  116. package/dist/runtime/signal-publisher.js +11 -8
  117. package/dist/runtime/signal-publisher.js.map +1 -1
  118. package/dist/server/managed-server-application.d.ts +12 -11
  119. package/dist/server/managed-server-application.d.ts.map +1 -1
  120. package/dist/server/managed-server-application.js +41 -25
  121. package/dist/server/managed-server-application.js.map +1 -1
  122. package/dist/server/node-coordinator.d.ts +18 -5
  123. package/dist/server/node-coordinator.d.ts.map +1 -1
  124. package/dist/server/node-coordinator.js +744 -108
  125. package/dist/server/node-coordinator.js.map +1 -1
  126. package/dist/server/reserved-spine-rpc-paths.json +1 -0
  127. package/dist/server/server-environment.d.ts +23 -5
  128. package/dist/server/server-environment.d.ts.map +1 -1
  129. package/dist/server/server-environment.js +89 -24
  130. package/dist/server/server-environment.js.map +1 -1
  131. package/dist/server/server.d.ts +45 -0
  132. package/dist/server/server.d.ts.map +1 -1
  133. package/dist/server/server.js +112 -3
  134. package/dist/server/server.js.map +1 -1
  135. package/dist/services/app-query-execution.d.ts +53 -0
  136. package/dist/services/app-query-execution.d.ts.map +1 -0
  137. package/dist/services/app-query-execution.js +408 -0
  138. package/dist/services/app-query-execution.js.map +1 -0
  139. package/dist/services/native-operation.d.ts +34 -0
  140. package/dist/services/native-operation.d.ts.map +1 -0
  141. package/dist/services/native-operation.js +77 -0
  142. package/dist/services/native-operation.js.map +1 -0
  143. package/dist/services/query-reader.d.ts +32 -7
  144. package/dist/services/query-reader.d.ts.map +1 -1
  145. package/dist/services/query-reader.js +22 -2
  146. package/dist/services/query-reader.js.map +1 -1
  147. package/dist/services/read-request-status.d.ts +65 -0
  148. package/dist/services/read-request-status.d.ts.map +1 -0
  149. package/dist/services/read-request-status.js +151 -0
  150. package/dist/services/read-request-status.js.map +1 -0
  151. package/dist/services/spine-services.d.ts +42 -7
  152. package/dist/services/spine-services.d.ts.map +1 -1
  153. package/dist/services/spine-services.js +1005 -175
  154. package/dist/services/spine-services.js.map +1 -1
  155. package/dist/services/trusted-reader-ingress.d.ts +110 -0
  156. package/dist/services/trusted-reader-ingress.d.ts.map +1 -0
  157. package/dist/services/trusted-reader-ingress.js +102 -0
  158. package/dist/services/trusted-reader-ingress.js.map +1 -0
  159. package/dist/spi/handler-registry.d.ts +2 -0
  160. package/dist/spi/handler-registry.d.ts.map +1 -1
  161. package/dist/spi/handler-registry.js +1 -1
  162. package/dist/spi/handler-registry.js.map +1 -1
  163. package/dist/stand/read-side-filter-engine.d.ts +46 -0
  164. package/dist/stand/read-side-filter-engine.d.ts.map +1 -0
  165. package/dist/stand/read-side-filter-engine.js +356 -0
  166. package/dist/stand/read-side-filter-engine.js.map +1 -0
  167. package/dist/stand/read-side-filter.d.ts +247 -0
  168. package/dist/stand/read-side-filter.d.ts.map +1 -0
  169. package/dist/stand/read-side-filter.js +39 -0
  170. package/dist/stand/read-side-filter.js.map +1 -0
  171. package/dist/stand/read-side-message.d.ts +66 -0
  172. package/dist/stand/read-side-message.d.ts.map +1 -0
  173. package/dist/stand/read-side-message.js +167 -0
  174. package/dist/stand/read-side-message.js.map +1 -0
  175. package/dist/stand/stand-direct-delivery.d.ts +161 -0
  176. package/dist/stand/stand-direct-delivery.d.ts.map +1 -0
  177. package/dist/stand/stand-direct-delivery.js +210 -0
  178. package/dist/stand/stand-direct-delivery.js.map +1 -0
  179. package/dist/stand/stand.d.ts +81 -43
  180. package/dist/stand/stand.d.ts.map +1 -1
  181. package/dist/stand/stand.js +411 -55
  182. package/dist/stand/stand.js.map +1 -1
  183. package/dist/stand/subscription-observer.d.ts.map +1 -1
  184. package/dist/stand/subscription-observer.js +103 -0
  185. package/dist/stand/subscription-observer.js.map +1 -1
  186. package/dist/stand/subscription-read-filters.d.ts +40 -0
  187. package/dist/stand/subscription-read-filters.d.ts.map +1 -0
  188. package/dist/stand/subscription-read-filters.js +91 -0
  189. package/dist/stand/subscription-read-filters.js.map +1 -0
  190. package/dist/stand/subscription-reader-binding.d.ts +20 -0
  191. package/dist/stand/subscription-reader-binding.d.ts.map +1 -0
  192. package/dist/stand/subscription-reader-binding.js +56 -0
  193. package/dist/stand/subscription-reader-binding.js.map +1 -0
  194. package/dist/stand/subscription-records.d.ts +30 -3
  195. package/dist/stand/subscription-records.d.ts.map +1 -1
  196. package/dist/stand/subscription-records.js +61 -16
  197. package/dist/stand/subscription-records.js.map +1 -1
  198. package/dist/stand/subscription-registry.d.ts +49 -14
  199. package/dist/stand/subscription-registry.d.ts.map +1 -1
  200. package/dist/stand/subscription-registry.js +150 -31
  201. package/dist/stand/subscription-registry.js.map +1 -1
  202. package/dist/stand/subscription-runtime.d.ts +7 -2
  203. package/dist/stand/subscription-runtime.d.ts.map +1 -1
  204. package/dist/stand/subscription-runtime.js +131 -25
  205. package/dist/stand/subscription-runtime.js.map +1 -1
  206. package/dist/tsconfig.tsbuildinfo +1 -1
  207. package/package.json +16 -14
@@ -0,0 +1,53 @@
1
+ import { type Message } from "@bufbuild/protobuf";
2
+ import type { AppQueryResponseFor } from "@spine-event-engine/core";
3
+ import { type TrustedReaderContext } from "@spine-event-engine/core/spi/trusted-reader";
4
+ import { type ActorContext } from "@spine-event-engine/proto";
5
+ import { type AppQuery, type AppQueryResponse } from "@spine-event-engine/proto/client";
6
+ import { AppQueryHandler } from "../handler/app-query-handler.js";
7
+ import { RegisteredTargets } from "./registered-targets.js";
8
+ import { ReadSideFilterEngine } from "../stand/read-side-filter-engine.js";
9
+ /**
10
+ * Dispatches only the App Query handlers selected for one Server assembly.
11
+ */
12
+ export declare class AppQueryExecution {
13
+ #private;
14
+ /**
15
+ * Resolves exact-class generated metadata before the Server listener opens.
16
+ *
17
+ * @param handlers Explicit handler instances selected by this Server.
18
+ * @param targets Entity state routes installed in this Server.
19
+ * @param serverFilters Policies applied only when the result crosses gRPC.
20
+ */
21
+ constructor(handlers: readonly AppQueryHandler<never, Message>[], targets: RegisteredTargets, serverFilters?: ReadSideFilterEngine);
22
+ /**
23
+ * Executes one detached and validated App Query through its selected handler.
24
+ *
25
+ * @param input App Query envelope captured at the Server boundary.
26
+ * @param reader Verified current invocation facts.
27
+ * @param signal Current invocation cancellation, when available.
28
+ * @returns One paired result in a successful response envelope.
29
+ */
30
+ execute(input: AppQuery, reader: TrustedReaderContext, signal?: AbortSignal): Promise<AppQueryResponse>;
31
+ /**
32
+ * Stops accepting App Queries while allowing admitted work to settle.
33
+ */
34
+ beginClose(): void;
35
+ /**
36
+ * Waits for admitted work without treating request failure as a close failure.
37
+ *
38
+ * @returns Completion after every admitted handler settles.
39
+ */
40
+ drain(): Promise<void>;
41
+ /**
42
+ * Wraps a generated application request and returns its paired generated result.
43
+ *
44
+ * @typeParam Q Generated request associated with a declared response.
45
+ * @param request Request from trusted application code.
46
+ * @param actor Current effective actor and tenant context.
47
+ * @param reader Verified current identity and authority facts.
48
+ * @param signal Current invocation cancellation, when available.
49
+ * @returns The selected handler's paired generated result.
50
+ */
51
+ executeTyped<Q extends Message>(request: Q, actor: ActorContext, reader: TrustedReaderContext, signal?: AbortSignal): Promise<AppQueryResponseFor<Q>>;
52
+ }
53
+ //# sourceMappingURL=app-query-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-query-execution.d.ts","sourceRoot":"","sources":["../../src/services/app-query-execution.ts"],"names":[],"mappings":"AAcA,OAAO,EAA6B,KAAK,OAAO,EAAqB,MAAM,oBAAoB,CAAC;AAIhG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAIL,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACtB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,eAAe,EAAwB,MAAM,iCAAiC,CAAC;AAWxF,OAAO,EAAE,iBAAiB,EAAyB,MAAM,yBAAyB,CAAC;AAKnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAW3E;;GAEG;AACH,qBAAa,iBAAiB;;IAe5B;;;;;;OAMG;gBAED,QAAQ,EAAE,SAAS,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EACpD,OAAO,EAAE,iBAAiB,EAC1B,aAAa,CAAC,EAAE,oBAAoB;IAmBtC;;;;;;;OAOG;IACH,OAAO,CACL,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,oBAAoB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,CAAC;IA8B5B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B;;;;;;;;;OASG;IACG,YAAY,CAAC,CAAC,SAAS,OAAO,EAClC,OAAO,EAAE,CAAC,EACV,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,oBAAoB,EAC5B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAkVnC"}
@@ -0,0 +1,408 @@
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 } from "@bufbuild/protobuf";
15
+ import { Code, ConnectError } from "@connectrpc/connect";
16
+ import { AnyPacker, TypeUrls, Validate, QUERY_SERVICE_MAX_RESULTS } from "@spine-event-engine/core";
17
+ import { snapshotTrustedReader, } from "@spine-event-engine/core/spi/trusted-reader";
18
+ import { ActorContextSchema, ResponseSchema, StatusSchema, } from "@spine-event-engine/proto";
19
+ import { AppQuerySchema, AppQueryResponseSchema, QueryIdSchema, } from "@spine-event-engine/proto/client";
20
+ import { randomUUID } from "node:crypto";
21
+ import { AppQueryHandler } from "../handler/app-query-handler.js";
22
+ import { SpineMetadataInventory, } from "../handler/spine-metadata-inventory.js";
23
+ import { ReadRequestStatus } from "./read-request-status.js";
24
+ import { processManagerQueryAccess } from "../entity/entity.js";
25
+ import { RegisteredTargets } from "./registered-targets.js";
26
+ import { QueryReader } from "./query-reader.js";
27
+ import { EffectiveTenants } from "../context/effective-tenant.js";
28
+ import { TenantAdmissions, TenantUnknownError } from "../context/tenant-unknown-error.js";
29
+ import { boundedContextAccess } from "../context/bounded-context.js";
30
+ import { ReadSideFilterEngine } from "../stand/read-side-filter-engine.js";
31
+ /**
32
+ * Dispatches only the App Query handlers selected for one Server assembly.
33
+ */
34
+ export class AppQueryExecution {
35
+ #active = new Set();
36
+ #closing = false;
37
+ #routes = new Map();
38
+ #typedRoutes = new Map();
39
+ #targets;
40
+ #serverFilters;
41
+ #readStatuses = new WeakSet();
42
+ /**
43
+ * Resolves exact-class generated metadata before the Server listener opens.
44
+ *
45
+ * @param handlers Explicit handler instances selected by this Server.
46
+ * @param targets Entity state routes installed in this Server.
47
+ * @param serverFilters Policies applied only when the result crosses gRPC.
48
+ */
49
+ constructor(handlers, targets, serverFilters) {
50
+ this.#targets = targets;
51
+ this.#serverFilters = serverFilters;
52
+ const descriptions = SpineMetadataInventory.selectQueries(handlers.map((handler) => handler.constructor));
53
+ for (let index = 0; index < handlers.length; index++) {
54
+ const handler = handlers[index];
55
+ const description = descriptions[index];
56
+ if (handler === undefined || description === undefined)
57
+ continue;
58
+ const typeUrl = TypeUrls.derive(description.querySchema);
59
+ if (this.#routes.has(typeUrl))
60
+ throw new Error(`Two App Query handlers are registered for ${typeUrl}.`);
61
+ this.#routes.set(typeUrl, { handler, description });
62
+ this.#typedRoutes.set(description.querySchema.typeName, { handler, description });
63
+ }
64
+ }
65
+ /**
66
+ * Executes one detached and validated App Query through its selected handler.
67
+ *
68
+ * @param input App Query envelope captured at the Server boundary.
69
+ * @param reader Verified current invocation facts.
70
+ * @param signal Current invocation cancellation, when available.
71
+ * @returns One paired result in a successful response envelope.
72
+ */
73
+ execute(input, reader, signal) {
74
+ return this.#execute(input, reader, signal, true);
75
+ }
76
+ /**
77
+ * Tracks one accepted handler call while selecting its outward boundary.
78
+ *
79
+ * @param input Captured application request.
80
+ * @param reader Verified caller facts.
81
+ * @param signal Current cancellation.
82
+ * @param outward Whether the result leaves this Server over gRPC.
83
+ * @returns Paired result and successful envelope.
84
+ */
85
+ #execute(input, reader, signal, outward) {
86
+ if (this.#closing)
87
+ return Promise.reject(new ConnectError("App Query execution is closed.", Code.Unavailable));
88
+ const work = this.#run(input, reader, signal, outward);
89
+ this.#active.add(work);
90
+ void work.then(() => this.#active.delete(work), () => this.#active.delete(work));
91
+ return work;
92
+ }
93
+ /**
94
+ * Stops accepting App Queries while allowing admitted work to settle.
95
+ */
96
+ beginClose() {
97
+ this.#closing = true;
98
+ }
99
+ /**
100
+ * Waits for admitted work without treating request failure as a close failure.
101
+ *
102
+ * @returns Completion after every admitted handler settles.
103
+ */
104
+ async drain() {
105
+ await Promise.allSettled(this.#active);
106
+ }
107
+ /**
108
+ * Validates and invokes one admitted query inside a releasable read scope.
109
+ *
110
+ * @param input Captured application query envelope.
111
+ * @param reader Verified current invocation facts.
112
+ * @param signal Current invocation cancellation, when available.
113
+ * @param outward Whether the final result crosses gRPC.
114
+ * @returns One paired result in a successful response envelope.
115
+ */
116
+ async #run(input, reader, signal, outward = true) {
117
+ this.#checkCanceled(signal);
118
+ const { query, route, request } = this.#validated(input);
119
+ const { context, release } = this.#scope(query, reader, signal);
120
+ try {
121
+ const result = await this.#invoke(route, request, context);
122
+ this.#checkCanceled(signal);
123
+ return await this.#response(route, result, query, reader, signal, outward);
124
+ }
125
+ finally {
126
+ release();
127
+ }
128
+ }
129
+ /**
130
+ * Wraps a generated application request and returns its paired generated result.
131
+ *
132
+ * @typeParam Q Generated request associated with a declared response.
133
+ * @param request Request from trusted application code.
134
+ * @param actor Current effective actor and tenant context.
135
+ * @param reader Verified current identity and authority facts.
136
+ * @param signal Current invocation cancellation, when available.
137
+ * @returns The selected handler's paired generated result.
138
+ */
139
+ async executeTyped(request, actor, reader, signal) {
140
+ this.#checkCanceled(signal);
141
+ const route = this.#typedRoutes.get(request.$typeName);
142
+ if (route === undefined)
143
+ throw ReadRequestStatus.invalid("query", true, "App Query target is unsupported.");
144
+ let message;
145
+ try {
146
+ message = AnyPacker.pack(route.description.querySchema, request);
147
+ }
148
+ catch {
149
+ throw ReadRequestStatus.invalid("query", false, "App Query payload is malformed.");
150
+ }
151
+ const envelope = create(AppQuerySchema, {
152
+ id: create(QueryIdSchema, { value: randomUUID() }),
153
+ context: clone(ActorContextSchema, actor),
154
+ message,
155
+ });
156
+ const response = await this.#execute(envelope, reader, signal, false);
157
+ const packed = response.message[0];
158
+ if (packed === undefined)
159
+ throw new ConnectError("App Query response is missing.", Code.Internal);
160
+ return AnyPacker.unpack(packed, route.description.responseSchema);
161
+ }
162
+ /**
163
+ * Resolves the selected handler only after both envelope and root Q validation.
164
+ *
165
+ * @param input Captured application query envelope.
166
+ * @returns Detached envelope, handler route, and decoded request.
167
+ */
168
+ #validated(input) {
169
+ const query = clone(AppQuerySchema, input);
170
+ ReadRequestStatus.check("query", () => Validate.check(AppQuerySchema, query));
171
+ const route = this.#routes.get(query.message?.typeUrl ?? "");
172
+ if (route === undefined)
173
+ throw ReadRequestStatus.invalid("query", true, "App Query target is unsupported.");
174
+ const request = this.#decode(route, query);
175
+ ReadRequestStatus.check("query", () => Validate.check(route.description.querySchema, request));
176
+ return { query, route, request };
177
+ }
178
+ /**
179
+ * Binds one invocation's actor and verified reader to its Entity read scope.
180
+ *
181
+ * @param query Validated detached envelope.
182
+ * @param reader Verified facts for this operation.
183
+ * @param signal Current invocation cancellation, when available.
184
+ * @returns Context and release callback for this invocation only.
185
+ */
186
+ #scope(query, reader, signal) {
187
+ const scope = {};
188
+ if (query.context === undefined)
189
+ throw ReadRequestStatus.invalid("query", false, "App Query context is required.");
190
+ const actor = clone(ActorContextSchema, query.context);
191
+ const context = this.#context(scope, actor, reader, signal);
192
+ const release = processManagerQueryAccess.bind(scope, (plan, schema, wire) => this.#read(plan, schema, wire, query, reader, signal), actor);
193
+ return { context, release };
194
+ }
195
+ /**
196
+ * Builds the immutable handler view over one active read scope.
197
+ *
198
+ * @param scope Invocation binding used by the existing Entity read facade.
199
+ * @param actor Detached effective actor and tenant.
200
+ * @param reader Verified current identity and authority facts.
201
+ * @param signal Current invocation cancellation, when available.
202
+ * @returns A handler-facing capability that fails after release.
203
+ */
204
+ #context(scope, actor, reader, signal) {
205
+ const trusted = snapshotTrustedReader(reader);
206
+ return Object.freeze({
207
+ actorContext: actor,
208
+ ...(trusted.principal === undefined ? {} : { principal: trusted.principal }),
209
+ ...(trusted.authorityFacts === undefined ? {} : { authorityFacts: trusted.authorityFacts }),
210
+ ...(signal === undefined ? {} : { signal }),
211
+ /**
212
+ * Selects an Entity read using this invocation's actor and registered targets.
213
+ *
214
+ * @typeParam Schema Generated state schema of the target Entity.
215
+ * @typeParam Id Identifier type used by the Entity query description.
216
+ * @param description Registered description of the target Entity.
217
+ * @returns A typed read builder bound to this invocation.
218
+ */
219
+ select(description) {
220
+ return processManagerQueryAccess.select(scope, description);
221
+ },
222
+ });
223
+ }
224
+ /**
225
+ * Calls one selected handler while mapping private failures to safe statuses.
226
+ *
227
+ * @param route Handler selected by exact Q type URL.
228
+ * @param request Validated generated Q message.
229
+ * @param context Current read and authority scope.
230
+ * @returns Handler-produced paired response message.
231
+ */
232
+ async #invoke(route, request, context) {
233
+ try {
234
+ return await route.handler.execute(request, context);
235
+ }
236
+ catch (error) {
237
+ this.#checkCanceled(context.signal);
238
+ if (error instanceof ConnectError && this.#readStatuses.has(error))
239
+ throw error;
240
+ throw ReadRequestStatus.technical(error, "App Query execution failed.");
241
+ }
242
+ }
243
+ /**
244
+ * Checks the paired generated R type and serializes one successful result.
245
+ *
246
+ * @param route Selected handler's generated response schema.
247
+ * @param result Handler-produced result message.
248
+ * @param query Original validated application envelope.
249
+ * @param reader Verified current reader facts.
250
+ * @param signal Current cancellation, when supplied.
251
+ * @param outward Whether the response crosses gRPC.
252
+ * @returns Transport response with zero or one packed R.
253
+ */
254
+ async #response(route, result, query, reader, signal, outward) {
255
+ if (result?.$typeName !== route.description.responseSchema.typeName)
256
+ throw new ConnectError("App Query response type is invalid.", Code.Internal);
257
+ const visible = await this.#visibleResponse(route, result, query, reader, signal, outward);
258
+ try {
259
+ return create(AppQueryResponseSchema, {
260
+ response: create(ResponseSchema, {
261
+ status: create(StatusSchema, { status: { case: "ok", value: {} } }),
262
+ }),
263
+ message: visible === null ? [] : [AnyPacker.pack(route.description.responseSchema, visible)],
264
+ });
265
+ }
266
+ catch {
267
+ throw new ConnectError("App Query response is invalid.", Code.Internal);
268
+ }
269
+ }
270
+ /**
271
+ * Applies Server egress policy and maps policy faults to safe transport statuses.
272
+ * @param route Selected Q/R pairing.
273
+ * @param result Handler-produced response.
274
+ * @param query Validated application query.
275
+ * @param reader Verified invocation facts.
276
+ * @param signal Current cancellation.
277
+ * @param outward Whether this result crosses gRPC.
278
+ * @returns Visible response or null when removed.
279
+ */
280
+ async #visibleResponse(route, result, query, reader, signal, outward) {
281
+ if (!outward || this.#serverFilters === undefined)
282
+ return result;
283
+ try {
284
+ return await this.#serverFilters.apply(route.description.responseSchema, result, {
285
+ operation: { kind: "app-query", appQuery: query },
286
+ ...(query.context === undefined ? {} : { actorContext: query.context }),
287
+ ...(query.context?.tenantId === undefined
288
+ ? {}
289
+ : { effectiveTenant: query.context.tenantId }),
290
+ ...reader,
291
+ ...(signal === undefined ? {} : { signal }),
292
+ });
293
+ }
294
+ catch (error) {
295
+ throw ReadRequestStatus.technical(error, "App Query execution failed.");
296
+ }
297
+ }
298
+ /**
299
+ * Routes a handler's scoped Entity read through this Server's registered target.
300
+ *
301
+ * @typeParam Schema Generated Entity state schema selected by the handler.
302
+ * @param plan Existing Entity query predicates and ordering.
303
+ * @param schema Generated target state schema.
304
+ * @param wire Query with the current trusted actor and tenant context.
305
+ * @param enclosing Original application query using this child read.
306
+ * @param reader Verified current reader facts.
307
+ * @param signal Current invocation cancellation, checked before and after the read.
308
+ * @returns Detached matching state snapshots.
309
+ */
310
+ async #read(plan, schema, wire, enclosing, reader, signal) {
311
+ this.#checkCanceled(signal);
312
+ const target = this.#targets.find(TypeUrls.derive(schema));
313
+ if (target === undefined)
314
+ throw this.#readStatus(ReadRequestStatus.invalid("query", true, "Entity query target is unsupported."));
315
+ const visibility = target.repository.metadata.visibility;
316
+ if (visibility !== "query" && visibility !== "full")
317
+ throw this.#readStatus(new ConnectError("Entity query target is not visible.", Code.PermissionDenied));
318
+ this.#targets.validate(target, plan);
319
+ const effective = await this.#admitTenant(target, wire);
320
+ const destination = EffectiveTenants.destination(effective, target.context.isMultitenant);
321
+ const result = await QueryReader.read(target.context.stand(), schema, plan, destination, QUERY_SERVICE_MAX_RESULTS, wire, this.#childReadContext(wire, enclosing, target, reader, destination, signal));
322
+ this.#checkCanceled(signal);
323
+ return Object.freeze(result.map((entry) => entry.state));
324
+ }
325
+ /**
326
+ * Describes one handler-scoped Entity read with its actual target and reader.
327
+ *
328
+ * @param wire Current child Query.
329
+ * @param enclosing Application Query using this read.
330
+ * @param target Registered producing Entity route.
331
+ * @param reader Verified invocation facts.
332
+ * @param tenant Admitted destination tenant, if multitenant.
333
+ * @param signal Current cancellation signal.
334
+ * @returns Detached policy context for the producing Bounded Context.
335
+ */
336
+ #childReadContext(wire, enclosing, target, reader, tenant, signal) {
337
+ return {
338
+ operation: { kind: "query", query: wire },
339
+ enclosingAppQuery: enclosing,
340
+ ...(wire.context === undefined ? {} : { actorContext: wire.context }),
341
+ ...(tenant === undefined ? {} : { effectiveTenant: tenant }),
342
+ producingContext: target.context,
343
+ ...reader,
344
+ ...(signal === undefined ? {} : { signal }),
345
+ };
346
+ }
347
+ /**
348
+ * Checks target tenancy before a scoped Entity read.
349
+ *
350
+ * @param target Registered target selected by state schema.
351
+ * @param wire Query carrying the effective actor and tenant.
352
+ * @returns The resolved tenant scope for destination lookup.
353
+ */
354
+ async #admitTenant(target, wire) {
355
+ const tenantId = wire.context?.tenantId;
356
+ if (target.context.isMultitenant && tenantId === undefined)
357
+ throw this.#readStatus(ReadRequestStatus.tenant("TENANT_REQUIRED", "Tenant is required for this query."));
358
+ if (!target.context.isMultitenant && tenantId !== undefined)
359
+ throw this.#readStatus(ReadRequestStatus.tenant("TENANT_INAPPLICABLE", "Tenant is not applicable for this query."));
360
+ const effective = EffectiveTenants.current(target.context.isMultitenant, tenantId);
361
+ try {
362
+ await boundedContextAccess.admitServiceInput(target.context, tenantId, () => TenantAdmissions.require(target.context.tenantIndex, target.context.name.value, target.context.isMultitenant, tenantId));
363
+ }
364
+ catch (error) {
365
+ if (error instanceof TenantUnknownError)
366
+ throw this.#readStatus(ReadRequestStatus.unknownTenant(error));
367
+ throw error;
368
+ }
369
+ return effective;
370
+ }
371
+ /**
372
+ * Marks a status produced by Server read admission for safe propagation.
373
+ *
374
+ * @param error Structured read failure from this execution scope.
375
+ * @returns The same status for throwing through the handler boundary.
376
+ */
377
+ #readStatus(error) {
378
+ this.#readStatuses.add(error);
379
+ return error;
380
+ }
381
+ /**
382
+ * Stops a canceled invocation before more handler or read work occurs.
383
+ *
384
+ * @param signal Current cancellation signal, when supplied.
385
+ */
386
+ #checkCanceled(signal) {
387
+ if (signal?.aborted)
388
+ throw new ConnectError("App Query was canceled.", Code.Canceled);
389
+ }
390
+ /**
391
+ * Rejects malformed known request bytes before invoking a handler.
392
+ *
393
+ * @param route Selected handler and generated request schema.
394
+ * @param query Validated App Query envelope.
395
+ * @returns Decoded generated Q message.
396
+ */
397
+ #decode(route, query) {
398
+ try {
399
+ if (query.message === undefined)
400
+ throw new Error("Missing App Query message.");
401
+ return fromBinary(route.description.querySchema, query.message.value);
402
+ }
403
+ catch {
404
+ throw ReadRequestStatus.invalid("query", false, "App Query payload is malformed.");
405
+ }
406
+ }
407
+ }
408
+ //# sourceMappingURL=app-query-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-query-execution.js","sourceRoot":"","sources":["../../src/services/app-query-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Host-managed lifetime spanning native authentication and all output.
3
+ */
4
+ export declare class NativeOperation {
5
+ #private;
6
+ /**
7
+ * Starts one native invocation before its authenticator runs.
8
+ *
9
+ * @param transport Incoming peer cancellation.
10
+ * @param shutdown Local host shutdown.
11
+ */
12
+ constructor(transport: AbortSignal, shutdown: AbortSignal);
13
+ /**
14
+ * Returns the signal used by admission, filters, backend work and output guards.
15
+ *
16
+ * @returns Effective operation cancellation.
17
+ */
18
+ get signal(): AbortSignal;
19
+ /**
20
+ * Captures the authenticator's process-local invalidation signal once.
21
+ *
22
+ * @param invalidated Optional authenticated session invalidation.
23
+ */
24
+ link(invalidated?: AbortSignal): void;
25
+ /**
26
+ * Rejects side effects or output after any linked cancellation.
27
+ */
28
+ check(): void;
29
+ /**
30
+ * Closes the invocation even when its transport peer remains connected.
31
+ */
32
+ close(): void;
33
+ }
34
+ //# sourceMappingURL=native-operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-operation.d.ts","sourceRoot":"","sources":["../../src/services/native-operation.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,qBAAa,eAAe;;IAS1B;;;;;OAKG;gBACS,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW;IAQzD;;;;OAIG;IACH,IAAI,MAAM,IAAI,WAAW,CAExB;IAED;;;;OAIG;IACH,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI;IAMrC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,KAAK,IAAI,IAAI;CAUd"}
@@ -0,0 +1,77 @@
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 { Code, ConnectError } from "@connectrpc/connect";
15
+ /**
16
+ * Host-managed lifetime spanning native authentication and all output.
17
+ */
18
+ export class NativeOperation {
19
+ #controller = new AbortController();
20
+ #transport;
21
+ #shutdown;
22
+ #invalidated;
23
+ /**
24
+ * Starts one native invocation before its authenticator runs.
25
+ *
26
+ * @param transport Incoming peer cancellation.
27
+ * @param shutdown Local host shutdown.
28
+ */
29
+ constructor(transport, shutdown) {
30
+ this.#transport = transport;
31
+ this.#shutdown = shutdown;
32
+ transport.addEventListener("abort", this.#abort, { once: true });
33
+ shutdown.addEventListener("abort", this.#abort, { once: true });
34
+ if (transport.aborted || shutdown.aborted)
35
+ this.#abort();
36
+ }
37
+ /**
38
+ * Returns the signal used by admission, filters, backend work and output guards.
39
+ *
40
+ * @returns Effective operation cancellation.
41
+ */
42
+ get signal() {
43
+ return this.#controller.signal;
44
+ }
45
+ /**
46
+ * Captures the authenticator's process-local invalidation signal once.
47
+ *
48
+ * @param invalidated Optional authenticated session invalidation.
49
+ */
50
+ link(invalidated) {
51
+ this.#invalidated = invalidated;
52
+ invalidated?.addEventListener("abort", this.#abort, { once: true });
53
+ if (invalidated?.aborted)
54
+ this.#abort();
55
+ }
56
+ /**
57
+ * Rejects side effects or output after any linked cancellation.
58
+ */
59
+ check() {
60
+ if (this.signal.aborted)
61
+ throw new ConnectError("Reader operation cancelled.", Code.Canceled);
62
+ }
63
+ /**
64
+ * Closes the invocation even when its transport peer remains connected.
65
+ */
66
+ close() {
67
+ this.#abort();
68
+ this.#transport.removeEventListener("abort", this.#abort);
69
+ this.#shutdown.removeEventListener("abort", this.#abort);
70
+ this.#invalidated?.removeEventListener("abort", this.#abort);
71
+ }
72
+ #abort = () => {
73
+ if (!this.#controller.signal.aborted)
74
+ this.#controller.abort();
75
+ };
76
+ }
77
+ //# sourceMappingURL=native-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-operation.js","sourceRoot":"","sources":["../../src/services/native-operation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,OAAO,eAAe;IACjB,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAEpC,UAAU,CAAc;IAExB,SAAS,CAAc;IAEhC,YAAY,CAA0B;IAEtC;;;;;OAKG;IACH,YAAY,SAAsB,EAAE,QAAqB;QACvD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,IAAI,SAAS,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,WAAyB;QAC5B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,WAAW,EAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,IAAI,WAAW,EAAE,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,6BAA6B,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChG,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,YAAY,EAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC;IAEQ,MAAM,GAAG,GAAS,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IACjE,CAAC,CAAC;CACH"}
@@ -2,18 +2,43 @@ import type { MessageSchema } from "@spine-event-engine/core";
2
2
  import type { TenantId } from "@spine-event-engine/proto";
3
3
  import { type Query } from "@spine-event-engine/proto/client";
4
4
  import type { NormalizedQueryPlan } from "@spine-event-engine/storage";
5
- import type { Stand, StandReadResult } from "../stand/stand.js";
5
+ import { type Stand, type StandReadResult } from "../stand/stand.js";
6
+ import type { ReadSideContext } from "../stand/read-side-filter.js";
7
+ /**
8
+ * Callback notified when a typed Stand query is read.
9
+ */
6
10
  type QueryReaderObserver = (query: Readonly<Query>) => void;
11
+ /**
12
+ * Describes typed Stand queries and the testing-only read observer.
13
+ */
14
+ interface QueryReaderAccess {
15
+ /**
16
+ * Reads a typed state through its Stand while retaining the actual query context.
17
+ * @typeParam Schema Registered state schema.
18
+ * @param stand Context read facade.
19
+ * @param schema Requested state schema.
20
+ * @param plan Normalized storage plan.
21
+ * @param tenantId Effective tenant.
22
+ * @param candidateLimit Existing query candidate limit.
23
+ * @param query Original submitted Query, if present.
24
+ * @param readSide Trusted invocation context, if present.
25
+ * @returns Visible state records.
26
+ */
27
+ read<Schema extends MessageSchema>(stand: Stand, schema: Schema, plan: NormalizedQueryPlan<unknown>, tenantId: TenantId | undefined, candidateLimit: number, query?: Query, readSide?: ReadSideContext): Promise<readonly StandReadResult<Schema>[]>;
28
+ /**
29
+ * Observes original queries for tests without changing read execution.
30
+ * @param onRead Observer called with a detached Query.
31
+ * @returns Handle that removes this observer.
32
+ */
33
+ observe(onRead: QueryReaderObserver): {
34
+ readonly close: () => void;
35
+ };
36
+ }
7
37
  /**
8
38
  * Executes normalized Entity query plans against a Stand and exposes a testing-only read observer.
9
39
  *
10
40
  * @internal
11
41
  */
12
- export declare const QueryReader: Readonly<{
13
- readonly read: <Schema extends MessageSchema>(stand: Stand, schema: Schema, plan: NormalizedQueryPlan<unknown>, tenantId: TenantId | undefined, candidateLimit: number, query?: Query) => Promise<readonly StandReadResult<Schema>[]>;
14
- readonly observe: (onRead: QueryReaderObserver) => {
15
- readonly close: () => void;
16
- };
17
- }>;
42
+ export declare const QueryReader: Readonly<QueryReaderAccess>;
18
43
  export {};
19
44
  //# sourceMappingURL=query-reader.d.ts.map