@owlmeans/queue 0.1.18-rc.22 → 0.1.18-rc.24
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/README.md +60 -12
- package/agent-meta/manifest.json +9 -2
- package/agent-meta/skills/queue/SKILL.md +54 -11
- package/agent-meta/skills/scheduled-jobs/SKILL.md +149 -0
- package/build/config.d.ts +29 -1
- package/build/config.d.ts.map +1 -1
- package/build/config.js +101 -1
- package/build/config.js.map +1 -1
- package/build/errors.d.ts +9 -0
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js +13 -0
- package/build/errors.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/protocol.d.ts.map +1 -1
- package/build/protocol.js +4 -7
- package/build/protocol.js.map +1 -1
- package/build/route.d.ts +15 -0
- package/build/route.d.ts.map +1 -0
- package/build/route.js +32 -0
- package/build/route.js.map +1 -0
- package/build/transport.d.ts.map +1 -1
- package/build/transport.js +8 -11
- package/build/transport.js.map +1 -1
- package/build/types.d.ts +55 -0
- package/build/types.d.ts.map +1 -1
- package/build/worker.d.ts.map +1 -1
- package/build/worker.js +5 -4
- package/build/worker.js.map +1 -1
- package/package.json +8 -8
- package/src/config.ts +117 -2
- package/src/errors.ts +15 -0
- package/src/index.ts +1 -0
- package/src/protocol.ts +4 -7
- package/src/route.ts +48 -0
- package/src/transport.ts +8 -11
- package/src/types.ts +56 -0
- package/src/worker.ts +5 -4
- package/tests/protocol.spec.ts +2 -2
- package/tests/schedule.spec.ts +100 -0
package/build/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,qBAAa,UAAW,SAAQ,cAAc;IAC5C,OAAuB,QAAQ,SAAe;IAE9C,YAAY,OAAO,GAAE,MAAgB,EAEpC;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAkC;IAEjE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED,gGAAgG;AAChG,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAuB,QAAQ,SAAqC;IAEpE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,OAAuB,QAAQ,SAAyC;IAExE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED,mDAAmD;AACnD,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,OAAuB,QAAQ,SAA0C;IAEzE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAEhD,qBAAa,UAAW,SAAQ,cAAc;IAC5C,OAAuB,QAAQ,SAAe;IAE9C,YAAY,OAAO,GAAE,MAAgB,EAEpC;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAkC;IAEjE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED,gGAAgG;AAChG,qBAAa,UAAW,SAAQ,UAAU;IACxC,OAAuB,QAAQ,SAAqC;IAEpE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,UAAU;IAC5C,OAAuB,QAAQ,SAAyC;IAExE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED,mDAAmD;AACnD,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,YAAa,SAAQ,UAAU;IAC1C,OAAuB,QAAQ,SAAuC;IAEtE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,OAAuB,QAAQ,SAA0C;IAEzE,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,OAAuB,QAAQ,SAA8C;IAE7E,YAAY,GAAG,EAAE,MAAM,EAGtB;CACF"}
|
package/build/errors.js
CHANGED
|
@@ -79,6 +79,18 @@ export class EnvelopeExpired extends QueueError {
|
|
|
79
79
|
this.type = EnvelopeExpired.typeName;
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* A schedule the broker could not carry out as written: no id, both or neither of `every` and
|
|
84
|
+
* `pattern`, an option that only means something for the other one, or a job option the broker
|
|
85
|
+
* owns for a scheduled run. The message names the schedule id and the reason.
|
|
86
|
+
*/
|
|
87
|
+
export class ScheduleMisdeclared extends QueueError {
|
|
88
|
+
static typeName = `${QueueError.typeName}ScheduleMisdeclared`;
|
|
89
|
+
constructor(msg) {
|
|
90
|
+
super(`schedule-misdeclared:${msg}`);
|
|
91
|
+
this.type = ScheduleMisdeclared.typeName;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
82
94
|
ResilientError.registerErrorClass(QueueError);
|
|
83
95
|
ResilientError.registerErrorClass(QueueTimeout);
|
|
84
96
|
ResilientError.registerErrorClass(UnknownJob);
|
|
@@ -87,4 +99,5 @@ ResilientError.registerErrorClass(UnknownQueue);
|
|
|
87
99
|
ResilientError.registerErrorClass(QueueNotListening);
|
|
88
100
|
ResilientError.registerErrorClass(JobNotServed);
|
|
89
101
|
ResilientError.registerErrorClass(EnvelopeExpired);
|
|
102
|
+
ResilientError.registerErrorClass(ScheduleMisdeclared);
|
|
90
103
|
//# sourceMappingURL=errors.js.map
|
package/build/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
|
package/build/protocol.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAMhG,OAAO,KAAK,EACV,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAC3E,MAAM,YAAY,CAAA;AAEnB,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,6BAA6B,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAMhG,OAAO,KAAK,EACV,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAC3E,MAAM,YAAY,CAAA;AAEnB,KAAK,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAA;AAoBjD,iGAAiG;AACjG,eAAO,MAAM,eAAe,GAAU,QAAQ,SAAS,6BAA6B,WACzE,YAAY,eACR,QAAQ,WACZ,SAAS,CAAC,QAAQ,CAAC,YAClB,UAAU,KACnB,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAkBhE,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,eAAe,GAAU,QAAQ,SAAS,6BAA6B,WACzE,YAAY,eACR,QAAQ,OAChB,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,YAC1D;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAC7B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAe9B,CAAA"}
|
package/build/protocol.js
CHANGED
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import { isEntrypointProtocol } from '@owlmeans/entrypoint';
|
|
2
2
|
import { ResilientError } from '@owlmeans/error';
|
|
3
|
-
import { RouteProtocols } from '@owlmeans/route';
|
|
4
3
|
import { queueOf } from './config.js';
|
|
5
4
|
import { UnknownQueue } from './errors.js';
|
|
5
|
+
import { isQueueRoute, queueRouteOptions } from './route.js';
|
|
6
6
|
const queueFor = (context, declaration) => {
|
|
7
7
|
if (declaration == null || typeof declaration !== 'object' || !isEntrypointProtocol(declaration)) {
|
|
8
8
|
throw new UnknownQueue('protocol declaration required');
|
|
9
9
|
}
|
|
10
|
-
if (declaration.route
|
|
11
|
-
throw new UnknownQueue(`${declaration.alias}: not a
|
|
12
|
-
}
|
|
13
|
-
const queue = declaration.route.route.queue;
|
|
14
|
-
if (queue == null) {
|
|
15
|
-
throw new UnknownQueue(`${declaration.alias}: route declares no queue`);
|
|
10
|
+
if (!isQueueRoute(declaration.route)) {
|
|
11
|
+
throw new UnknownQueue(`${declaration.alias}: not a queue protocol`);
|
|
16
12
|
}
|
|
13
|
+
const { queue } = queueRouteOptions(declaration.route);
|
|
17
14
|
const configured = queueOf(context.cfg, queue);
|
|
18
15
|
if (!configured.jobs.includes(declaration.alias)) {
|
|
19
16
|
throw new UnknownQueue(`${queue}:${declaration.alias}`);
|
package/build/protocol.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAO5D,MAAM,QAAQ,GAAG,CAAC,OAAqB,EAAE,WAAoB,EAG3D,EAAE;IACF,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,YAAY,CAAC,+BAA+B,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,wBAAwB,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,YAAY,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC,CAAA;IACzD,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AACzC,CAAC,CAAA;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,OAAqB,EACrB,WAAqB,EACrB,OAA4B,EAC5B,OAAoB,EAC6C,EAAE;IACnE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,CAAC,OAAO,IAAI,EAAE,CAAuC,CAAA;IACpE,MAAM,QAAQ,GAAgB;QAC5B,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,MAAM,EAAE,MAAM,CAAC,MAA6C;QAC5D,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAA4C;QAC1D,OAAO,EAAE,MAAM,CAAC,OAAyD;QACzE,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACrC,CAAA;IAED,OAAO,MAAM,OAAO,CAAC,IAAI,CAA8C,KAAK,CAAC,CAAC,MAAM,CAAC;QACnF,KAAK;QACL,IAAI,EAAE,QAAQ,CAAC,KAAK;QACpB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;KACd,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,OAAqB,EACrB,WAAqB,EACrB,GAAoE,EACpE,OAA8B,EACC,EAAE;IACjC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,YAAY,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAA;IACjD,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QACf,MAAM,IAAI,YAAY,CAAC,GAAG,KAAK,IAAI,QAAQ,CAAC,KAAK,kBAAkB,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAA8C,KAAK,CAAC;SACjF,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACpB,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,KAAuB,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,KAA6B,CAAA;AAC5C,CAAC,CAAA"}
|
package/build/route.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { RouteDeclaration, RouteModel, RouteOptions } from '@owlmeans/route';
|
|
2
|
+
/** The transport identifier owned by the queue package. */
|
|
3
|
+
export declare const QUEUE_PROTOCOL: 'queue';
|
|
4
|
+
/** Queue-owned options stored in a generic route declaration. */
|
|
5
|
+
export interface QueueRouteOptions extends Omit<RouteOptions, 'protocol' | 'protocolOptions'> {
|
|
6
|
+
queue: string;
|
|
7
|
+
reply?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Declare a backend route carried by a queue. */
|
|
10
|
+
export declare const job: (opts: QueueRouteOptions, secondary?: Omit<QueueRouteOptions, 'queue'>) => Partial<RouteOptions>;
|
|
11
|
+
/** Whether a declaration belongs to the queue transport. */
|
|
12
|
+
export declare const isQueueRoute: (route: RouteDeclaration | RouteModel) => boolean;
|
|
13
|
+
/** Read and validate queue-owned route options. */
|
|
14
|
+
export declare const queueRouteOptions: (route: RouteDeclaration | RouteModel) => Pick<QueueRouteOptions, 'queue' | 'reply'>;
|
|
15
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAGjF,2DAA2D;AAC3D,eAAO,MAAM,cAAc,EAAG,OAAgB,CAAA;AAE9C,iEAAiE;AACjE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,YAAY,EAAE,UAAU,GAAG,iBAAiB,CAAC;IAC3F,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,kDAAkD;AAClD,eAAO,MAAM,GAAG,SACR,iBAAiB,cACX,IAAI,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAC3C,OAAO,CAAC,YAAY,CAMtB,CAAA;AAED,4DAA4D;AAC5D,eAAO,MAAM,YAAY,UAAW,gBAAgB,GAAG,UAAU,KAAG,OACE,CAAA;AAEtE,mDAAmD;AACnD,eAAO,MAAM,iBAAiB,UACrB,gBAAgB,GAAG,UAAU,KACnC,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAe3C,CAAA"}
|
package/build/route.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { backend } from '@owlmeans/route';
|
|
2
|
+
import { UnknownQueue } from './errors.js';
|
|
3
|
+
/** The transport identifier owned by the queue package. */
|
|
4
|
+
export const QUEUE_PROTOCOL = 'queue';
|
|
5
|
+
/** Declare a backend route carried by a queue. */
|
|
6
|
+
export const job = (opts, secondary) => {
|
|
7
|
+
const { queue, reply, ...routeOptions } = { ...opts, ...secondary };
|
|
8
|
+
const declaration = backend(routeOptions);
|
|
9
|
+
declaration.protocol = QUEUE_PROTOCOL;
|
|
10
|
+
declaration.protocolOptions = { queue, ...(reply == null ? {} : { reply }) };
|
|
11
|
+
return declaration;
|
|
12
|
+
};
|
|
13
|
+
/** Whether a declaration belongs to the queue transport. */
|
|
14
|
+
export const isQueueRoute = (route) => ('route' in route ? route.route : route).protocol === QUEUE_PROTOCOL;
|
|
15
|
+
/** Read and validate queue-owned route options. */
|
|
16
|
+
export const queueRouteOptions = (route) => {
|
|
17
|
+
const declaration = 'route' in route ? route.route : route;
|
|
18
|
+
if (declaration.protocol !== QUEUE_PROTOCOL
|
|
19
|
+
|| declaration.protocolOptions == null
|
|
20
|
+
|| typeof declaration.protocolOptions !== 'object') {
|
|
21
|
+
throw new UnknownQueue(`${declaration.alias}: not a queue protocol`);
|
|
22
|
+
}
|
|
23
|
+
const options = declaration.protocolOptions;
|
|
24
|
+
if (typeof options.queue !== 'string' || options.queue.trim() === '') {
|
|
25
|
+
throw new UnknownQueue(`${declaration.alias}: route declares no queue`);
|
|
26
|
+
}
|
|
27
|
+
if (options.reply != null && typeof options.reply !== 'boolean') {
|
|
28
|
+
throw new UnknownQueue(`${declaration.alias}: invalid queue reply option`);
|
|
29
|
+
}
|
|
30
|
+
return { queue: options.queue, reply: options.reply };
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../src/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG,OAAgB,CAAA;AAQ9C,kDAAkD;AAClD,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,IAAuB,EACvB,SAA4C,EACrB,EAAE;IACzB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAA;IACnE,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IACzC,WAAW,CAAC,QAAQ,GAAG,cAAc,CAAA;IACrC,WAAW,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAC5E,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAoC,EAAW,EAAE,CAC5E,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAA;AAEtE,mDAAmD;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,KAAoC,EACQ,EAAE;IAC9C,MAAM,WAAW,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1D,IAAI,WAAW,CAAC,QAAQ,KAAK,cAAc;WACtC,WAAW,CAAC,eAAe,IAAI,IAAI;WACnC,OAAO,WAAW,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,wBAAwB,CAAC,CAAA;IACtE,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,CAAC,eAA0C,CAAA;IACtE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,2BAA2B,CAAC,CAAA;IACzE,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChE,MAAM,IAAI,YAAY,CAAC,GAAG,WAAW,CAAC,KAAK,8BAA8B,CAAC,CAAA;IAC5E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,KAA4B,EAAE,CAAA;AAC9E,CAAC,CAAA"}
|
package/build/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAIlG,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAsC,MAAM,YAAY,CAAA;AAIrF;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,WAAW,MAAM,wBAiD/C,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,WAC7E,CAAC,UAAU,MAAM,KACzB,CAMF,CAAA"}
|
package/build/transport.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { assertContext, createService } from '@owlmeans/context';
|
|
2
2
|
import { EntrypointOutcome, transportAlias } from '@owlmeans/entrypoint';
|
|
3
|
-
import { RouteProtocols } from '@owlmeans/route';
|
|
4
3
|
import { ResilientError } from '@owlmeans/error';
|
|
5
4
|
import { DEFAULT_JOB_TIMEOUT } from './consts.js';
|
|
6
|
-
import {
|
|
5
|
+
import { QUEUE_PROTOCOL, queueRouteOptions } from './route.js';
|
|
7
6
|
/**
|
|
8
7
|
* The producing half of the bridge: it turns a call on a QUEUE entrypoint into a job, and the
|
|
9
8
|
* job's outcome back into a reply.
|
|
@@ -14,18 +13,16 @@ import { UnknownQueue } from './errors.js';
|
|
|
14
13
|
* the request rather than from the entrypoint: the far side rebuilds a request, and anything only
|
|
15
14
|
* HTTP understands would not survive the trip anyway.
|
|
16
15
|
*/
|
|
17
|
-
export const makeQueueTransport = (alias = transportAlias(
|
|
16
|
+
export const makeQueueTransport = (alias = transportAlias(QUEUE_PROTOCOL)) => {
|
|
18
17
|
const location = `queue-transport:${alias}`;
|
|
19
18
|
const service = createService(alias, {
|
|
20
|
-
protocol:
|
|
19
|
+
protocol: QUEUE_PROTOCOL,
|
|
21
20
|
handle: (async (req, res) => {
|
|
22
21
|
const context = assertContext(service.ctx, location);
|
|
23
22
|
const entrypoint = context.entrypoint(req.alias);
|
|
24
23
|
const route = entrypoint.route.route;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
const jobs = context.jobs(route.queue);
|
|
24
|
+
const { queue, reply: waitsForReply } = queueRouteOptions(route);
|
|
25
|
+
const jobs = context.jobs(queue);
|
|
29
26
|
const envelope = {
|
|
30
27
|
alias: req.alias,
|
|
31
28
|
params: req.params,
|
|
@@ -34,11 +31,11 @@ export const makeQueueTransport = (alias = transportAlias(RouteProtocols.QUEUE))
|
|
|
34
31
|
headers: req.headers,
|
|
35
32
|
enqueuedAt: new Date().toISOString(),
|
|
36
33
|
};
|
|
37
|
-
const job = await jobs.create({ queue
|
|
34
|
+
const job = await jobs.create({ queue, name: req.alias, data: envelope });
|
|
38
35
|
// `reply: false` says the caller is not waiting for the work, only for the promise that it
|
|
39
36
|
// was taken. `Accepted` plus the job's identity is the whole answer — enough to watch it.
|
|
40
|
-
if (
|
|
41
|
-
res.resolve({ id: job.id, queue
|
|
37
|
+
if (waitsForReply === false) {
|
|
38
|
+
res.resolve({ id: job.id, queue }, EntrypointOutcome.Accepted);
|
|
42
39
|
return;
|
|
43
40
|
}
|
|
44
41
|
const reply = await jobs.wait(job.id, {
|
package/build/transport.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
CHANGED
|
@@ -19,6 +19,56 @@ export interface QueueConfig {
|
|
|
19
19
|
* check and the nonce cache, so a job delayed behind a long backlog is still admitted.
|
|
20
20
|
*/
|
|
21
21
|
envelopeTtl?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Recurring jobs. Declared beside the queues, in the shared package, because every process that
|
|
24
|
+
* listens to a schedule's queue reconciles the broker against this list when its worker starts —
|
|
25
|
+
* two listeners loading different lists would remove each other's schedules.
|
|
26
|
+
*/
|
|
27
|
+
schedules?: ScheduleDeclaration[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A job the broker produces on its own, on an interval or a cron pattern.
|
|
31
|
+
*
|
|
32
|
+
* A scheduled run is an ordinary job of a name the queue declares, dispatched to the processor
|
|
33
|
+
* registered for that name — never to a guarded entrypoint, because nobody's credentials travel
|
|
34
|
+
* with it. Only a process that listens to the queue creates the scheduler, and the broker produces
|
|
35
|
+
* each next run when the previous one STARTS processing — a schedule needs a running consumer.
|
|
36
|
+
*/
|
|
37
|
+
export interface ScheduleDeclaration {
|
|
38
|
+
/**
|
|
39
|
+
* The schedule's stable identity: the broker keeps one scheduler per id, so changing any other
|
|
40
|
+
* field updates it in place, while renaming the id removes one schedule and creates another.
|
|
41
|
+
*/
|
|
42
|
+
id: string;
|
|
43
|
+
queue: string;
|
|
44
|
+
/** A job name the queue declares. */
|
|
45
|
+
name: string;
|
|
46
|
+
/**
|
|
47
|
+
* Milliseconds between runs. Exactly one of `every` and `pattern`. Without `startDate` the first
|
|
48
|
+
* run is produced as soon as the scheduler is created.
|
|
49
|
+
*/
|
|
50
|
+
every?: number;
|
|
51
|
+
/** A cron pattern (an optional leading seconds field is accepted). Exactly one of the two. */
|
|
52
|
+
pattern?: string;
|
|
53
|
+
/** The IANA time zone `pattern` is read in. Pattern only. */
|
|
54
|
+
tz?: string;
|
|
55
|
+
startDate?: Date | number | string;
|
|
56
|
+
/** Once passed, the schedule is treated as absent and a scheduler left from it is removed. */
|
|
57
|
+
endDate?: Date | number | string;
|
|
58
|
+
/** Stop after this many runs. */
|
|
59
|
+
limit?: number;
|
|
60
|
+
/**
|
|
61
|
+
* Run once as soon as the scheduler is created or its declaration changes, then follow the
|
|
62
|
+
* pattern. Pattern only, and never together with `startDate`. A restart that finds the
|
|
63
|
+
* declaration unchanged does not run it again.
|
|
64
|
+
*/
|
|
65
|
+
immediately?: boolean;
|
|
66
|
+
data?: unknown;
|
|
67
|
+
/**
|
|
68
|
+
* Options every run is enqueued with, over the queue's defaults. `id` and `delay` belong to the
|
|
69
|
+
* broker for a scheduled run and are refused.
|
|
70
|
+
*/
|
|
71
|
+
opts?: Omit<JobOptions, 'id' | 'delay'>;
|
|
22
72
|
}
|
|
23
73
|
export interface QueueDeclaration {
|
|
24
74
|
name: string;
|
|
@@ -147,6 +197,11 @@ export interface JobContext<D = unknown> {
|
|
|
147
197
|
attempt: number;
|
|
148
198
|
data: D;
|
|
149
199
|
signal: AbortSignal;
|
|
200
|
+
/**
|
|
201
|
+
* The id of the schedule that produced this run (`ScheduleDeclaration.id`). Absent for a job
|
|
202
|
+
* enqueued any other way.
|
|
203
|
+
*/
|
|
204
|
+
scheduled?: string;
|
|
150
205
|
/**
|
|
151
206
|
* Renew the lock. A processor that runs a long loop MUST call it as it goes: the broker judges
|
|
152
207
|
* liveness by the lock, so silence for longer than `lockDuration` is indistinguishable from a
|
package/build/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEzD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC3B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,sFAAsF;IACtF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEzD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC3B,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,sFAAsF;IACtF,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;OAIG;IACH,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAClC,8FAA8F;IAC9F,OAAO,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,CAAA;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,CAAC,EAAE,kBAAkB,CAAA;IAC3B,QAAQ,CAAC,EAAE,UAAU,CAAA;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;OAGG;IACH,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IACnC,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAE,SAAQ,cAAc;IACzE,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,CAAA;IACP,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,IAAI,EAAE,YAAY,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wEAAwE;AACxE,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAA;CACtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CACrD,SAAQ,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAA;IACb;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B;;;;OAIG;IACH,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAC7D,0FAA0F;IAC1F,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IACrD,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAA;CAChD;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,CAAC,CAAA;IACP,MAAM,EAAE,WAAW,CAAA;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C;;;;;;OAMG;IACH,QAAQ,EAAE,CAAC,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;IACvD,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACtD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACpD,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;IACnF,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,sEAAsE;IACtE,SAAS,EAAE,MAAM,MAAM,EAAE,CAAA;IACzB;;;;;;;OAOG;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5C,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,4FAA4F;IAC5F,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAED,2FAA2F;AAC3F,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,OAAO;IACnC,KAAK,CAAC,EAAE,CAAC,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACjF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvH;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrE;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtD,MAAM,EAAE,MAAM,kBAAkB,CAAA;CACjC;AAED,MAAM,WAAW,MAAO,SAAQ,WAAW;IACzC,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;CAC1E;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CACxE;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;CAC7D;AAED,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB,CAAC,OAAO,CAAC;CACxE"}
|
package/build/worker.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAc,WAAW,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAA;AAK5G;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,WACtD,CAAC,KACT,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAqBhC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,WAC/D,CAAC,KACT,YAAY,CAAC,WAAW,EAAE,OAAO,CACmC,CAAA;AAEvE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,WAAW,MAAM,KAAmB,UAcpE,CAAA"}
|
package/build/worker.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MiddlewareStage, MiddlewareType, AppType } from '@owlmeans/context';
|
|
2
|
-
import { RouteProtocols } from '@owlmeans/route';
|
|
3
2
|
import { handleJob } from './bridge.js';
|
|
4
3
|
import { DEFAULT_ALIAS } from './consts.js';
|
|
4
|
+
import { isQueueRoute, queueRouteOptions } from './route.js';
|
|
5
5
|
/**
|
|
6
6
|
* Every queued entrypoint this process both SERVES and LISTENS to, grouped by queue.
|
|
7
7
|
*
|
|
@@ -15,16 +15,17 @@ export const servedJobs = (context) => {
|
|
|
15
15
|
const served = new Map();
|
|
16
16
|
context.entrypoints().forEach(entrypoint => {
|
|
17
17
|
const route = entrypoint.route.route;
|
|
18
|
-
if (route.type !== AppType.Backend || route
|
|
18
|
+
if (route.type !== AppType.Backend || !isQueueRoute(route)) {
|
|
19
19
|
return;
|
|
20
20
|
}
|
|
21
21
|
if (route.service != null && route.service !== context.cfg.service) {
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
|
|
24
|
+
const { queue } = queueRouteOptions(route);
|
|
25
|
+
if (entrypoint.handle == null || !listen.includes(queue)) {
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
|
-
served.set(
|
|
28
|
+
served.set(queue, [...(served.get(queue) ?? []), entrypoint]);
|
|
28
29
|
});
|
|
29
30
|
return served;
|
|
30
31
|
};
|
package/build/worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAG5E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE5D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAAU,EACuB,EAAE;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAA;IAEpD,OAAO,CAAC,WAAW,EAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAA;QACpC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,OAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACnE,OAAM;QACR,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAA;QAC1C,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACzD,OAAM;QACR,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAU,EAC0B,EAAE,CACtC,KAAK,EAAE,GAA4B,EAAE,EAAE,CAAC,MAAM,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAEvE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,GAAW,aAAa,EAAc,EAAE,CAAC,CAAC;IACnF,IAAI,EAAE,cAAc,CAAC,OAAO;IAC5B,KAAK,EAAE,eAAe,CAAC,KAAK;IAC5B,KAAK,EAAE,KAAK,EAAC,OAAO,EAAC,EAAE;QACrB,MAAM,GAAG,GAAG,OAAqC,CAAA;QACjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,OAAM;QACR,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAM;QACR,CAAC;QAED,MAAM,GAAG,CAAC,OAAO,CAAqB,KAAK,CAAC,CAAC,KAAK,EAAE,CAAA;IACtD,CAAC;CACF,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@owlmeans/queue",
|
|
3
|
-
"version": "0.1.18-rc.
|
|
3
|
+
"version": "0.1.18-rc.24",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
"access": "public"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@owlmeans/auth": "^0.1.18-rc.
|
|
35
|
-
"@owlmeans/auth-common": "^0.1.18-rc.
|
|
36
|
-
"@owlmeans/context": "^0.1.18-rc.
|
|
37
|
-
"@owlmeans/entrypoint": "^0.1.18-rc.
|
|
38
|
-
"@owlmeans/error": "^0.1.18-rc.
|
|
39
|
-
"@owlmeans/resource": "^0.1.18-rc.
|
|
40
|
-
"@owlmeans/route": "^0.1.18-rc.
|
|
34
|
+
"@owlmeans/auth": "^0.1.18-rc.28",
|
|
35
|
+
"@owlmeans/auth-common": "^0.1.18-rc.30",
|
|
36
|
+
"@owlmeans/context": "^0.1.18-rc.26",
|
|
37
|
+
"@owlmeans/entrypoint": "^0.1.18-rc.29",
|
|
38
|
+
"@owlmeans/error": "^0.1.18-rc.28",
|
|
39
|
+
"@owlmeans/resource": "^0.1.18-rc.28",
|
|
40
|
+
"@owlmeans/route": "^0.1.18-rc.27"
|
|
41
41
|
}
|
|
42
42
|
}
|
package/src/config.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type {
|
|
2
|
+
Config, JobOptions, QueueDeclaration, QueueWorkerOptions, ScheduleDeclaration
|
|
3
|
+
} from './types.js'
|
|
4
|
+
import { ScheduleMisdeclared, UnknownJobName, UnknownQueue } from './errors.js'
|
|
3
5
|
|
|
4
6
|
/**
|
|
5
7
|
* Add a queue to the shared configuration. Every process in the monorepo loads the same
|
|
@@ -54,3 +56,116 @@ export const queueOfJob = <C extends Config>(cfg: C, job: string): QueueDeclarat
|
|
|
54
56
|
|
|
55
57
|
export const isListening = <C extends Config>(cfg: C, name: string): boolean =>
|
|
56
58
|
cfg.queue?.listen?.includes(name) === true
|
|
59
|
+
|
|
60
|
+
/** A date option the broker can read — a `Date`, epoch milliseconds or a parsable string. */
|
|
61
|
+
const isInstant = (value: Date | number | string): boolean =>
|
|
62
|
+
Number.isFinite((value instanceof Date ? value : new Date(value)).getTime())
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Whether the broker can carry a schedule out as written. Nothing is recorded or changed.
|
|
66
|
+
*
|
|
67
|
+
* @throws {ScheduleMisdeclared} naming the schedule id and the reason.
|
|
68
|
+
* @throws {UnknownQueue} when the schedule's queue is not declared.
|
|
69
|
+
* @throws {UnknownJobName} when that queue does not accept the schedule's job name — a scheduled
|
|
70
|
+
* run of a name nothing declares would fail on every tick instead of once, at declaration.
|
|
71
|
+
*/
|
|
72
|
+
export const assertSchedule = <C extends Config>(cfg: C, schedule: ScheduleDeclaration): void => {
|
|
73
|
+
const { id } = schedule
|
|
74
|
+
if (typeof id !== 'string' || id.trim() === '') {
|
|
75
|
+
throw new ScheduleMisdeclared('(empty):id')
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const queue = queueOf(cfg, schedule.queue)
|
|
79
|
+
if (!queue.jobs.includes(schedule.name)) {
|
|
80
|
+
throw new UnknownJobName(`${schedule.queue}:${schedule.name}`)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const every = schedule.every != null
|
|
84
|
+
const pattern = schedule.pattern != null
|
|
85
|
+
if (every === pattern) {
|
|
86
|
+
throw new ScheduleMisdeclared(`${id}:every-or-pattern`)
|
|
87
|
+
}
|
|
88
|
+
if (every && !(Number.isSafeInteger(schedule.every) && (schedule.every as number) > 0)) {
|
|
89
|
+
throw new ScheduleMisdeclared(`${id}:every`)
|
|
90
|
+
}
|
|
91
|
+
if (pattern && (typeof schedule.pattern !== 'string' || schedule.pattern.trim() === '')) {
|
|
92
|
+
throw new ScheduleMisdeclared(`${id}:pattern`)
|
|
93
|
+
}
|
|
94
|
+
// Both only mean something to a cron pattern: an interval has no wall clock to read in a time
|
|
95
|
+
// zone, and its first run is immediate already.
|
|
96
|
+
if (!pattern && schedule.tz != null) {
|
|
97
|
+
throw new ScheduleMisdeclared(`${id}:tz`)
|
|
98
|
+
}
|
|
99
|
+
if (!pattern && schedule.immediately === true) {
|
|
100
|
+
throw new ScheduleMisdeclared(`${id}:immediately`)
|
|
101
|
+
}
|
|
102
|
+
if (schedule.immediately === true && schedule.startDate != null) {
|
|
103
|
+
throw new ScheduleMisdeclared(`${id}:immediately-start-date`)
|
|
104
|
+
}
|
|
105
|
+
if (schedule.limit != null && !(Number.isSafeInteger(schedule.limit) && schedule.limit > 0)) {
|
|
106
|
+
throw new ScheduleMisdeclared(`${id}:limit`)
|
|
107
|
+
}
|
|
108
|
+
if (schedule.startDate != null && !isInstant(schedule.startDate)) {
|
|
109
|
+
throw new ScheduleMisdeclared(`${id}:start-date`)
|
|
110
|
+
}
|
|
111
|
+
if (schedule.endDate != null && !isInstant(schedule.endDate)) {
|
|
112
|
+
throw new ScheduleMisdeclared(`${id}:end-date`)
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The type already omits both; a declaration assembled at runtime still reaches this check. The
|
|
116
|
+
// broker names every run itself and places it on the schedule, so either would be overridden.
|
|
117
|
+
const opts = schedule.opts as JobOptions | undefined
|
|
118
|
+
if (opts?.id != null) {
|
|
119
|
+
throw new ScheduleMisdeclared(`${id}:opts-id`)
|
|
120
|
+
}
|
|
121
|
+
if (opts?.delay != null) {
|
|
122
|
+
throw new ScheduleMisdeclared(`${id}:opts-delay`)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Add a recurring job to the shared configuration. Declare the queue first — a schedule is checked
|
|
128
|
+
* against it here. Declaring an id twice replaces, like `declareQueue`.
|
|
129
|
+
*
|
|
130
|
+
* Declaring is all this does: the driver creates, updates and removes the broker's schedulers when
|
|
131
|
+
* a worker that listens to the queue starts.
|
|
132
|
+
*
|
|
133
|
+
* @throws {ScheduleMisdeclared} / {UnknownQueue} / {UnknownJobName} — see `assertSchedule`.
|
|
134
|
+
*/
|
|
135
|
+
export const declareSchedule = <C extends Config>(cfg: C, schedule: ScheduleDeclaration): C => {
|
|
136
|
+
assertSchedule(cfg, schedule)
|
|
137
|
+
|
|
138
|
+
const schedules = cfg.queue?.schedules ?? []
|
|
139
|
+
const existing = schedules.findIndex(declared => declared.id === schedule.id)
|
|
140
|
+
|
|
141
|
+
if (existing < 0) {
|
|
142
|
+
schedules.push(schedule)
|
|
143
|
+
} else {
|
|
144
|
+
schedules[existing] = schedule
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
cfg.queue = { ...cfg.queue, schedules }
|
|
148
|
+
|
|
149
|
+
return cfg
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** The declared schedules, of one queue when it is named. */
|
|
153
|
+
export const schedulesOf = <C extends Config>(cfg: C, queue?: string): ScheduleDeclaration[] =>
|
|
154
|
+
(cfg.queue?.schedules ?? []).filter(schedule => queue == null || schedule.queue === queue)
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Check every declared schedule, including any written into the configuration without
|
|
158
|
+
* `declareSchedule`, and refuse two under one id.
|
|
159
|
+
*
|
|
160
|
+
* @throws {ScheduleMisdeclared} / {UnknownQueue} / {UnknownJobName} for the first one that fails.
|
|
161
|
+
*/
|
|
162
|
+
export const assertSchedules = <C extends Config>(cfg: C): void => {
|
|
163
|
+
const seen = new Set<string>()
|
|
164
|
+
for (const schedule of schedulesOf(cfg)) {
|
|
165
|
+
assertSchedule(cfg, schedule)
|
|
166
|
+
if (seen.has(schedule.id)) {
|
|
167
|
+
throw new ScheduleMisdeclared(`${schedule.id}:duplicate`)
|
|
168
|
+
}
|
|
169
|
+
seen.add(schedule.id)
|
|
170
|
+
}
|
|
171
|
+
}
|
package/src/errors.ts
CHANGED
|
@@ -96,6 +96,20 @@ export class EnvelopeExpired extends QueueError {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
+
/**
|
|
100
|
+
* A schedule the broker could not carry out as written: no id, both or neither of `every` and
|
|
101
|
+
* `pattern`, an option that only means something for the other one, or a job option the broker
|
|
102
|
+
* owns for a scheduled run. The message names the schedule id and the reason.
|
|
103
|
+
*/
|
|
104
|
+
export class ScheduleMisdeclared extends QueueError {
|
|
105
|
+
public static override typeName = `${QueueError.typeName}ScheduleMisdeclared`
|
|
106
|
+
|
|
107
|
+
constructor(msg: string) {
|
|
108
|
+
super(`schedule-misdeclared:${msg}`)
|
|
109
|
+
this.type = ScheduleMisdeclared.typeName
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
99
113
|
ResilientError.registerErrorClass(QueueError)
|
|
100
114
|
ResilientError.registerErrorClass(QueueTimeout)
|
|
101
115
|
ResilientError.registerErrorClass(UnknownJob)
|
|
@@ -104,3 +118,4 @@ ResilientError.registerErrorClass(UnknownQueue)
|
|
|
104
118
|
ResilientError.registerErrorClass(QueueNotListening)
|
|
105
119
|
ResilientError.registerErrorClass(JobNotServed)
|
|
106
120
|
ResilientError.registerErrorClass(EnvelopeExpired)
|
|
121
|
+
ResilientError.registerErrorClass(ScheduleMisdeclared)
|
package/src/index.ts
CHANGED
package/src/protocol.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { EntrypointProtocolDeclaration, RequestOf, ResponseOf } from '@owlmeans/entrypoint'
|
|
2
2
|
import { isEntrypointProtocol } from '@owlmeans/entrypoint'
|
|
3
3
|
import { ResilientError } from '@owlmeans/error'
|
|
4
|
-
import { RouteProtocols } from '@owlmeans/route'
|
|
5
4
|
import { queueOf } from './config.js'
|
|
6
5
|
import { UnknownQueue } from './errors.js'
|
|
6
|
+
import { isQueueRoute, queueRouteOptions } from './route.js'
|
|
7
7
|
import type {
|
|
8
8
|
Config, Context, JobEnvelope, JobOptions, JobRecord, JobReply, QueueAppend,
|
|
9
9
|
} from './types.js'
|
|
@@ -17,13 +17,10 @@ const queueFor = (context: QueueContext, declaration: unknown): {
|
|
|
17
17
|
if (declaration == null || typeof declaration !== 'object' || !isEntrypointProtocol(declaration)) {
|
|
18
18
|
throw new UnknownQueue('protocol declaration required')
|
|
19
19
|
}
|
|
20
|
-
if (declaration.route
|
|
21
|
-
throw new UnknownQueue(`${declaration.alias}: not a
|
|
22
|
-
}
|
|
23
|
-
const queue = declaration.route.route.queue
|
|
24
|
-
if (queue == null) {
|
|
25
|
-
throw new UnknownQueue(`${declaration.alias}: route declares no queue`)
|
|
20
|
+
if (!isQueueRoute(declaration.route)) {
|
|
21
|
+
throw new UnknownQueue(`${declaration.alias}: not a queue protocol`)
|
|
26
22
|
}
|
|
23
|
+
const { queue } = queueRouteOptions(declaration.route)
|
|
27
24
|
const configured = queueOf(context.cfg, queue)
|
|
28
25
|
if (!configured.jobs.includes(declaration.alias)) {
|
|
29
26
|
throw new UnknownQueue(`${queue}:${declaration.alias}`)
|