@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.
- package/LICENSE +183 -0
- package/README.md +129 -3
- package/dist/api/WorkQueueApiPublisher.d.ts +35 -0
- package/dist/api/WorkQueueApiPublisher.d.ts.map +1 -0
- package/dist/api/WorkQueueApiPublisher.js +136 -0
- package/dist/api/WorkQueueApiPublisher.js.map +1 -0
- package/dist/api/restContract.d.ts +50 -0
- package/dist/api/restContract.d.ts.map +1 -0
- package/dist/api/restContract.js +247 -0
- package/dist/api/restContract.js.map +1 -0
- package/dist/backoff.d.ts +15 -0
- package/dist/backoff.d.ts.map +1 -0
- package/dist/backoff.js +29 -0
- package/dist/backoff.js.map +1 -0
- package/dist/compatibility.d.ts +10 -0
- package/dist/compatibility.d.ts.map +1 -0
- package/dist/compatibility.js +41 -0
- package/dist/compatibility.js.map +1 -0
- package/dist/envelope.d.ts +33 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +2 -0
- package/dist/envelope.js.map +1 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/filter.d.ts +12 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +187 -0
- package/dist/filter.js.map +1 -0
- package/dist/filterTypes.d.ts +25 -0
- package/dist/filterTypes.d.ts.map +1 -0
- package/dist/filterTypes.js +2 -0
- package/dist/filterTypes.js.map +1 -0
- package/dist/handler.d.ts +56 -0
- package/dist/handler.d.ts.map +1 -0
- package/dist/handler.js +25 -0
- package/dist/handler.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +46 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +2 -0
- package/dist/manifest.js.map +1 -0
- package/dist/memory/InMemoryConsumer.d.ts +18 -0
- package/dist/memory/InMemoryConsumer.d.ts.map +1 -0
- package/dist/memory/InMemoryConsumer.js +36 -0
- package/dist/memory/InMemoryConsumer.js.map +1 -0
- package/dist/memory/InMemoryOperator.d.ts +13 -0
- package/dist/memory/InMemoryOperator.d.ts.map +1 -0
- package/dist/memory/InMemoryOperator.js +25 -0
- package/dist/memory/InMemoryOperator.js.map +1 -0
- package/dist/memory/InMemoryStore.d.ts +82 -0
- package/dist/memory/InMemoryStore.d.ts.map +1 -0
- package/dist/memory/InMemoryStore.js +436 -0
- package/dist/memory/InMemoryStore.js.map +1 -0
- package/dist/memory/InMemoryTransport.d.ts +29 -0
- package/dist/memory/InMemoryTransport.d.ts.map +1 -0
- package/dist/memory/InMemoryTransport.js +48 -0
- package/dist/memory/InMemoryTransport.js.map +1 -0
- package/dist/operator.d.ts +60 -0
- package/dist/operator.d.ts.map +1 -0
- package/dist/operator.js +2 -0
- package/dist/operator.js.map +1 -0
- package/dist/policy.d.ts +24 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +10 -0
- package/dist/policy.js.map +1 -0
- package/dist/publishing.d.ts +58 -0
- package/dist/publishing.d.ts.map +1 -0
- package/dist/publishing.js +40 -0
- package/dist/publishing.js.map +1 -0
- package/dist/runtime/ConsumerRuntime.d.ts +46 -0
- package/dist/runtime/ConsumerRuntime.d.ts.map +1 -0
- package/dist/runtime/ConsumerRuntime.js +252 -0
- package/dist/runtime/ConsumerRuntime.js.map +1 -0
- package/dist/runtime/DeliveryExecution.d.ts +83 -0
- package/dist/runtime/DeliveryExecution.d.ts.map +1 -0
- package/dist/runtime/DeliveryExecution.js +0 -0
- package/dist/runtime/DeliveryExecution.js.map +1 -0
- package/dist/runtime/outcomes.d.ts +28 -0
- package/dist/runtime/outcomes.d.ts.map +1 -0
- package/dist/runtime/outcomes.js +65 -0
- package/dist/runtime/outcomes.js.map +1 -0
- package/dist/runtime/types.d.ts +14 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/testing/ConformanceHarness.d.ts +45 -0
- package/dist/testing/ConformanceHarness.d.ts.map +1 -0
- package/dist/testing/ConformanceHarness.js +2 -0
- package/dist/testing/ConformanceHarness.js.map +1 -0
- package/dist/testing/ConformanceScenario.d.ts +29 -0
- package/dist/testing/ConformanceScenario.d.ts.map +1 -0
- package/dist/testing/ConformanceScenario.js +83 -0
- package/dist/testing/ConformanceScenario.js.map +1 -0
- package/dist/testing/RunConformanceChecks.d.ts +10 -0
- package/dist/testing/RunConformanceChecks.d.ts.map +1 -0
- package/dist/testing/RunConformanceChecks.js +50 -0
- package/dist/testing/RunConformanceChecks.js.map +1 -0
- package/dist/testing/assertions.d.ts +13 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +66 -0
- package/dist/testing/assertions.js.map +1 -0
- package/dist/testing/conformanceCases.d.ts +4 -0
- package/dist/testing/conformanceCases.d.ts.map +1 -0
- package/dist/testing/conformanceCases.js +359 -0
- package/dist/testing/conformanceCases.js.map +1 -0
- package/dist/testing/fixtures.d.ts +21 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +39 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/vitest.d.ts +4 -0
- package/dist/testing/vitest.d.ts.map +1 -0
- package/dist/testing/vitest.js +19 -0
- package/dist/testing/vitest.js.map +1 -0
- package/dist/transport.d.ts +106 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +2 -0
- package/dist/transport.js.map +1 -0
- package/dist/validation.d.ts +26 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +177 -0
- package/dist/validation.js.map +1 -0
- package/package.json +46 -5
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import type { WorkJson, WorkMessage } from './envelope.js';
|
|
2
|
+
import type { FilterSupport, SubscriptionFilter } from './filterTypes.js';
|
|
3
|
+
import type { WorkProgress } from './handler.js';
|
|
4
|
+
import type { ITransportOperator } from './operator.js';
|
|
5
|
+
import type { DeliveryStatus, HostType, SubscriptionPolicy } from './policy.js';
|
|
6
|
+
import type { PublishResult } from './publishing.js';
|
|
7
|
+
export interface TopicBinding {
|
|
8
|
+
TopicName: string;
|
|
9
|
+
IsFifo: boolean;
|
|
10
|
+
MaxPayloadBytes: number;
|
|
11
|
+
/** e.g. { SnsTopicArn } */
|
|
12
|
+
Config: Record<string, WorkJson>;
|
|
13
|
+
}
|
|
14
|
+
export interface SubscriptionBinding {
|
|
15
|
+
Policy: SubscriptionPolicy;
|
|
16
|
+
Filter: SubscriptionFilter | null;
|
|
17
|
+
HostType: HostType;
|
|
18
|
+
/** e.g. { Region, QueueUrl, QueueArn, DeadLetterQueueUrl, DeadLetterQueueArn, SnsSubscriptionArn, IsFifo } */
|
|
19
|
+
Config: Record<string, WorkJson>;
|
|
20
|
+
}
|
|
21
|
+
export interface ReceivedDelivery<TPayload extends WorkJson = WorkJson> {
|
|
22
|
+
Message: WorkMessage<TPayload>;
|
|
23
|
+
DeliveryID: string;
|
|
24
|
+
/** Database: per-claim UUID; SQS: receipt handle */
|
|
25
|
+
LeaseToken: string;
|
|
26
|
+
Attempt: number;
|
|
27
|
+
IsReplay: boolean;
|
|
28
|
+
LeaseExpiresAt: Date;
|
|
29
|
+
}
|
|
30
|
+
export type SettleResult = {
|
|
31
|
+
Kind: 'Settled';
|
|
32
|
+
DeliveryID: string;
|
|
33
|
+
Status: DeliveryStatus;
|
|
34
|
+
}
|
|
35
|
+
/** The guarded write changed no row: taken over, expired or cancelled. */
|
|
36
|
+
| {
|
|
37
|
+
Kind: 'LeaseLost';
|
|
38
|
+
DeliveryID: string;
|
|
39
|
+
} | {
|
|
40
|
+
Kind: 'Failed';
|
|
41
|
+
DeliveryID: string;
|
|
42
|
+
Error: string;
|
|
43
|
+
};
|
|
44
|
+
export type LeaseExtension = 'Held' | 'Lost' | 'Cancelled';
|
|
45
|
+
export interface TransportCapabilities {
|
|
46
|
+
/** Filter operators and structure this transport accepts (spec 03 §4.1). */
|
|
47
|
+
Filters: FilterSupport;
|
|
48
|
+
/** Database true; AWS false */
|
|
49
|
+
DetectsMessageIDDuplicates: boolean;
|
|
50
|
+
/** Database true; AWS false */
|
|
51
|
+
PersistsProgress: boolean;
|
|
52
|
+
/** Database true; AWS false — Ordered requires the Database transport */
|
|
53
|
+
SupportsOrdered: boolean;
|
|
54
|
+
/** Database false; AWS true */
|
|
55
|
+
SupportsExternalHosts: boolean;
|
|
56
|
+
/** Database true; AWS false */
|
|
57
|
+
CancelPending: boolean;
|
|
58
|
+
/** Cancel an InFlight delivery with the cancel flag + AcknowledgeCancel (spec 03 §7). Database true; AWS false. */
|
|
59
|
+
CancelInFlight: boolean;
|
|
60
|
+
/** Database true; AWS false */
|
|
61
|
+
ListPartitions: boolean;
|
|
62
|
+
/** Database Full; AWS BestEffort (≤ 100 scanned) */
|
|
63
|
+
PeekDeadLetters: 'Full' | 'BestEffort';
|
|
64
|
+
/** Database true; AWS true (scan-based) */
|
|
65
|
+
ReplaySingleDeadLetter: boolean;
|
|
66
|
+
/** Database true; AWS false */
|
|
67
|
+
CompletedCounts: boolean;
|
|
68
|
+
/** Database 2147483647; AWS 43200 */
|
|
69
|
+
MaxRetryDelaySeconds: number;
|
|
70
|
+
}
|
|
71
|
+
/** Opaque to core; the Database driver narrows it (transaction enlistment, PublishedByUserID). Cloud drivers ignore it. */
|
|
72
|
+
export interface DatabasePublishOptions {
|
|
73
|
+
readonly Kind: 'Database';
|
|
74
|
+
}
|
|
75
|
+
export interface ITransportDriver {
|
|
76
|
+
readonly Name: string;
|
|
77
|
+
readonly Capabilities: TransportCapabilities;
|
|
78
|
+
Publish(topic: TopicBinding, messages: WorkMessage[], subscriptions: SubscriptionBinding[], opts?: DatabasePublishOptions): Promise<PublishResult[]>;
|
|
79
|
+
OpenConsumer<TPayload extends WorkJson>(subscription: SubscriptionBinding): ITransportConsumer<TPayload>;
|
|
80
|
+
Operator(): ITransportOperator;
|
|
81
|
+
ValidateBindings(topic: TopicBinding, subscriptions: SubscriptionBinding[]): Promise<BindingValidationIssue[]>;
|
|
82
|
+
}
|
|
83
|
+
export interface ITransportConsumer<TPayload extends WorkJson = WorkJson> {
|
|
84
|
+
/** Never returns two deliveries of one partition key for a partitioned subscription (spec 03 §7). */
|
|
85
|
+
Receive(max: number, waitSeconds: number, signal: AbortSignal): Promise<ReceivedDelivery<TPayload>[]>;
|
|
86
|
+
/** A thrown error is transient (the runtime retries next tick). 'Cancelled' only where CancelInFlight. */
|
|
87
|
+
ExtendLease(delivery: ReceivedDelivery<TPayload>, leaseSeconds: number, progress?: WorkProgress): Promise<LeaseExtension>;
|
|
88
|
+
Complete(delivery: ReceivedDelivery<TPayload>): Promise<SettleResult>;
|
|
89
|
+
Retry(delivery: ReceivedDelivery<TPayload>, delaySeconds: number, error: string): Promise<SettleResult>;
|
|
90
|
+
DeadLetter(delivery: ReceivedDelivery<TPayload>, reason: string, error: string | null): Promise<SettleResult>;
|
|
91
|
+
/** Database: no attempt consumed. SQS: the receive is already counted (spec 03 §5.1). */
|
|
92
|
+
Release(delivery: ReceivedDelivery<TPayload>): Promise<SettleResult>;
|
|
93
|
+
/**
|
|
94
|
+
* Token-fenced: a cancelled InFlight delivery held by this token → Discarded now, freeing its key (spec 03 §7).
|
|
95
|
+
* Anything else → LeaseLost with no change. Transports without CancelInFlight always return LeaseLost.
|
|
96
|
+
*/
|
|
97
|
+
AcknowledgeCancel(delivery: ReceivedDelivery<TPayload>): Promise<SettleResult>;
|
|
98
|
+
/** Releases the consumer's independent executor / clients (spec 03 §11). */
|
|
99
|
+
Close(): Promise<void>;
|
|
100
|
+
}
|
|
101
|
+
export interface BindingValidationIssue {
|
|
102
|
+
Severity: 'Error' | 'Warning';
|
|
103
|
+
Subject: string;
|
|
104
|
+
Message: string;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WorkJson, WorkMessage } from './envelope.js';
|
|
2
|
+
import type { PublishError, PublishRequest } from './publishing.js';
|
|
3
|
+
import type { TopicBinding } from './transport.js';
|
|
4
|
+
export declare const MAX_ENVELOPE_BYTES = 262144;
|
|
5
|
+
export declare const MAX_ATTRIBUTES = 10;
|
|
6
|
+
export declare const MAX_ATTRIBUTE_KEY_LENGTH = 64;
|
|
7
|
+
export declare const MAX_ATTRIBUTE_VALUE_LENGTH = 256;
|
|
8
|
+
export declare const MAX_PARTITION_KEY_LENGTH = 200;
|
|
9
|
+
export declare const MAX_DEDUPLICATION_KEY_LENGTH = 200;
|
|
10
|
+
export declare const MIN_DEDUPLICATION_TTL_SECONDS = 60;
|
|
11
|
+
export declare const MAX_DEDUPLICATION_TTL_SECONDS = 2592000;
|
|
12
|
+
/** No dot: a dotted name is MJ's `source.field` filter form, so a dotted attribute key could never be filtered. Shared with filter.ts so a filter can only name a key a producer could publish. */
|
|
13
|
+
export declare const ATTRIBUTE_KEY_PATTERN: RegExp;
|
|
14
|
+
export declare function IsWorkQueueUuid(value: string): boolean;
|
|
15
|
+
export declare function IsReservedAttributeKey(key: string): boolean;
|
|
16
|
+
/** First failing envelope rule (spec 03 §1.1) that core can check without MJ state, or null. */
|
|
17
|
+
export declare function ValidatePublishRequest(topic: TopicBinding, request: PublishRequest): PublishError | null;
|
|
18
|
+
export declare function BuildWorkMessage<TPayload extends WorkJson = WorkJson>(topicName: string, request: PublishRequest<TPayload>, publishedAt: Date, newId: () => string): WorkMessage<TPayload>;
|
|
19
|
+
export declare function SerializedEnvelopeBytes(message: WorkMessage): number;
|
|
20
|
+
/**
|
|
21
|
+
* Sorted-key JSON of the fields that identify a publish — never MessageID, Topic or PublishedAt (spec 03 §2.1).
|
|
22
|
+
* Two publishes that reuse a MessageID are the same publish exactly when their canonical envelopes are equal,
|
|
23
|
+
* however the producer ordered its object keys.
|
|
24
|
+
*/
|
|
25
|
+
export declare function CanonicalEnvelope(message: WorkMessage): string;
|
|
26
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAkB,MAAM,YAAY,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,6BAA6B,UAAU,CAAC;AAErD,mMAAmM;AACnM,eAAO,MAAM,qBAAqB,QAA0B,CAAC;AAO7D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,gGAAgG;AAChG,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY,GAAG,IAAI,CASxG;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,SAAS,QAAQ,GAAG,QAAQ,EACjE,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,EACjC,WAAW,EAAE,IAAI,EACjB,KAAK,EAAE,MAAM,MAAM,GACpB,WAAW,CAAC,QAAQ,CAAC,CAWvB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAEpE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAgB9D"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { CreatePublishError, PublishErrorCodes } from './publishing.js';
|
|
2
|
+
export const MAX_ENVELOPE_BYTES = 262144;
|
|
3
|
+
export const MAX_ATTRIBUTES = 10;
|
|
4
|
+
export const MAX_ATTRIBUTE_KEY_LENGTH = 64;
|
|
5
|
+
export const MAX_ATTRIBUTE_VALUE_LENGTH = 256;
|
|
6
|
+
export const MAX_PARTITION_KEY_LENGTH = 200;
|
|
7
|
+
export const MAX_DEDUPLICATION_KEY_LENGTH = 200;
|
|
8
|
+
export const MIN_DEDUPLICATION_TTL_SECONDS = 60;
|
|
9
|
+
export const MAX_DEDUPLICATION_TTL_SECONDS = 2592000;
|
|
10
|
+
/** No dot: a dotted name is MJ's `source.field` filter form, so a dotted attribute key could never be filtered. Shared with filter.ts so a filter can only name a key a producer could publish. */
|
|
11
|
+
export const ATTRIBUTE_KEY_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
12
|
+
const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
|
|
13
|
+
const RESERVED_ATTRIBUTE_PREFIXES = ['mj.', 'mj_'];
|
|
14
|
+
const SIZE_PLACEHOLDER_MESSAGE_ID = '00000000-0000-0000-0000-000000000000';
|
|
15
|
+
const SIZE_PLACEHOLDER_PUBLISHED_AT = new Date(Date.UTC(2000, 0, 1));
|
|
16
|
+
const utf8 = new TextEncoder();
|
|
17
|
+
export function IsWorkQueueUuid(value) {
|
|
18
|
+
return UUID_PATTERN.test(value);
|
|
19
|
+
}
|
|
20
|
+
export function IsReservedAttributeKey(key) {
|
|
21
|
+
const lower = key.toLowerCase();
|
|
22
|
+
return RESERVED_ATTRIBUTE_PREFIXES.some((prefix) => lower.startsWith(prefix));
|
|
23
|
+
}
|
|
24
|
+
/** First failing envelope rule (spec 03 §1.1) that core can check without MJ state, or null. */
|
|
25
|
+
export function ValidatePublishRequest(topic, request) {
|
|
26
|
+
return (validateMessageID(request) ??
|
|
27
|
+
validateAttributes(request) ??
|
|
28
|
+
validatePayloadShape(request) ??
|
|
29
|
+
validatePartitionKey(request) ??
|
|
30
|
+
validateDeduplication(request) ??
|
|
31
|
+
validateSize(topic, request));
|
|
32
|
+
}
|
|
33
|
+
export function BuildWorkMessage(topicName, request, publishedAt, newId) {
|
|
34
|
+
return {
|
|
35
|
+
MessageID: request.MessageID ?? newId(),
|
|
36
|
+
Topic: topicName,
|
|
37
|
+
...(request.PartitionKey !== undefined ? { PartitionKey: request.PartitionKey } : {}),
|
|
38
|
+
Attributes: { ...(request.Attributes ?? {}) },
|
|
39
|
+
...(request.Payload !== undefined ? { Payload: request.Payload } : {}),
|
|
40
|
+
...(request.PayloadRef !== undefined ? { PayloadRef: { ...request.PayloadRef } } : {}),
|
|
41
|
+
...(request.CorrelationID !== undefined ? { CorrelationID: request.CorrelationID } : {}),
|
|
42
|
+
PublishedAt: publishedAt.toISOString(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function SerializedEnvelopeBytes(message) {
|
|
46
|
+
return utf8.encode(JSON.stringify(message)).length;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Sorted-key JSON of the fields that identify a publish — never MessageID, Topic or PublishedAt (spec 03 §2.1).
|
|
50
|
+
* Two publishes that reuse a MessageID are the same publish exactly when their canonical envelopes are equal,
|
|
51
|
+
* however the producer ordered its object keys.
|
|
52
|
+
*/
|
|
53
|
+
export function CanonicalEnvelope(message) {
|
|
54
|
+
const compared = {};
|
|
55
|
+
if (message.PartitionKey !== undefined) {
|
|
56
|
+
compared.PartitionKey = message.PartitionKey;
|
|
57
|
+
}
|
|
58
|
+
compared.Attributes = { ...message.Attributes };
|
|
59
|
+
if (message.Payload !== undefined) {
|
|
60
|
+
compared.Payload = message.Payload;
|
|
61
|
+
}
|
|
62
|
+
if (message.PayloadRef !== undefined) {
|
|
63
|
+
compared.PayloadRef = payloadRefJson(message.PayloadRef);
|
|
64
|
+
}
|
|
65
|
+
if (message.CorrelationID !== undefined) {
|
|
66
|
+
compared.CorrelationID = message.CorrelationID;
|
|
67
|
+
}
|
|
68
|
+
return JSON.stringify(sortKeys(compared));
|
|
69
|
+
}
|
|
70
|
+
/** Only the fields that are present: an optional property typed `undefined` is not a WorkJson value. */
|
|
71
|
+
function payloadRefJson(ref) {
|
|
72
|
+
const json = { Uri: ref.Uri };
|
|
73
|
+
if (ref.ContentType !== undefined) {
|
|
74
|
+
json.ContentType = ref.ContentType;
|
|
75
|
+
}
|
|
76
|
+
if (ref.SizeBytes !== undefined) {
|
|
77
|
+
json.SizeBytes = ref.SizeBytes;
|
|
78
|
+
}
|
|
79
|
+
if (ref.Checksum !== undefined) {
|
|
80
|
+
json.Checksum = ref.Checksum;
|
|
81
|
+
}
|
|
82
|
+
return json;
|
|
83
|
+
}
|
|
84
|
+
/** Object keys sorted recursively; array order is significant and kept. */
|
|
85
|
+
function sortKeys(value) {
|
|
86
|
+
if (Array.isArray(value)) {
|
|
87
|
+
return value.map(sortKeys);
|
|
88
|
+
}
|
|
89
|
+
if (typeof value !== 'object' || value === null) {
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
const sorted = {};
|
|
93
|
+
for (const key of Object.keys(value).sort()) {
|
|
94
|
+
sorted[key] = sortKeys(value[key]);
|
|
95
|
+
}
|
|
96
|
+
return sorted;
|
|
97
|
+
}
|
|
98
|
+
function validateMessageID(request) {
|
|
99
|
+
if (request.MessageID === undefined || IsWorkQueueUuid(request.MessageID)) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
return CreatePublishError(PublishErrorCodes.InvalidMessageID, `MessageID '${request.MessageID}' is not a UUID`);
|
|
103
|
+
}
|
|
104
|
+
function validateAttributes(request) {
|
|
105
|
+
if (request.Attributes === undefined) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
const entries = Object.entries(request.Attributes);
|
|
109
|
+
if (entries.length > MAX_ATTRIBUTES) {
|
|
110
|
+
return invalidAttributes(`At most ${MAX_ATTRIBUTES} attributes are allowed; got ${entries.length}`);
|
|
111
|
+
}
|
|
112
|
+
for (const [key, value] of entries) {
|
|
113
|
+
if (!ATTRIBUTE_KEY_PATTERN.test(key)) {
|
|
114
|
+
return invalidAttributes(`Attribute key '${key}' must be 1-${MAX_ATTRIBUTE_KEY_LENGTH} characters of A-Z a-z 0-9 _ - (no dots)`);
|
|
115
|
+
}
|
|
116
|
+
if (IsReservedAttributeKey(key)) {
|
|
117
|
+
return invalidAttributes(`Attribute key '${key}' uses a reserved prefix (mj. or mj_)`);
|
|
118
|
+
}
|
|
119
|
+
if (typeof value !== 'string' || value.length === 0 || value.length > MAX_ATTRIBUTE_VALUE_LENGTH) {
|
|
120
|
+
return invalidAttributes(`Attribute '${key}' must be a string of 1-${MAX_ATTRIBUTE_VALUE_LENGTH} characters`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
function validatePayloadShape(request) {
|
|
126
|
+
if (request.Payload !== undefined && request.PayloadRef !== undefined) {
|
|
127
|
+
return CreatePublishError(PublishErrorCodes.InvalidPayload, 'Supply Payload or PayloadRef, not both');
|
|
128
|
+
}
|
|
129
|
+
if (request.PayloadRef !== undefined && (typeof request.PayloadRef.Uri !== 'string' || request.PayloadRef.Uri.length === 0)) {
|
|
130
|
+
return CreatePublishError(PublishErrorCodes.InvalidPayload, 'PayloadRef.Uri must be a non-empty string');
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
function validatePartitionKey(request) {
|
|
135
|
+
const key = request.PartitionKey;
|
|
136
|
+
if (key === undefined || (key.length > 0 && key.length <= MAX_PARTITION_KEY_LENGTH)) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
return CreatePublishError(PublishErrorCodes.InvalidPartitionKey, `PartitionKey must be 1-${MAX_PARTITION_KEY_LENGTH} characters`);
|
|
140
|
+
}
|
|
141
|
+
function validateDeduplication(request) {
|
|
142
|
+
const key = request.DeduplicationKey;
|
|
143
|
+
const ttl = request.DeduplicationTTLSeconds;
|
|
144
|
+
if (key === undefined) {
|
|
145
|
+
return ttl === undefined ? null : invalidDeduplication('DeduplicationTTLSeconds requires a DeduplicationKey');
|
|
146
|
+
}
|
|
147
|
+
if (key.length === 0 || key.length > MAX_DEDUPLICATION_KEY_LENGTH) {
|
|
148
|
+
return invalidDeduplication(`DeduplicationKey must be 1-${MAX_DEDUPLICATION_KEY_LENGTH} characters`);
|
|
149
|
+
}
|
|
150
|
+
if (ttl !== undefined && (!Number.isInteger(ttl) || ttl < MIN_DEDUPLICATION_TTL_SECONDS || ttl > MAX_DEDUPLICATION_TTL_SECONDS)) {
|
|
151
|
+
return invalidDeduplication(`DeduplicationTTLSeconds must be an integer from ${MIN_DEDUPLICATION_TTL_SECONDS} to ${MAX_DEDUPLICATION_TTL_SECONDS}`);
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
function validateSize(topic, request) {
|
|
156
|
+
const limit = Math.min(topic.MaxPayloadBytes, MAX_ENVELOPE_BYTES);
|
|
157
|
+
let bytes;
|
|
158
|
+
try {
|
|
159
|
+
const provisional = BuildWorkMessage(topic.TopicName, request, SIZE_PLACEHOLDER_PUBLISHED_AT, () => SIZE_PLACEHOLDER_MESSAGE_ID);
|
|
160
|
+
bytes = SerializedEnvelopeBytes(provisional);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const detail = error instanceof Error ? error.message : String(error);
|
|
164
|
+
return CreatePublishError(PublishErrorCodes.InvalidPayload, `Payload is not serializable JSON: ${detail}`);
|
|
165
|
+
}
|
|
166
|
+
if (bytes > limit) {
|
|
167
|
+
return CreatePublishError(PublishErrorCodes.PayloadTooLarge, `Envelope is ${bytes} bytes; the limit for '${topic.TopicName}' is ${limit}`);
|
|
168
|
+
}
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
function invalidAttributes(message) {
|
|
172
|
+
return CreatePublishError(PublishErrorCodes.InvalidAttributes, message);
|
|
173
|
+
}
|
|
174
|
+
function invalidDeduplication(message) {
|
|
175
|
+
return CreatePublishError(PublishErrorCodes.InvalidDeduplication, message);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAChD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAChD,MAAM,CAAC,MAAM,6BAA6B,GAAG,OAAO,CAAC;AAErD,mMAAmM;AACnM,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,MAAM,YAAY,GAAG,+EAA+E,CAAC;AACrG,MAAM,2BAA2B,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACnD,MAAM,2BAA2B,GAAG,sCAAsC,CAAC;AAC3E,MAAM,6BAA6B,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,KAAa;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,sBAAsB,CAAC,KAAmB,EAAE,OAAuB;IAC/E,OAAO,CACH,iBAAiB,CAAC,OAAO,CAAC;QAC1B,kBAAkB,CAAC,OAAO,CAAC;QAC3B,oBAAoB,CAAC,OAAO,CAAC;QAC7B,oBAAoB,CAAC,OAAO,CAAC;QAC7B,qBAAqB,CAAC,OAAO,CAAC;QAC9B,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAC/B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC5B,SAAiB,EACjB,OAAiC,EACjC,WAAiB,EACjB,KAAmB;IAEnB,OAAO;QACH,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE;QACvC,KAAK,EAAE,SAAS;QAChB,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,UAAU,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;QAC7C,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtF,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;KACzC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAoB;IACxD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IAClD,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,QAAQ,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACjD,CAAC;IACD,QAAQ,CAAC,UAAU,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,QAAQ,CAAC,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACtC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,wGAAwG;AACxG,SAAS,cAAc,CAAC,GAAmB;IACvC,MAAM,IAAI,GAAgC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAC3D,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;IACvC,CAAC;IACD,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IACnC,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,2EAA2E;AAC3E,SAAS,QAAQ,CAAC,KAAe;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAgC,EAAE,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAC9C,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,cAAc,OAAO,CAAC,SAAS,iBAAiB,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAuB;IAC/C,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,IAAI,OAAO,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAClC,OAAO,iBAAiB,CAAC,WAAW,cAAc,gCAAgC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACxG,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,iBAAiB,CAAC,kBAAkB,GAAG,eAAe,wBAAwB,0CAA0C,CAAC,CAAC;QACrI,CAAC;QACD,IAAI,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,iBAAiB,CAAC,kBAAkB,GAAG,uCAAuC,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;YAC/F,OAAO,iBAAiB,CAAC,cAAc,GAAG,2BAA2B,0BAA0B,aAAa,CAAC,CAAC;QAClH,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAuB;IACjD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpE,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,EAAE,wCAAwC,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1H,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,EAAE,2CAA2C,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAuB;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IACjC,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,0BAA0B,wBAAwB,aAAa,CAAC,CAAC;AACtI,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAuB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,CAAC;IACrC,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACpB,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,qDAAqD,CAAC,CAAC;IAClH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,4BAA4B,EAAE,CAAC;QAChE,OAAO,oBAAoB,CAAC,8BAA8B,4BAA4B,aAAa,CAAC,CAAC;IACzG,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,6BAA6B,IAAI,GAAG,GAAG,6BAA6B,CAAC,EAAE,CAAC;QAC9H,OAAO,oBAAoB,CACvB,mDAAmD,6BAA6B,OAAO,6BAA6B,EAAE,CACzH,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB,EAAE,OAAuB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAClE,IAAI,KAAa,CAAC;IAClB,IAAI,CAAC;QACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,CAAC;QACjI,KAAK,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtE,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,cAAc,EAAE,qCAAqC,MAAM,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;QAChB,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,eAAe,EAAE,eAAe,KAAK,0BAA0B,KAAK,CAAC,SAAS,QAAQ,KAAK,EAAE,CAAC,CAAC;IAC/I,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACtC,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAe;IACzC,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAC/E,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/work-queue-core",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "6.2.0-edge.3",
|
|
5
|
+
"description": "MemberJunction: durable work queue contracts, consumer runtime, in-memory transport and conformance kit. No MemberJunction runtime dependencies.",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./testing": {
|
|
14
|
+
"types": "./dist/testing/index.d.ts",
|
|
15
|
+
"default": "./dist/testing/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./testing/vitest": {
|
|
18
|
+
"types": "./dist/testing/vitest.d.ts",
|
|
19
|
+
"default": "./dist/testing/vitest.js"
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"/dist"
|
|
24
|
+
],
|
|
25
|
+
"author": "MemberJunction.com",
|
|
26
|
+
"license": "BUSL-1.1",
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"vitest": ">=3.2.0"
|
|
29
|
+
},
|
|
30
|
+
"peerDependenciesMeta": {
|
|
31
|
+
"vitest": {
|
|
32
|
+
"optional": true
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "24.10.11",
|
|
37
|
+
"typescript": "^5.9.3",
|
|
38
|
+
"vitest": "^4.0.18"
|
|
39
|
+
},
|
|
6
40
|
"repository": {
|
|
7
41
|
"type": "git",
|
|
8
|
-
"url": "
|
|
42
|
+
"url": "https://github.com/MemberJunction/MJ"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc && tsc-alias -f",
|
|
46
|
+
"watch": "tsc --watch",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest",
|
|
49
|
+
"typecheck:tests": "tsc -p tsconfig.test.json"
|
|
9
50
|
}
|
|
10
|
-
}
|
|
51
|
+
}
|