@memberjunction/work-queue-core 0.0.1-seed.1 → 6.2.0-edge.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +183 -0
  2. package/README.md +129 -3
  3. package/dist/api/WorkQueueApiPublisher.d.ts +35 -0
  4. package/dist/api/WorkQueueApiPublisher.d.ts.map +1 -0
  5. package/dist/api/WorkQueueApiPublisher.js +136 -0
  6. package/dist/api/WorkQueueApiPublisher.js.map +1 -0
  7. package/dist/api/restContract.d.ts +50 -0
  8. package/dist/api/restContract.d.ts.map +1 -0
  9. package/dist/api/restContract.js +247 -0
  10. package/dist/api/restContract.js.map +1 -0
  11. package/dist/backoff.d.ts +15 -0
  12. package/dist/backoff.d.ts.map +1 -0
  13. package/dist/backoff.js +29 -0
  14. package/dist/backoff.js.map +1 -0
  15. package/dist/compatibility.d.ts +10 -0
  16. package/dist/compatibility.d.ts.map +1 -0
  17. package/dist/compatibility.js +41 -0
  18. package/dist/compatibility.js.map +1 -0
  19. package/dist/envelope.d.ts +33 -0
  20. package/dist/envelope.d.ts.map +1 -0
  21. package/dist/envelope.js +2 -0
  22. package/dist/envelope.js.map +1 -0
  23. package/dist/errors.d.ts +14 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +23 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/filter.d.ts +12 -0
  28. package/dist/filter.d.ts.map +1 -0
  29. package/dist/filter.js +187 -0
  30. package/dist/filter.js.map +1 -0
  31. package/dist/filterTypes.d.ts +25 -0
  32. package/dist/filterTypes.d.ts.map +1 -0
  33. package/dist/filterTypes.js +2 -0
  34. package/dist/filterTypes.js.map +1 -0
  35. package/dist/handler.d.ts +56 -0
  36. package/dist/handler.d.ts.map +1 -0
  37. package/dist/handler.js +25 -0
  38. package/dist/handler.js.map +1 -0
  39. package/dist/index.d.ts +24 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +27 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/manifest.d.ts +46 -0
  44. package/dist/manifest.d.ts.map +1 -0
  45. package/dist/manifest.js +2 -0
  46. package/dist/manifest.js.map +1 -0
  47. package/dist/memory/InMemoryConsumer.d.ts +18 -0
  48. package/dist/memory/InMemoryConsumer.d.ts.map +1 -0
  49. package/dist/memory/InMemoryConsumer.js +36 -0
  50. package/dist/memory/InMemoryConsumer.js.map +1 -0
  51. package/dist/memory/InMemoryOperator.d.ts +13 -0
  52. package/dist/memory/InMemoryOperator.d.ts.map +1 -0
  53. package/dist/memory/InMemoryOperator.js +25 -0
  54. package/dist/memory/InMemoryOperator.js.map +1 -0
  55. package/dist/memory/InMemoryStore.d.ts +82 -0
  56. package/dist/memory/InMemoryStore.d.ts.map +1 -0
  57. package/dist/memory/InMemoryStore.js +436 -0
  58. package/dist/memory/InMemoryStore.js.map +1 -0
  59. package/dist/memory/InMemoryTransport.d.ts +29 -0
  60. package/dist/memory/InMemoryTransport.d.ts.map +1 -0
  61. package/dist/memory/InMemoryTransport.js +48 -0
  62. package/dist/memory/InMemoryTransport.js.map +1 -0
  63. package/dist/operator.d.ts +60 -0
  64. package/dist/operator.d.ts.map +1 -0
  65. package/dist/operator.js +2 -0
  66. package/dist/operator.js.map +1 -0
  67. package/dist/policy.d.ts +24 -0
  68. package/dist/policy.d.ts.map +1 -0
  69. package/dist/policy.js +10 -0
  70. package/dist/policy.js.map +1 -0
  71. package/dist/publishing.d.ts +58 -0
  72. package/dist/publishing.d.ts.map +1 -0
  73. package/dist/publishing.js +40 -0
  74. package/dist/publishing.js.map +1 -0
  75. package/dist/runtime/ConsumerRuntime.d.ts +46 -0
  76. package/dist/runtime/ConsumerRuntime.d.ts.map +1 -0
  77. package/dist/runtime/ConsumerRuntime.js +252 -0
  78. package/dist/runtime/ConsumerRuntime.js.map +1 -0
  79. package/dist/runtime/DeliveryExecution.d.ts +83 -0
  80. package/dist/runtime/DeliveryExecution.d.ts.map +1 -0
  81. package/dist/runtime/DeliveryExecution.js +0 -0
  82. package/dist/runtime/DeliveryExecution.js.map +1 -0
  83. package/dist/runtime/outcomes.d.ts +28 -0
  84. package/dist/runtime/outcomes.d.ts.map +1 -0
  85. package/dist/runtime/outcomes.js +65 -0
  86. package/dist/runtime/outcomes.js.map +1 -0
  87. package/dist/runtime/types.d.ts +14 -0
  88. package/dist/runtime/types.d.ts.map +1 -0
  89. package/dist/runtime/types.js +2 -0
  90. package/dist/runtime/types.js.map +1 -0
  91. package/dist/testing/ConformanceHarness.d.ts +45 -0
  92. package/dist/testing/ConformanceHarness.d.ts.map +1 -0
  93. package/dist/testing/ConformanceHarness.js +2 -0
  94. package/dist/testing/ConformanceHarness.js.map +1 -0
  95. package/dist/testing/ConformanceScenario.d.ts +29 -0
  96. package/dist/testing/ConformanceScenario.d.ts.map +1 -0
  97. package/dist/testing/ConformanceScenario.js +83 -0
  98. package/dist/testing/ConformanceScenario.js.map +1 -0
  99. package/dist/testing/RunConformanceChecks.d.ts +10 -0
  100. package/dist/testing/RunConformanceChecks.d.ts.map +1 -0
  101. package/dist/testing/RunConformanceChecks.js +50 -0
  102. package/dist/testing/RunConformanceChecks.js.map +1 -0
  103. package/dist/testing/assertions.d.ts +13 -0
  104. package/dist/testing/assertions.d.ts.map +1 -0
  105. package/dist/testing/assertions.js +66 -0
  106. package/dist/testing/assertions.js.map +1 -0
  107. package/dist/testing/conformanceCases.d.ts +4 -0
  108. package/dist/testing/conformanceCases.d.ts.map +1 -0
  109. package/dist/testing/conformanceCases.js +359 -0
  110. package/dist/testing/conformanceCases.js.map +1 -0
  111. package/dist/testing/fixtures.d.ts +21 -0
  112. package/dist/testing/fixtures.d.ts.map +1 -0
  113. package/dist/testing/fixtures.js +39 -0
  114. package/dist/testing/fixtures.js.map +1 -0
  115. package/dist/testing/index.d.ts +6 -0
  116. package/dist/testing/index.d.ts.map +1 -0
  117. package/dist/testing/index.js +5 -0
  118. package/dist/testing/index.js.map +1 -0
  119. package/dist/testing/vitest.d.ts +4 -0
  120. package/dist/testing/vitest.d.ts.map +1 -0
  121. package/dist/testing/vitest.js +19 -0
  122. package/dist/testing/vitest.js.map +1 -0
  123. package/dist/transport.d.ts +106 -0
  124. package/dist/transport.d.ts.map +1 -0
  125. package/dist/transport.js +2 -0
  126. package/dist/transport.js.map +1 -0
  127. package/dist/validation.d.ts +26 -0
  128. package/dist/validation.d.ts.map +1 -0
  129. package/dist/validation.js +177 -0
  130. package/dist/validation.js.map +1 -0
  131. package/package.json +46 -5
