@relkit/providers-local 0.0.0

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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/dist/buckets/index.d.ts +5 -0
  4. package/dist/buckets/index.d.ts.map +1 -0
  5. package/dist/buckets/index.js +5 -0
  6. package/dist/buckets/index.js.map +1 -0
  7. package/dist/buckets/keys.d.ts +7 -0
  8. package/dist/buckets/keys.d.ts.map +1 -0
  9. package/dist/buckets/keys.js +60 -0
  10. package/dist/buckets/keys.js.map +1 -0
  11. package/dist/buckets/operations.d.ts +11 -0
  12. package/dist/buckets/operations.d.ts.map +1 -0
  13. package/dist/buckets/operations.js +89 -0
  14. package/dist/buckets/operations.js.map +1 -0
  15. package/dist/buckets/pagination.d.ts +5 -0
  16. package/dist/buckets/pagination.d.ts.map +1 -0
  17. package/dist/buckets/pagination.js +34 -0
  18. package/dist/buckets/pagination.js.map +1 -0
  19. package/dist/buckets/policy.d.ts +8 -0
  20. package/dist/buckets/policy.d.ts.map +1 -0
  21. package/dist/buckets/policy.js +74 -0
  22. package/dist/buckets/policy.js.map +1 -0
  23. package/dist/buckets/provider.d.ts +4 -0
  24. package/dist/buckets/provider.d.ts.map +1 -0
  25. package/dist/buckets/provider.js +119 -0
  26. package/dist/buckets/provider.js.map +1 -0
  27. package/dist/buckets/storage.d.ts +12 -0
  28. package/dist/buckets/storage.d.ts.map +1 -0
  29. package/dist/buckets/storage.js +169 -0
  30. package/dist/buckets/storage.js.map +1 -0
  31. package/dist/buckets/types.d.ts +91 -0
  32. package/dist/buckets/types.d.ts.map +1 -0
  33. package/dist/buckets/types.js +34 -0
  34. package/dist/buckets/types.js.map +1 -0
  35. package/dist/cache/index.d.ts +8 -0
  36. package/dist/cache/index.d.ts.map +1 -0
  37. package/dist/cache/index.js +8 -0
  38. package/dist/cache/index.js.map +1 -0
  39. package/dist/cache/inspector.d.ts +4 -0
  40. package/dist/cache/inspector.d.ts.map +1 -0
  41. package/dist/cache/inspector.js +62 -0
  42. package/dist/cache/inspector.js.map +1 -0
  43. package/dist/cache/keys.d.ts +6 -0
  44. package/dist/cache/keys.d.ts.map +1 -0
  45. package/dist/cache/keys.js +34 -0
  46. package/dist/cache/keys.js.map +1 -0
  47. package/dist/cache/persistence.d.ts +5 -0
  48. package/dist/cache/persistence.d.ts.map +1 -0
  49. package/dist/cache/persistence.js +108 -0
  50. package/dist/cache/persistence.js.map +1 -0
  51. package/dist/cache/policy.d.ts +9 -0
  52. package/dist/cache/policy.d.ts.map +1 -0
  53. package/dist/cache/policy.js +64 -0
  54. package/dist/cache/policy.js.map +1 -0
  55. package/dist/cache/provider.d.ts +3 -0
  56. package/dist/cache/provider.d.ts.map +1 -0
  57. package/dist/cache/provider.js +164 -0
  58. package/dist/cache/provider.js.map +1 -0
  59. package/dist/cache/store.d.ts +44 -0
  60. package/dist/cache/store.d.ts.map +1 -0
  61. package/dist/cache/store.js +132 -0
  62. package/dist/cache/store.js.map +1 -0
  63. package/dist/cache/types.d.ts +100 -0
  64. package/dist/cache/types.d.ts.map +1 -0
  65. package/dist/cache/types.js +39 -0
  66. package/dist/cache/types.js.map +1 -0
  67. package/dist/cache/write.d.ts +5 -0
  68. package/dist/cache/write.d.ts.map +1 -0
  69. package/dist/cache/write.js +13 -0
  70. package/dist/cache/write.js.map +1 -0
  71. package/dist/events/admin-actions.d.ts +7 -0
  72. package/dist/events/admin-actions.d.ts.map +1 -0
  73. package/dist/events/admin-actions.js +28 -0
  74. package/dist/events/admin-actions.js.map +1 -0
  75. package/dist/events/admin-contracts.d.ts +132 -0
  76. package/dist/events/admin-contracts.d.ts.map +1 -0
  77. package/dist/events/admin-contracts.js +4 -0
  78. package/dist/events/admin-contracts.js.map +1 -0
  79. package/dist/events/admin-errors.d.ts +5 -0
  80. package/dist/events/admin-errors.d.ts.map +1 -0
  81. package/dist/events/admin-errors.js +9 -0
  82. package/dist/events/admin-errors.js.map +1 -0
  83. package/dist/events/admin-state.d.ts +8 -0
  84. package/dist/events/admin-state.d.ts.map +1 -0
  85. package/dist/events/admin-state.js +10 -0
  86. package/dist/events/admin-state.js.map +1 -0
  87. package/dist/events/admin-utils.d.ts +27 -0
  88. package/dist/events/admin-utils.d.ts.map +1 -0
  89. package/dist/events/admin-utils.js +153 -0
  90. package/dist/events/admin-utils.js.map +1 -0
  91. package/dist/events/admin.d.ts +22 -0
  92. package/dist/events/admin.d.ts.map +1 -0
  93. package/dist/events/admin.js +92 -0
  94. package/dist/events/admin.js.map +1 -0
  95. package/dist/events/delivery-types.d.ts +74 -0
  96. package/dist/events/delivery-types.d.ts.map +1 -0
  97. package/dist/events/delivery-types.js +9 -0
  98. package/dist/events/delivery-types.js.map +1 -0
  99. package/dist/events/delivery-utils.d.ts +17 -0
  100. package/dist/events/delivery-utils.d.ts.map +1 -0
  101. package/dist/events/delivery-utils.js +133 -0
  102. package/dist/events/delivery-utils.js.map +1 -0
  103. package/dist/events/delivery.d.ts +6 -0
  104. package/dist/events/delivery.d.ts.map +1 -0
  105. package/dist/events/delivery.js +159 -0
  106. package/dist/events/delivery.js.map +1 -0
  107. package/dist/events/ephemeral.d.ts +36 -0
  108. package/dist/events/ephemeral.d.ts.map +1 -0
  109. package/dist/events/ephemeral.js +61 -0
  110. package/dist/events/ephemeral.js.map +1 -0
  111. package/dist/events/log.d.ts +37 -0
  112. package/dist/events/log.d.ts.map +1 -0
  113. package/dist/events/log.js +121 -0
  114. package/dist/events/log.js.map +1 -0
  115. package/dist/events/provider.d.ts +9 -0
  116. package/dist/events/provider.d.ts.map +1 -0
  117. package/dist/events/provider.js +37 -0
  118. package/dist/events/provider.js.map +1 -0
  119. package/dist/events/router-inspection.d.ts +18 -0
  120. package/dist/events/router-inspection.d.ts.map +1 -0
  121. package/dist/events/router-inspection.js +110 -0
  122. package/dist/events/router-inspection.js.map +1 -0
  123. package/dist/events/router-records.d.ts +34 -0
  124. package/dist/events/router-records.d.ts.map +1 -0
  125. package/dist/events/router-records.js +98 -0
  126. package/dist/events/router-records.js.map +1 -0
  127. package/dist/events/router-types.d.ts +83 -0
  128. package/dist/events/router-types.d.ts.map +1 -0
  129. package/dist/events/router-types.js +2 -0
  130. package/dist/events/router-types.js.map +1 -0
  131. package/dist/events/router.d.ts +7 -0
  132. package/dist/events/router.d.ts.map +1 -0
  133. package/dist/events/router.js +148 -0
  134. package/dist/events/router.js.map +1 -0
  135. package/dist/factory.d.ts +26 -0
  136. package/dist/factory.d.ts.map +1 -0
  137. package/dist/factory.js +66 -0
  138. package/dist/factory.js.map +1 -0
  139. package/dist/index.d.ts +18 -0
  140. package/dist/index.d.ts.map +1 -0
  141. package/dist/index.js +15 -0
  142. package/dist/index.js.map +1 -0
  143. package/dist/jobs/admin-contracts.d.ts +66 -0
  144. package/dist/jobs/admin-contracts.d.ts.map +1 -0
  145. package/dist/jobs/admin-contracts.js +4 -0
  146. package/dist/jobs/admin-contracts.js.map +1 -0
  147. package/dist/jobs/admin-errors.d.ts +5 -0
  148. package/dist/jobs/admin-errors.d.ts.map +1 -0
  149. package/dist/jobs/admin-errors.js +9 -0
  150. package/dist/jobs/admin-errors.js.map +1 -0
  151. package/dist/jobs/admin-utils.d.ts +29 -0
  152. package/dist/jobs/admin-utils.d.ts.map +1 -0
  153. package/dist/jobs/admin-utils.js +138 -0
  154. package/dist/jobs/admin-utils.js.map +1 -0
  155. package/dist/jobs/admin.d.ts +25 -0
  156. package/dist/jobs/admin.d.ts.map +1 -0
  157. package/dist/jobs/admin.js +89 -0
  158. package/dist/jobs/admin.js.map +1 -0
  159. package/dist/jobs/cron.d.ts +10 -0
  160. package/dist/jobs/cron.d.ts.map +1 -0
  161. package/dist/jobs/cron.js +18 -0
  162. package/dist/jobs/cron.js.map +1 -0
  163. package/dist/jobs/idempotency.d.ts +18 -0
  164. package/dist/jobs/idempotency.d.ts.map +1 -0
  165. package/dist/jobs/idempotency.js +82 -0
  166. package/dist/jobs/idempotency.js.map +1 -0
  167. package/dist/jobs/lease-utils.d.ts +9 -0
  168. package/dist/jobs/lease-utils.d.ts.map +1 -0
  169. package/dist/jobs/lease-utils.js +31 -0
  170. package/dist/jobs/lease-utils.js.map +1 -0
  171. package/dist/jobs/queue-admin.d.ts +12 -0
  172. package/dist/jobs/queue-admin.d.ts.map +1 -0
  173. package/dist/jobs/queue-admin.js +42 -0
  174. package/dist/jobs/queue-admin.js.map +1 -0
  175. package/dist/jobs/queue-entry.d.ts +8 -0
  176. package/dist/jobs/queue-entry.d.ts.map +1 -0
  177. package/dist/jobs/queue-entry.js +130 -0
  178. package/dist/jobs/queue-entry.js.map +1 -0
  179. package/dist/jobs/queue-lease.d.ts +4 -0
  180. package/dist/jobs/queue-lease.d.ts.map +1 -0
  181. package/dist/jobs/queue-lease.js +12 -0
  182. package/dist/jobs/queue-lease.js.map +1 -0
  183. package/dist/jobs/queue-operations.d.ts +16 -0
  184. package/dist/jobs/queue-operations.d.ts.map +1 -0
  185. package/dist/jobs/queue-operations.js +107 -0
  186. package/dist/jobs/queue-operations.js.map +1 -0
  187. package/dist/jobs/queue-recovery.d.ts +5 -0
  188. package/dist/jobs/queue-recovery.d.ts.map +1 -0
  189. package/dist/jobs/queue-recovery.js +22 -0
  190. package/dist/jobs/queue-recovery.js.map +1 -0
  191. package/dist/jobs/queue-utils.d.ts +101 -0
  192. package/dist/jobs/queue-utils.d.ts.map +1 -0
  193. package/dist/jobs/queue-utils.js +28 -0
  194. package/dist/jobs/queue-utils.js.map +1 -0
  195. package/dist/jobs/queue.d.ts +7 -0
  196. package/dist/jobs/queue.d.ts.map +1 -0
  197. package/dist/jobs/queue.js +70 -0
  198. package/dist/jobs/queue.js.map +1 -0
  199. package/dist/jobs/retry.d.ts +25 -0
  200. package/dist/jobs/retry.d.ts.map +1 -0
  201. package/dist/jobs/retry.js +84 -0
  202. package/dist/jobs/retry.js.map +1 -0
  203. package/dist/jobs/scheduler.d.ts +52 -0
  204. package/dist/jobs/scheduler.d.ts.map +1 -0
  205. package/dist/jobs/scheduler.js +122 -0
  206. package/dist/jobs/scheduler.js.map +1 -0
  207. package/dist/jobs/store-files.d.ts +20 -0
  208. package/dist/jobs/store-files.d.ts.map +1 -0
  209. package/dist/jobs/store-files.js +177 -0
  210. package/dist/jobs/store-files.js.map +1 -0
  211. package/dist/jobs/store.d.ts +60 -0
  212. package/dist/jobs/store.d.ts.map +1 -0
  213. package/dist/jobs/store.js +97 -0
  214. package/dist/jobs/store.js.map +1 -0
  215. package/dist/runtime-capabilities.d.ts +17 -0
  216. package/dist/runtime-capabilities.d.ts.map +1 -0
  217. package/dist/runtime-capabilities.js +32 -0
  218. package/dist/runtime-capabilities.js.map +1 -0
  219. package/dist/state.d.ts +15 -0
  220. package/dist/state.d.ts.map +1 -0
  221. package/dist/state.js +69 -0
  222. package/dist/state.js.map +1 -0
  223. package/package.json +47 -0
@@ -0,0 +1,121 @@
1
+ import { canonicalJson, deepFreeze, normalizeId } from "@relkit/contracts";
2
+ import { createJobStore, } from "../jobs/store.js";
3
+ import { createJobStorePaths } from "../jobs/store-files.js";
4
+ export const EVENT_LOG_VERSION = 1;
5
+ export class EventLogStateError extends Error {
6
+ code = "RELKIT_EVENT_LOG_STATE_INVALID";
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "EventLogStateError";
10
+ }
11
+ }
12
+ export function createEventLogPaths(root) {
13
+ return createJobStorePaths(root);
14
+ }
15
+ /** Opens the durable accepted-event log and repairs invalid records on startup. */
16
+ export async function createEventLog(requestedRoot, options = {}) {
17
+ const store = await createJobStore(requestedRoot, {
18
+ ...options,
19
+ validateData: validateEnvelopeData,
20
+ });
21
+ const paths = createEventLogPaths(store.root);
22
+ const append = async (input) => {
23
+ const envelope = normalizeEnvelope(input);
24
+ const record = await store.append({
25
+ instanceId: envelope.instanceId,
26
+ kind: "accepted",
27
+ data: toJson(envelope),
28
+ });
29
+ return toEventRecord(record);
30
+ };
31
+ const snapshot = () => {
32
+ const current = store.snapshot();
33
+ return Object.freeze({
34
+ records: Object.freeze(current.records.map(toEventRecord)),
35
+ index: current.index,
36
+ checkpoint: current.checkpoint,
37
+ });
38
+ };
39
+ return Object.freeze({ root: store.root, paths, append, snapshot, close: store.close });
40
+ }
41
+ function toEventRecord(record) {
42
+ if (record.version !== EVENT_LOG_VERSION || record.kind !== "accepted") {
43
+ throw new EventLogStateError("Event log record is not an accepted event");
44
+ }
45
+ return Object.freeze({
46
+ version: EVENT_LOG_VERSION,
47
+ sequence: record.sequence,
48
+ kind: "accepted",
49
+ accepted: true,
50
+ timestamp: record.timestamp,
51
+ envelope: normalizeEnvelope(record.data),
52
+ });
53
+ }
54
+ function validateEnvelopeData(value) {
55
+ normalizeEnvelope(value);
56
+ }
57
+ function normalizeEnvelope(value) {
58
+ if (!isRecord(value))
59
+ throw new EventLogStateError("Event envelope must be an object");
60
+ if (value.accepted !== undefined && value.accepted !== true) {
61
+ throw new EventLogStateError("Event envelope acceptance is invalid");
62
+ }
63
+ const attributes = normalizeAttributes(value.attributes);
64
+ const payload = JSON.parse(canonicalJson(value.payload));
65
+ const key = optionalText(value.key, "key");
66
+ const correlationId = optionalText(value.correlationId, "correlationId");
67
+ const causationInvocationId = optionalText(value.causationInvocationId, "causationInvocationId");
68
+ const result = {
69
+ instanceId: normalizeId(text(value.instanceId, "instanceId")),
70
+ eventId: normalizeId(text(value.eventId, "eventId")),
71
+ version: positiveInteger(value.version, "version"),
72
+ payload,
73
+ occurredAt: text(value.occurredAt, "occurredAt"),
74
+ publishedAt: text(value.publishedAt, "publishedAt"),
75
+ ...(key === undefined ? {} : { key }),
76
+ ...(correlationId === undefined ? {} : { correlationId }),
77
+ ...(causationInvocationId === undefined ? {} : { causationInvocationId }),
78
+ traceId: text(value.traceId, "traceId"),
79
+ attributes,
80
+ };
81
+ return deepFreeze(result);
82
+ }
83
+ function normalizeAttributes(value) {
84
+ if (!isRecord(value))
85
+ throw new EventLogStateError("Event attributes must be an object");
86
+ const result = {};
87
+ for (const key of Object.keys(value).sort()) {
88
+ const item = value[key];
89
+ if (typeof item !== "string" &&
90
+ typeof item !== "boolean" &&
91
+ (typeof item !== "number" || !Number.isFinite(item))) {
92
+ throw new EventLogStateError(`Event attribute "${key}" is invalid`);
93
+ }
94
+ result[key] = item;
95
+ }
96
+ return Object.freeze(result);
97
+ }
98
+ function text(value, name) {
99
+ if (typeof value !== "string" || value.trim() === "") {
100
+ throw new EventLogStateError(`Event ${name} is required`);
101
+ }
102
+ return value;
103
+ }
104
+ function optionalText(value, name) {
105
+ if (value === undefined)
106
+ return undefined;
107
+ return text(value, name);
108
+ }
109
+ function positiveInteger(value, name) {
110
+ if (!Number.isSafeInteger(value) || value < 1) {
111
+ throw new EventLogStateError(`Event ${name} is invalid`);
112
+ }
113
+ return value;
114
+ }
115
+ function toJson(value) {
116
+ return JSON.parse(canonicalJson(value));
117
+ }
118
+ function isRecord(value) {
119
+ return value !== null && typeof value === "object" && !Array.isArray(value);
120
+ }
121
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/events/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { EventProvider } from "@relkit/events";
2
+ import type { EventRouter } from "./router-types.js";
3
+ export interface LocalEventProvider extends EventProvider {
4
+ readonly registerContract: EventRouter["registerContract"];
5
+ readonly registerTrigger: EventRouter["registerTrigger"];
6
+ readonly close: () => Promise<void>;
7
+ }
8
+ export declare function createLocalEventProvider(root: string): Promise<LocalEventProvider>;
9
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/events/provider.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EAGd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,mBAAmB,CAAC;AAIzE,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC3D,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoCxF"}
@@ -0,0 +1,37 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { join } from "node:path";
3
+ import { createEventLog } from "./log.js";
4
+ import { createEventRouter } from "./router.js";
5
+ export async function createLocalEventProvider(root) {
6
+ const log = await createEventLog(join(root, "log"));
7
+ const router = await createEventRouter(join(root, "router"));
8
+ return Object.freeze({
9
+ registerContract: router.registerContract,
10
+ registerTrigger: (binding) => router.registerTrigger(binding),
11
+ publish: async (payload, options, context) => {
12
+ const timestamp = new Date().toISOString();
13
+ const record = await log.append({
14
+ instanceId: `event-${randomUUID()}`,
15
+ eventId: context.eventId,
16
+ version: context.version,
17
+ payload,
18
+ occurredAt: timestamp,
19
+ publishedAt: timestamp,
20
+ ...(options.key === undefined ? {} : { key: options.key }),
21
+ ...(context.correlationId === undefined ? {} : { correlationId: context.correlationId }),
22
+ ...(context.causationInvocationId === undefined
23
+ ? {}
24
+ : { causationInvocationId: context.causationInvocationId }),
25
+ traceId: context.traceId,
26
+ attributes: options.attributes ?? {},
27
+ });
28
+ await router.route(record);
29
+ return { accepted: true, ...record.envelope };
30
+ },
31
+ close: async () => {
32
+ await router.close();
33
+ await log.close();
34
+ },
35
+ });
36
+ }
37
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/events/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAQhD,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY;IACzD,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE7D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,eAAe,EAAE,CAAC,OAA2B,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC;QACjF,OAAO,EAAE,KAAK,EACZ,OAAgB,EAChB,OAA4B,EAC5B,OAA8B,EACA,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;gBAC9B,UAAU,EAAE,SAAS,UAAU,EAAE,EAAE;gBACnC,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,OAAO;gBACP,UAAU,EAAE,SAAS;gBACrB,WAAW,EAAE,SAAS;gBACtB,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;gBAC1D,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;gBACxF,GAAG,CAAC,OAAO,CAAC,qBAAqB,KAAK,SAAS;oBAC7C,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;aACrC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAChD,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { EventContractInput } from "./admin-contracts.js";
2
+ import type { EventLogRecord } from "./log.js";
3
+ import type { EventDelivery } from "./delivery.js";
4
+ import type { UnknownEventEnvelope } from "@relkit/events";
5
+ import type { EventDeliveryResult, EventRouterInput, EventRouterSnapshot, EventRouterTrigger, EventTriggerSnapshot } from "./router-types.js";
6
+ export interface RegisteredTriggerView {
7
+ readonly binding: EventRouterTrigger;
8
+ readonly durable?: EventDelivery;
9
+ readonly ephemeral?: unknown;
10
+ }
11
+ export declare function normalizeContract(value: unknown): EventContractInput;
12
+ export declare function publication(input: EventRouterInput, envelope: UnknownEventEnvelope, fallbackSequence: number, now: () => number): EventLogRecord;
13
+ export declare function triggerSnapshot(binding: EventRouterTrigger): EventTriggerSnapshot;
14
+ export declare function createSnapshot(triggers: ReadonlyMap<string, RegisteredTriggerView>, contracts: ReadonlyMap<string, EventContractInput>, publications: readonly EventLogRecord[]): EventRouterSnapshot;
15
+ export declare function retryDelivery(triggers: ReadonlyMap<string, RegisteredTriggerView>, deliveryId: string): Promise<EventDeliveryResult>;
16
+ export declare function runNextDelivery(triggers: ReadonlyMap<string, RegisteredTriggerView>, triggerId?: string): Promise<EventDeliveryResult | undefined>;
17
+ export declare function drainDeliveries(triggers: ReadonlyMap<string, RegisteredTriggerView>): Promise<readonly EventDeliveryResult[]>;
18
+ //# sourceMappingURL=router-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-inspection.d.ts","sourceRoot":"","sources":["../../src/events/router-inspection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAA6B,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAuBpE;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,gBAAgB,EACvB,QAAQ,EAAE,oBAAoB,EAC9B,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,MAAM,GAChB,cAAc,CAUhB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,oBAAoB,CAajF;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACpD,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAClD,YAAY,EAAE,SAAS,cAAc,EAAE,GACtC,mBAAmB,CAmCrB;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACpD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,CAAC,CAM9B;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,EACpD,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAe1C;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,GACnD,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAOzC"}
@@ -0,0 +1,110 @@
1
+ import { deepFreeze, isJsonValue, normalizeId } from "@relkit/contracts";
2
+ import { EventRouterStateError } from "./router-records.js";
3
+ export function normalizeContract(value) {
4
+ if (!isRecord(value) || value.kind !== "event")
5
+ throw new EventRouterStateError("Event contract is invalid");
6
+ const id = normalizeId(value.id);
7
+ if (!Number.isSafeInteger(value.version) || value.version < 1)
8
+ throw new EventRouterStateError(`Event contract ${id} has an invalid version`);
9
+ if (!isJsonValue(value.payload))
10
+ throw new EventRouterStateError(`Event contract ${id} is not JSON-safe`);
11
+ if (value.source !== undefined && !isJsonValue(value.source))
12
+ throw new EventRouterStateError(`Event contract ${id} has an invalid source`);
13
+ const sensitiveFields = value.sensitiveFields ?? undefined;
14
+ if (sensitiveFields !== undefined &&
15
+ (!Array.isArray(sensitiveFields) || sensitiveFields.some((field) => typeof field !== "string")))
16
+ throw new EventRouterStateError(`Event contract ${id} has invalid sensitive fields`);
17
+ return deepFreeze({
18
+ id,
19
+ version: value.version,
20
+ payload: value.payload,
21
+ ...(sensitiveFields === undefined ? {} : { sensitiveFields }),
22
+ ...(value.source === undefined ? {} : { source: value.source }),
23
+ });
24
+ }
25
+ export function publication(input, envelope, fallbackSequence, now) {
26
+ if (isEventLogRecord(input))
27
+ return input;
28
+ return deepFreeze({
29
+ version: 1,
30
+ sequence: fallbackSequence,
31
+ kind: "accepted",
32
+ accepted: true,
33
+ timestamp: now(),
34
+ envelope,
35
+ });
36
+ }
37
+ export function triggerSnapshot(binding) {
38
+ return deepFreeze({
39
+ id: binding.id,
40
+ ...(binding.targetFunctionId === undefined
41
+ ? {}
42
+ : { targetFunctionId: binding.targetFunctionId }),
43
+ ...(binding.selector === undefined ? {} : { selector: binding.selector }),
44
+ expansion: binding.expansion,
45
+ delivery: binding.delivery,
46
+ ...(binding.profile === undefined ? {} : { profile: binding.profile }),
47
+ ...(binding.retry === undefined ? {} : { retry: binding.retry }),
48
+ ...(binding.concurrency === undefined ? {} : { concurrency: binding.concurrency }),
49
+ });
50
+ }
51
+ export function createSnapshot(triggers, contracts, publications) {
52
+ const durable = [...triggers.values()].filter((trigger) => trigger.durable !== undefined);
53
+ const records = durable.flatMap(({ durable: delivery }) => delivery.snapshot().records);
54
+ records.sort((left, right) => left.timestamp - right.timestamp ||
55
+ left.sequence - right.sequence ||
56
+ left.triggerId.localeCompare(right.triggerId));
57
+ const latest = new Map();
58
+ for (const { durable: delivery } of durable)
59
+ for (const entry of delivery.snapshot().ledger) {
60
+ const previous = latest.get(entry.deliveryId);
61
+ if (previous === undefined || entry.cursor >= previous.cursor)
62
+ latest.set(entry.deliveryId, entry);
63
+ }
64
+ return Object.freeze({
65
+ records: Object.freeze(records),
66
+ contracts: Object.freeze([...contracts.values()]),
67
+ triggers: Object.freeze([...triggers.values()]
68
+ .map(({ binding }) => triggerSnapshot(binding))
69
+ .sort((left, right) => left.id.localeCompare(right.id))),
70
+ publications: Object.freeze([...publications]),
71
+ deliveries: Object.freeze([...latest.values()].sort((left, right) => left.cursor - right.cursor || left.deliveryId.localeCompare(right.deliveryId))),
72
+ });
73
+ }
74
+ export async function retryDelivery(triggers, deliveryId) {
75
+ for (const { binding, durable } of triggers.values()) {
76
+ if (durable?.snapshot().ledger.some((entry) => entry.deliveryId === deliveryId))
77
+ return Object.freeze({ delivery: binding.delivery, ...(await durable.retry(deliveryId)) });
78
+ }
79
+ throw new EventRouterStateError(`Unknown event delivery ${deliveryId}`);
80
+ }
81
+ export async function runNextDelivery(triggers, triggerId) {
82
+ const normalized = triggerId === undefined ? undefined : normalizeId(triggerId);
83
+ const candidates = [...triggers.values()]
84
+ .filter(({ binding, durable }) => durable !== undefined && (normalized === undefined || binding.id === normalized))
85
+ .sort((left, right) => left.binding.id.localeCompare(right.binding.id));
86
+ if (normalized !== undefined && candidates.length === 0)
87
+ throw new EventRouterStateError(`Unknown event trigger ${normalized}`);
88
+ for (const { binding, durable } of candidates) {
89
+ const result = await durable.runNext();
90
+ if (result !== undefined)
91
+ return Object.freeze({ delivery: binding.delivery, ...result });
92
+ }
93
+ return undefined;
94
+ }
95
+ export async function drainDeliveries(triggers) {
96
+ const results = [];
97
+ while (true) {
98
+ const result = await runNextDelivery(triggers);
99
+ if (result === undefined)
100
+ return Object.freeze(results);
101
+ results.push(result);
102
+ }
103
+ }
104
+ function isEventLogRecord(value) {
105
+ return "kind" in value && value.kind === "accepted" && "sequence" in value;
106
+ }
107
+ function isRecord(value) {
108
+ return value !== null && typeof value === "object" && !Array.isArray(value);
109
+ }
110
+ //# sourceMappingURL=router-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-inspection.js","sourceRoot":"","sources":["../../src/events/router-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type JsonValue } from "@relkit/contracts";
2
+ import type { UnknownEventEnvelope } from "@relkit/events";
3
+ import type { JobRecord, JobStore } from "../jobs/store.js";
4
+ export declare const EVENT_DELIVERY_VERSION: 1;
5
+ export interface EventDeliveryRecord {
6
+ readonly version: typeof EVENT_DELIVERY_VERSION;
7
+ readonly sequence: number;
8
+ readonly timestamp: number;
9
+ readonly deliveryId: string;
10
+ readonly eventInstanceId: string;
11
+ readonly triggerId: string;
12
+ readonly envelope: UnknownEventEnvelope;
13
+ }
14
+ interface DeliveryData {
15
+ readonly version: typeof EVENT_DELIVERY_VERSION;
16
+ readonly deliveryId: string;
17
+ readonly eventInstanceId: string;
18
+ readonly triggerId: string;
19
+ readonly envelope: UnknownEventEnvelope;
20
+ }
21
+ export declare class EventRouterStateError extends Error {
22
+ readonly code: "RELKIT_EVENT_ROUTER_STATE_INVALID";
23
+ constructor(message: string);
24
+ }
25
+ export declare function normalizeExpansion(value: readonly string[]): readonly string[];
26
+ export declare function normalizeDelivery(value: unknown): "ephemeral" | "durable";
27
+ export declare function normalizeEnvelope(input: unknown): UnknownEventEnvelope;
28
+ export declare function toDeliveryRecord(record: JobRecord): EventDeliveryRecord;
29
+ export declare function validateDeliveryData(value: JsonValue): void;
30
+ export declare function makeDeliveryId(eventInstanceId: string, triggerId: string): string;
31
+ export declare function appendDeliveryAcceptance(store: JobStore, envelope: UnknownEventEnvelope, triggerId: string): Promise<void>;
32
+ export declare function toJson(value: DeliveryData): JsonValue;
33
+ export {};
34
+ //# sourceMappingURL=router-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-records.d.ts","sourceRoot":"","sources":["../../src/events/router-records.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5D,eAAO,MAAM,sBAAsB,EAAG,CAAU,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,OAAO,sBAAsB,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,UAAU,YAAY;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,sBAAsB,CAAC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAG,mCAAmC,CAAU;gBAEjD,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,EAAE,CAG9E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAKzE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAatE;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAGvE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAE3D;AAED,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIjF;AAED,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,oBAAoB,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAErD"}
@@ -0,0 +1,98 @@
1
+ import { canonicalJson, deepFreeze, normalizeId } from "@relkit/contracts";
2
+ export const EVENT_DELIVERY_VERSION = 1;
3
+ export class EventRouterStateError extends Error {
4
+ code = "RELKIT_EVENT_ROUTER_STATE_INVALID";
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "EventRouterStateError";
8
+ }
9
+ }
10
+ export function normalizeExpansion(value) {
11
+ if (!Array.isArray(value))
12
+ throw new EventRouterStateError("Event expansion must be an array");
13
+ return Object.freeze([...new Set(value.map(normalizePair))].sort());
14
+ }
15
+ export function normalizeDelivery(value) {
16
+ if (value !== "ephemeral" && value !== "durable") {
17
+ throw new EventRouterStateError("Event delivery mode is invalid");
18
+ }
19
+ return value;
20
+ }
21
+ export function normalizeEnvelope(input) {
22
+ if (!isRecord(input))
23
+ throw new EventRouterStateError("Accepted event envelope is invalid");
24
+ let source = input;
25
+ if ("envelope" in input) {
26
+ if (input.accepted !== true)
27
+ throw new EventRouterStateError("Event was not accepted");
28
+ source = input.envelope;
29
+ }
30
+ else if (input.accepted !== undefined) {
31
+ if (input.accepted !== true)
32
+ throw new EventRouterStateError("Event was not accepted");
33
+ const { accepted: _accepted, ...envelope } = input;
34
+ source = envelope;
35
+ }
36
+ if (!isRecord(source))
37
+ throw new EventRouterStateError("Accepted event envelope is invalid");
38
+ return deepFreeze(JSON.parse(canonicalJson(source)));
39
+ }
40
+ export function toDeliveryRecord(record) {
41
+ const data = readDeliveryData(record.data);
42
+ return Object.freeze({ ...data, sequence: record.sequence, timestamp: record.timestamp });
43
+ }
44
+ export function validateDeliveryData(value) {
45
+ readDeliveryData(value);
46
+ }
47
+ export function makeDeliveryId(eventInstanceId, triggerId) {
48
+ return normalizeId(`delivery.${eventInstanceId.length}.${eventInstanceId}.${triggerId.length}.${triggerId}`);
49
+ }
50
+ export async function appendDeliveryAcceptance(store, envelope, triggerId) {
51
+ const deliveryId = makeDeliveryId(envelope.instanceId, triggerId);
52
+ await store.append({
53
+ instanceId: deliveryId,
54
+ kind: "event-delivery-accepted",
55
+ data: toJson({
56
+ version: EVENT_DELIVERY_VERSION,
57
+ deliveryId,
58
+ eventInstanceId: envelope.instanceId,
59
+ triggerId,
60
+ envelope,
61
+ }),
62
+ });
63
+ }
64
+ export function toJson(value) {
65
+ return JSON.parse(canonicalJson(value));
66
+ }
67
+ function readDeliveryData(value) {
68
+ if (!isRecord(value) || value.version !== EVENT_DELIVERY_VERSION) {
69
+ throw new EventRouterStateError("Event delivery record is invalid");
70
+ }
71
+ return {
72
+ version: EVENT_DELIVERY_VERSION,
73
+ deliveryId: requiredId(value.deliveryId),
74
+ eventInstanceId: requiredId(value.eventInstanceId),
75
+ triggerId: requiredId(value.triggerId),
76
+ envelope: normalizeEnvelope(value.envelope),
77
+ };
78
+ }
79
+ function normalizePair(value) {
80
+ if (typeof value !== "string")
81
+ throw new EventRouterStateError("Event expansion is invalid");
82
+ const at = value.lastIndexOf("@");
83
+ const versionText = value.slice(at + 1);
84
+ const version = Number(versionText);
85
+ if (at < 1 || !/^[1-9]\d*$/.test(versionText) || !Number.isSafeInteger(version)) {
86
+ throw new EventRouterStateError(`Event expansion "${value}" is invalid`);
87
+ }
88
+ return `${normalizeId(value.slice(0, at))}@${version}`;
89
+ }
90
+ function requiredId(value) {
91
+ if (typeof value !== "string")
92
+ throw new EventRouterStateError("Event delivery ID is invalid");
93
+ return normalizeId(value);
94
+ }
95
+ function isRecord(value) {
96
+ return value !== null && typeof value === "object" && !Array.isArray(value);
97
+ }
98
+ //# sourceMappingURL=router-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-records.js","sourceRoot":"","sources":["../../src/events/router-records.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import type { JsonValue } from "@relkit/contracts";
2
+ import type { RetryPolicy } from "@relkit/jobs";
3
+ import type { UnknownEventEnvelope } from "@relkit/events";
4
+ import type { EventContractInput } from "./admin-contracts.js";
5
+ import type { EventLogInput, EventLogRecord } from "./log.js";
6
+ import type { EventDeliveryBoundary, EventDeliveryLedgerRecord } from "./delivery-types.js";
7
+ import type { EventDeliveryRecord } from "./router-records.js";
8
+ export interface EventDeliveryResult {
9
+ readonly triggerId: string;
10
+ readonly delivery: "ephemeral" | "durable";
11
+ readonly deliveryId?: string;
12
+ readonly eventInstanceId?: string;
13
+ readonly accepted: boolean;
14
+ readonly persisted: boolean;
15
+ readonly status: "queued" | "completed" | "failed" | "dropped";
16
+ readonly state?: "available" | "leased" | "delayed" | "completed" | "dead-lettered";
17
+ readonly attempt?: number;
18
+ readonly duplicate?: boolean;
19
+ readonly capacity?: number;
20
+ readonly dropPolicy?: "drop-newest";
21
+ readonly restartRecovery?: false;
22
+ readonly dropReason?: "capacity";
23
+ readonly value?: unknown;
24
+ readonly error?: unknown;
25
+ readonly failure?: unknown;
26
+ }
27
+ export interface EventRouterTrigger {
28
+ readonly id: string;
29
+ readonly targetFunctionId?: string;
30
+ readonly selector?: JsonValue;
31
+ readonly expansion: readonly string[];
32
+ readonly delivery: "ephemeral" | "durable";
33
+ readonly profile?: string;
34
+ readonly retry?: RetryPolicy;
35
+ readonly concurrency?: number;
36
+ readonly invoke: (envelope: UnknownEventEnvelope) => Promise<unknown>;
37
+ }
38
+ export interface EventRouterOptions {
39
+ readonly onBoundary?: (boundary: EventDeliveryBoundary, triggerId: string) => void | Promise<void>;
40
+ readonly now?: () => number;
41
+ readonly random?: () => number;
42
+ readonly ownerToken?: string;
43
+ readonly leaseDurationMs?: number;
44
+ readonly ephemeralCapacity?: number;
45
+ }
46
+ export interface EventRouterRouteOptions {
47
+ readonly run?: boolean;
48
+ }
49
+ export interface EventRouterSnapshot {
50
+ readonly records: readonly EventDeliveryRecord[];
51
+ readonly contracts: readonly EventContractInput[];
52
+ readonly triggers: readonly EventTriggerSnapshot[];
53
+ readonly publications: readonly EventLogRecord[];
54
+ readonly deliveries: readonly EventDeliveryLedgerRecord[];
55
+ }
56
+ export interface EventTriggerSnapshot {
57
+ readonly id: string;
58
+ readonly targetFunctionId?: string;
59
+ readonly selector?: JsonValue;
60
+ readonly expansion: readonly string[];
61
+ readonly delivery: "ephemeral" | "durable";
62
+ readonly profile?: string;
63
+ readonly retry?: RetryPolicy;
64
+ readonly concurrency?: number;
65
+ }
66
+ export interface EventFanoutResult {
67
+ readonly event: UnknownEventEnvelope;
68
+ readonly matchedTriggerIds: readonly string[];
69
+ readonly deliveries: readonly EventDeliveryResult[];
70
+ }
71
+ export interface EventRouter {
72
+ readonly root: string;
73
+ readonly registerContract: (contract: unknown) => Promise<void>;
74
+ readonly registerTrigger: (binding: EventRouterTrigger) => Promise<void>;
75
+ readonly route: (event: EventRouterInput, options?: EventRouterRouteOptions) => Promise<EventFanoutResult>;
76
+ readonly runNext: (triggerId?: string) => Promise<EventDeliveryResult | undefined>;
77
+ readonly drain: () => Promise<readonly EventDeliveryResult[]>;
78
+ readonly retry: (deliveryId: string) => Promise<EventDeliveryResult>;
79
+ readonly snapshot: () => EventRouterSnapshot;
80
+ readonly close: () => Promise<void>;
81
+ }
82
+ export type EventRouterInput = EventLogRecord | EventLogInput;
83
+ //# sourceMappingURL=router-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-types.d.ts","sourceRoot":"","sources":["../../src/events/router-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=router-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-types.js","sourceRoot":"","sources":["../../src/events/router-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { EventRouter, EventRouterOptions } from "./router-types.js";
2
+ export type { EventDeliveryResult, EventFanoutResult, EventRouter, EventRouterInput, EventRouterOptions, EventRouterRouteOptions, EventRouterSnapshot, EventRouterTrigger, EventTriggerSnapshot, } from "./router-types.js";
3
+ export { EVENT_DELIVERY_VERSION, EventRouterStateError } from "./router-records.js";
4
+ export type { EventDeliveryRecord } from "./router-records.js";
5
+ /** Routes accepted envelopes using only the compiler's explicit expansions. */
6
+ export declare function createEventRouter(requestedRoot: string, options?: EventRouterOptions): Promise<EventRouter>;
7
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/events/router.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAGV,WAAW,EAEX,kBAAkB,EAKnB,MAAM,mBAAmB,CAAC;AAiB3B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,WAAW,EACX,gBAAgB,EAChB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACpF,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,+EAA+E;AAC/E,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC,CA4GtB"}