@@ -0,0 +1,247 @@
1
+ import { CreatePublishError } from '../publishing.js';
2
+ export const MAX_REST_PUBLISH_BATCH = 100;
3
+ const STATUS_BY_LOWER_NAME = new Map([
4
+ ['accepted', 'Accepted'],
5
+ ['duplicate', 'Duplicate'],
6
+ ['rejected', 'Rejected'],
7
+ ]);
8
+ export function ToRestPublishRequest(request) {
9
+ return {
10
+ ...(request.MessageID !== undefined ? { messageId: request.MessageID } : {}),
11
+ ...(request.PartitionKey !== undefined ? { partitionKey: request.PartitionKey } : {}),
12
+ ...(request.Attributes !== undefined ? { attributes: { ...request.Attributes } } : {}),
13
+ ...(request.Payload !== undefined ? { payload: request.Payload } : {}),
14
+ ...(request.PayloadRef !== undefined ? { payloadRef: toRestPayloadRef(request.PayloadRef) } : {}),
15
+ ...(request.CorrelationID !== undefined ? { correlationId: request.CorrelationID } : {}),
16
+ ...(request.DeduplicationKey !== undefined ? { deduplicationKey: request.DeduplicationKey } : {}),
17
+ ...(request.DeduplicationTTLSeconds !== undefined ? { deduplicationTtlSeconds: request.DeduplicationTTLSeconds } : {}),
18
+ };
19
+ }
20
+ export function FromRestPublishRequest(json) {
21
+ return {
22
+ ...(json.messageId !== undefined ? { MessageID: json.messageId } : {}),
23
+ ...(json.partitionKey !== undefined ? { PartitionKey: json.partitionKey } : {}),
24
+ ...(json.attributes !== undefined ? { Attributes: { ...json.attributes } } : {}),
25
+ ...(json.payload !== undefined ? { Payload: json.payload } : {}),
26
+ ...(json.payloadRef !== undefined ? { PayloadRef: fromRestPayloadRef(json.payloadRef) } : {}),
27
+ ...(json.correlationId !== undefined ? { CorrelationID: json.correlationId } : {}),
28
+ ...(json.deduplicationKey !== undefined ? { DeduplicationKey: json.deduplicationKey } : {}),
29
+ ...(json.deduplicationTtlSeconds !== undefined ? { DeduplicationTTLSeconds: json.deduplicationTtlSeconds } : {}),
30
+ };
31
+ }
32
+ export function ToRestPublishResult(result) {
33
+ return {
34
+ messageId: result.MessageID,
35
+ status: result.Status,
36
+ ...(result.Error !== undefined
37
+ ? { error: { code: result.Error.Code, message: result.Error.Message, retryable: result.Error.Retryable } }
38
+ : {}),
39
+ };
40
+ }
41
+ /** Checks the body's shape and maps it to PublishRequests. Envelope rules are ValidatePublishRequest's job. */
42
+ export function ParseRestPublishBody(value) {
43
+ if (!isRecord(value) || !Array.isArray(value['messages'])) {
44
+ return { Kind: 'Invalid', Error: 'Body must be an object with a "messages" array' };
45
+ }
46
+ const messages = value['messages'];
47
+ if (messages.length === 0 || messages.length > MAX_REST_PUBLISH_BATCH) {
48
+ return { Kind: 'Invalid', Error: `"messages" must contain 1-${MAX_REST_PUBLISH_BATCH} items` };
49
+ }
50
+ const requests = [];
51
+ for (let index = 0; index < messages.length; index += 1) {
52
+ const parsed = parseRequestJson(messages[index]);
53
+ if (typeof parsed === 'string') {
54
+ return { Kind: 'Invalid', Error: `messages[${index}]: ${parsed}` };
55
+ }
56
+ requests.push(FromRestPublishRequest(parsed));
57
+ }
58
+ return { Kind: 'Parsed', Requests: requests };
59
+ }
60
+ export function ParseRestPublishResponse(value, expectedCount) {
61
+ if (!isRecord(value) || !Array.isArray(value['results'])) {
62
+ return null;
63
+ }
64
+ const items = value['results'];
65
+ if (items.length !== expectedCount) {
66
+ return null;
67
+ }
68
+ const results = [];
69
+ for (const item of items) {
70
+ const result = parseResult(item);
71
+ if (result === null) {
72
+ return null;
73
+ }
74
+ results.push(result);
75
+ }
76
+ return results;
77
+ }
78
+ export function IsWorkJson(value) {
79
+ if (value === null || typeof value === 'string' || typeof value === 'boolean') {
80
+ return true;
81
+ }
82
+ if (typeof value === 'number') {
83
+ return Number.isFinite(value);
84
+ }
85
+ if (Array.isArray(value)) {
86
+ return value.every((item) => IsWorkJson(item));
87
+ }
88
+ return isRecord(value) && Object.values(value).every((item) => IsWorkJson(item));
89
+ }
90
+ function parseRequestJson(value) {
91
+ if (!isRecord(value)) {
92
+ return 'must be an object';
93
+ }
94
+ const scalar = parseScalarFields(value);
95
+ if (typeof scalar === 'string') {
96
+ return scalar;
97
+ }
98
+ const attributes = attributesField(value);
99
+ if (!attributes.Valid) {
100
+ return '"attributes" must be an object of string values';
101
+ }
102
+ const rawPayload = value['payload'];
103
+ let payload;
104
+ if (rawPayload !== undefined) {
105
+ if (!IsWorkJson(rawPayload)) {
106
+ return '"payload" must be JSON';
107
+ }
108
+ payload = rawPayload;
109
+ }
110
+ const payloadRef = payloadRefField(value);
111
+ if (!payloadRef.Valid) {
112
+ return '"payloadRef" must be an object with a string "uri"';
113
+ }
114
+ return {
115
+ ...scalar,
116
+ ...(attributes.Value !== undefined ? { attributes: attributes.Value } : {}),
117
+ ...(payload !== undefined ? { payload } : {}),
118
+ ...(payloadRef.Value !== undefined ? { payloadRef: payloadRef.Value } : {}),
119
+ };
120
+ }
121
+ function parseScalarFields(value) {
122
+ const strings = ['messageId', 'partitionKey', 'correlationId', 'deduplicationKey'];
123
+ const numbers = ['deduplicationTtlSeconds'];
124
+ const result = {};
125
+ for (const name of strings) {
126
+ const field = typedField(value, name, 'string');
127
+ if (!field.Valid) {
128
+ return `"${name}" must be a string`;
129
+ }
130
+ if (typeof field.Value === 'string') {
131
+ result[name] = field.Value;
132
+ }
133
+ }
134
+ for (const name of numbers) {
135
+ const field = typedField(value, name, 'number');
136
+ if (!field.Valid) {
137
+ return `"${name}" must be a number`;
138
+ }
139
+ if (typeof field.Value === 'number') {
140
+ result[name] = field.Value;
141
+ }
142
+ }
143
+ return result;
144
+ }
145
+ function typedField(source, name, type) {
146
+ const value = source[name];
147
+ if (value === undefined) {
148
+ return { Valid: true, Value: undefined };
149
+ }
150
+ if (type === 'string' && typeof value === 'string') {
151
+ return { Valid: true, Value: value };
152
+ }
153
+ if (type === 'number' && typeof value === 'number' && Number.isFinite(value)) {
154
+ return { Valid: true, Value: value };
155
+ }
156
+ return { Valid: false };
157
+ }
158
+ function attributesField(source) {
159
+ const value = source['attributes'];
160
+ if (value === undefined) {
161
+ return { Valid: true, Value: undefined };
162
+ }
163
+ if (!isRecord(value)) {
164
+ return { Valid: false };
165
+ }
166
+ const attributes = {};
167
+ for (const [key, item] of Object.entries(value)) {
168
+ if (typeof item !== 'string') {
169
+ return { Valid: false };
170
+ }
171
+ attributes[key] = item;
172
+ }
173
+ return { Valid: true, Value: attributes };
174
+ }
175
+ function payloadRefField(source) {
176
+ const value = source['payloadRef'];
177
+ if (value === undefined) {
178
+ return { Valid: true, Value: undefined };
179
+ }
180
+ if (!isRecord(value) || typeof value['uri'] !== 'string') {
181
+ return { Valid: false };
182
+ }
183
+ const contentType = value['contentType'];
184
+ const sizeBytes = value['sizeBytes'];
185
+ const checksum = value['checksum'];
186
+ const optionalOk = (contentType === undefined || typeof contentType === 'string') &&
187
+ (sizeBytes === undefined || typeof sizeBytes === 'number') &&
188
+ (checksum === undefined || typeof checksum === 'string');
189
+ if (!optionalOk) {
190
+ return { Valid: false };
191
+ }
192
+ return {
193
+ Valid: true,
194
+ Value: {
195
+ uri: String(value['uri']),
196
+ ...(typeof contentType === 'string' ? { contentType } : {}),
197
+ ...(typeof sizeBytes === 'number' ? { sizeBytes } : {}),
198
+ ...(typeof checksum === 'string' ? { checksum } : {}),
199
+ },
200
+ };
201
+ }
202
+ function parseResult(value) {
203
+ if (!isRecord(value)) {
204
+ return null;
205
+ }
206
+ const messageId = value['messageId'];
207
+ const statusText = value['status'];
208
+ const status = typeof statusText === 'string' ? STATUS_BY_LOWER_NAME.get(statusText.toLowerCase()) : undefined;
209
+ if (typeof messageId !== 'string' || status === undefined) {
210
+ return null;
211
+ }
212
+ const error = parseError(value['error']);
213
+ return { MessageID: messageId, Status: status, ...(error !== undefined ? { Error: error } : {}) };
214
+ }
215
+ function parseError(value) {
216
+ if (!isRecord(value)) {
217
+ return undefined;
218
+ }
219
+ const code = value['code'];
220
+ const message = value['message'];
221
+ const retryable = value['retryable'];
222
+ if (typeof code !== 'string') {
223
+ return undefined;
224
+ }
225
+ const error = CreatePublishError(code, typeof message === 'string' ? message : code);
226
+ return typeof retryable === 'boolean' ? { ...error, Retryable: retryable } : error;
227
+ }
228
+ function toRestPayloadRef(ref) {
229
+ return {
230
+ uri: ref.Uri,
231
+ ...(ref.ContentType !== undefined ? { contentType: ref.ContentType } : {}),
232
+ ...(ref.SizeBytes !== undefined ? { sizeBytes: ref.SizeBytes } : {}),
233
+ ...(ref.Checksum !== undefined ? { checksum: ref.Checksum } : {}),
234
+ };
235
+ }
236
+ function fromRestPayloadRef(ref) {
237
+ return {
238
+ Uri: ref.uri,
239
+ ...(ref.contentType !== undefined ? { ContentType: ref.contentType } : {}),
240
+ ...(ref.sizeBytes !== undefined ? { SizeBytes: ref.sizeBytes } : {}),
241
+ ...(ref.checksum !== undefined ? { Checksum: ref.checksum } : {}),
242
+ };
243
+ }
244
+ function isRecord(value) {
245
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
246
+ }
247
+ //# sourceMappingURL=restContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restContract.js","sourceRoot":"","sources":["../../src/api/restContract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SubscriptionPolicy } from './policy.js';
2
+ /**
3
+ * Retry delay in seconds. A finite handler-supplied delay wins (rounded up, clamped to
4
+ * [0, BackoffMaxSeconds]); otherwise full jitter: random(0, min(BackoffMax, BackoffBase × 2^(attempt−1))).
5
+ */
6
+ export declare function ComputeBackoffSeconds(policy: SubscriptionPolicy, attempt: number, handlerDelaySeconds?: number, random?: () => number): number;
7
+ /** Upper bound on the heartbeat interval, whatever the lease length (spec 03 §3.2, F3). */
8
+ export declare const HEARTBEAT_INTERVAL_MAX_SECONDS = 30;
9
+ /**
10
+ * min(LeaseSeconds / 3, 30) seconds. The cadence is decoupled from lease length: a consumer guide lease of 15-20
11
+ * minutes must not mean a cancel or a lost lease goes unnoticed for 5-7 minutes. Each extension still grants a
12
+ * full LeaseSeconds.
13
+ */
14
+ export declare function HeartbeatIntervalSeconds(policy: SubscriptionPolicy): number;
15
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../src/backoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAKnD;;;GAGG;AACH,wBAAgB,qBAAqB,CACjC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE,MAAM,EACf,mBAAmB,CAAC,EAAE,MAAM,EAC5B,MAAM,GAAE,MAAM,MAAoB,GACnC,MAAM,CAQR;AAED,2FAA2F;AAC3F,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,29 @@
1
+ /** Largest exponent applied, so 2^n never overflows before clamping. */
2
+ const MAX_EXPONENT = 30;
3
+ /**
4
+ * Retry delay in seconds. A finite handler-supplied delay wins (rounded up, clamped to
5
+ * [0, BackoffMaxSeconds]); otherwise full jitter: random(0, min(BackoffMax, BackoffBase × 2^(attempt−1))).
6
+ */
7
+ export function ComputeBackoffSeconds(policy, attempt, handlerDelaySeconds, random = Math.random) {
8
+ const maxSeconds = Math.max(0, policy.BackoffMaxSeconds);
9
+ if (handlerDelaySeconds !== undefined && Number.isFinite(handlerDelaySeconds)) {
10
+ return clamp(Math.ceil(handlerDelaySeconds), 0, maxSeconds);
11
+ }
12
+ const exponent = Math.min(Math.max(0, Math.floor(attempt) - 1), MAX_EXPONENT);
13
+ const ceiling = Math.min(maxSeconds, Math.max(0, policy.BackoffBaseSeconds) * Math.pow(2, exponent));
14
+ return clamp(Math.round(clamp(random(), 0, 1) * ceiling), 0, ceiling);
15
+ }
16
+ /** Upper bound on the heartbeat interval, whatever the lease length (spec 03 §3.2, F3). */
17
+ export const HEARTBEAT_INTERVAL_MAX_SECONDS = 30;
18
+ /**
19
+ * min(LeaseSeconds / 3, 30) seconds. The cadence is decoupled from lease length: a consumer guide lease of 15-20
20
+ * minutes must not mean a cancel or a lost lease goes unnoticed for 5-7 minutes. Each extension still grants a
21
+ * full LeaseSeconds.
22
+ */
23
+ export function HeartbeatIntervalSeconds(policy) {
24
+ return Math.min(Math.max(0, policy.LeaseSeconds) / 3, HEARTBEAT_INTERVAL_MAX_SECONDS);
25
+ }
26
+ function clamp(value, min, max) {
27
+ return Math.min(Math.max(value, min), max);
28
+ }
29
+ //# sourceMappingURL=backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.js","sourceRoot":"","sources":["../src/backoff.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,MAAM,YAAY,GAAG,EAAE,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACjC,MAA0B,EAC1B,OAAe,EACf,mBAA4B,EAC5B,SAAuB,IAAI,CAAC,MAAM;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACzD,IAAI,mBAAmB,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAA0B;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,8BAA8B,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;IAClD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { SubscriptionFilter } from './filterTypes.js';
2
+ import type { SubscriptionBinding, TransportCapabilities } from './transport.js';
3
+ /** Why this transport cannot express the subscription's filter (spec 03 §4.1), or null when it can. */
4
+ export declare function FilterUnsupportedReason(filter: SubscriptionFilter | null, capabilities: TransportCapabilities): string | null;
5
+ /**
6
+ * Why a transport cannot run a subscription as configured, or null when it can. Used when a
7
+ * subscription is saved and when a host starts (capability gating). Rules follow spec 03 §5.
8
+ */
9
+ export declare function SubscriptionUnsupportedReason(binding: SubscriptionBinding, capabilities: TransportCapabilities): string | null;
10
+ //# sourceMappingURL=compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.d.ts","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE9E,uGAAuG;AACvG,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,YAAY,EAAE,qBAAqB,GACpC,MAAM,GAAG,IAAI,CAaf;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CACzC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,qBAAqB,GACpC,MAAM,GAAG,IAAI,CAiBf"}
@@ -0,0 +1,41 @@
1
+ import { ValidateSubscriptionFilter } from './filter.js';
2
+ import { WorkQueueConfigurationError } from './errors.js';
3
+ /** Why this transport cannot express the subscription's filter (spec 03 §4.1), or null when it can. */
4
+ export function FilterUnsupportedReason(filter, capabilities) {
5
+ if (filter === null) {
6
+ return null;
7
+ }
8
+ try {
9
+ ValidateSubscriptionFilter(filter, capabilities.Filters);
10
+ return null;
11
+ }
12
+ catch (error) {
13
+ if (error instanceof WorkQueueConfigurationError) {
14
+ return error.message;
15
+ }
16
+ throw error;
17
+ }
18
+ }
19
+ /**
20
+ * Why a transport cannot run a subscription as configured, or null when it can. Used when a
21
+ * subscription is saved and when a host starts (capability gating). Rules follow spec 03 §5.
22
+ */
23
+ export function SubscriptionUnsupportedReason(binding, capabilities) {
24
+ const policy = binding.Policy;
25
+ const name = policy.SubscriptionName;
26
+ if (binding.HostType === 'External' && !capabilities.SupportsExternalHosts) {
27
+ return `Subscription '${name}' uses HostType External, which this transport cannot host`;
28
+ }
29
+ if (policy.PartitionMode === 'Ordered' && !capabilities.SupportsOrdered) {
30
+ return `Subscription '${name}': Ordered requires the Database transport`;
31
+ }
32
+ if (policy.BackoffMaxSeconds > capabilities.MaxRetryDelaySeconds) {
33
+ return `Subscription '${name}' has BackoffMaxSeconds ${policy.BackoffMaxSeconds}, above this transport's limit of ${capabilities.MaxRetryDelaySeconds}`;
34
+ }
35
+ const filterReason = FilterUnsupportedReason(binding.Filter, capabilities);
36
+ if (filterReason) {
37
+ return `Subscription '${name}': ${filterReason}`;
38
+ }
39
+ return null;
40
+ }
41
+ //# sourceMappingURL=compatibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../src/compatibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAGvD,uGAAuG;AACvG,MAAM,UAAU,uBAAuB,CACnC,MAAiC,EACjC,YAAmC;IAEnC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,CAAC;QACD,0BAA0B,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,2BAA2B,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC,OAAO,CAAC;QACzB,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CACzC,OAA4B,EAC5B,YAAmC;IAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC;QACzE,OAAO,iBAAiB,IAAI,4DAA4D,CAAC;IAC7F,CAAC;IACD,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QACtE,OAAO,iBAAiB,IAAI,4CAA4C,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,GAAG,YAAY,CAAC,oBAAoB,EAAE,CAAC;QAC/D,OAAO,iBAAiB,IAAI,2BAA2B,MAAM,CAAC,iBAAiB,qCAAqC,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC5J,CAAC;IACD,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3E,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,iBAAiB,IAAI,MAAM,YAAY,EAAE,CAAC;IACrD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /** JSON-safe value used for inline payloads and progress checkpoints. */
2
+ export type WorkJson = string | number | boolean | null | WorkJson[] | {
3
+ [key: string]: WorkJson;
4
+ };
5
+ /** Reference to data held outside the queue (claim-check). The queue never dereferences it. */
6
+ export interface WorkPayloadRef {
7
+ /** e.g. s3://bucket/key, https://…, mjstorage://{FileStorageAccountID}/{objectKey} */
8
+ Uri: string;
9
+ ContentType?: string;
10
+ SizeBytes?: number;
11
+ /** e.g. "sha256:…" */
12
+ Checksum?: string;
13
+ }
14
+ /** The message as delivered to a handler. Identical on every transport. */
15
+ export interface WorkMessage<TPayload extends WorkJson = WorkJson> {
16
+ /** UUID, globally unique (spec 03 §2.1). Stable across redeliveries and replays. Producer-supplied or generated at publish. */
17
+ MessageID: string;
18
+ Topic: string;
19
+ /** Ordering is publish order per key; there is no producer-supplied ordering number (spec 03 §1). */
20
+ PartitionKey?: string;
21
+ /**
22
+ * ≤ 10 entries; keys 1–64 chars [A-Za-z0-9_-] (no dots: a dotted name is MJ's `source.field` filter form,
23
+ * which filters reject, so a dotted attribute would be unfilterable); values 1–256 chars (brokers refuse
24
+ * empty values). The only fields filters see.
25
+ */
26
+ Attributes: Record<string, string>;
27
+ Payload?: TPayload;
28
+ PayloadRef?: WorkPayloadRef;
29
+ CorrelationID?: string;
30
+ /** ISO-8601 UTC, assigned by the publisher (MJ), not the producer. */
31
+ PublishedAt: string;
32
+ }
33
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,MAAM,QAAQ,GACd,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,QAAQ,EAAE,GACV;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAA;CAAE,CAAC;AAElC,+FAA+F;AAC/F,MAAM,WAAW,cAAc;IAC3B,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ;IAC7D,+HAA+H;IAC/H,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACvB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ /** Thrown by a handler to dead-letter immediately (equivalent to returning Outcome.DeadLetter). */
2
+ export declare class FatalWorkError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /** Thrown by a handler to retry, optionally after a delay (equivalent to Outcome.Retry). */
6
+ export declare class TransientWorkError extends Error {
7
+ readonly RetryAfterSeconds?: number;
8
+ constructor(message: string, retryAfterSeconds?: number);
9
+ }
10
+ /** Configuration problems (unknown topic, unsupported policy on a transport, invalid filter). */
11
+ export declare class WorkQueueConfigurationError extends Error {
12
+ constructor(message: string);
13
+ }
14
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,qBAAa,cAAe,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI9B;AAED,4FAA4F;AAC5F,qBAAa,kBAAmB,SAAQ,KAAK;IACzC,SAAgB,iBAAiB,CAAC,EAAE,MAAM,CAAC;gBAE/B,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CAK1D;AAED,iGAAiG;AACjG,qBAAa,2BAA4B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI9B"}
package/dist/errors.js ADDED
@@ -0,0 +1,23 @@
1
+ /** Thrown by a handler to dead-letter immediately (equivalent to returning Outcome.DeadLetter). */
2
+ export class FatalWorkError extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = 'FatalWorkError';
6
+ }
7
+ }
8
+ /** Thrown by a handler to retry, optionally after a delay (equivalent to Outcome.Retry). */
9
+ export class TransientWorkError extends Error {
10
+ constructor(message, retryAfterSeconds) {
11
+ super(message);
12
+ this.name = 'TransientWorkError';
13
+ this.RetryAfterSeconds = retryAfterSeconds;
14
+ }
15
+ }
16
+ /** Configuration problems (unknown topic, unsupported policy on a transport, invalid filter). */
17
+ export class WorkQueueConfigurationError extends Error {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = 'WorkQueueConfigurationError';
21
+ }
22
+ }
23
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,MAAM,OAAO,cAAe,SAAQ,KAAK;IACrC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IACjC,CAAC;CACJ;AAED,4FAA4F;AAC5F,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzC,YAAY,OAAe,EAAE,iBAA0B;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,CAAC;CACJ;AAED,iGAAiG;AACjG,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC9C,CAAC;CACJ"}
@@ -0,0 +1,12 @@
1
+ import type { FilterSupport, SubscriptionFilter } from './filterTypes.js';
2
+ /** What the Database transport accepts; cloud drivers narrow it. */
3
+ export declare const WORK_QUEUE_FILTER_SUPPORT: FilterSupport;
4
+ /** Parses a subscription's Filter column. Null or blank text means "match everything". */
5
+ export declare function ParseSubscriptionFilter(json: string | null, support: FilterSupport): SubscriptionFilter | null;
6
+ /** Checks an already-parsed CompositeFilterDescriptor against the queue's subset and this transport's support. */
7
+ export declare function ValidateSubscriptionFilter(value: unknown, support: FilterSupport): SubscriptionFilter;
8
+ /** AND across the root's entries; OR inside a single-field group. Case-sensitive (spec 03 §4.3). */
9
+ export declare function MatchesFilter(filter: SubscriptionFilter | null, attributes: Record<string, string>): boolean;
10
+ /** Distinct field names, in first-seen order. */
11
+ export declare function FilterFields(filter: SubscriptionFilter | null): string[];
12
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../src/filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA2C,aAAa,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAMhH,oEAAoE;AACpE,eAAO,MAAM,yBAAyB,EAAE,aAKvC,CAAC;AAEF,0FAA0F;AAC1F,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,kBAAkB,GAAG,IAAI,CAW9G;AAED,kHAAkH;AAClH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,GAAG,kBAAkB,CA8BrG;AAED,oGAAoG;AACpG,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAK5G;AAED,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,MAAM,EAAE,CAWxE"}