@nwire/cron 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cron.d.ts CHANGED
@@ -5,35 +5,23 @@
5
5
  * owning app. Fresh envelope per tick; correlation/causation propagate
6
6
  * through chained dispatches. Built on `croner`. For multi-process
7
7
  * deployments run cron in ONE process.
8
- *
9
- * See: architecture-sketch.html §05 (Adapters tier).
10
8
  */
11
9
  import { Cron } from "croner";
12
- import type { AppDefinition, App } from "@nwire/forge";
10
+ import type { ForgeApp } from "@nwire/forge";
13
11
  export type CronScheduleEntry = string | {
14
12
  readonly action: string;
15
13
  readonly input?: unknown;
16
14
  readonly tenant?: string;
17
15
  };
18
16
  export interface CronWireOptions {
19
- /** Apps to host. Cron locates which app owns each action by name. */
20
- readonly apps: readonly AppDefinition[];
21
- /** Pre-instantiated `App`s (for tests where stores are injected). */
22
- readonly appInstances?: readonly App[];
23
- /**
24
- * Schedule: keys are cron expressions, values are action names or full specs.
25
- * Examples: `0 2 * * *` (daily 02:00), `@hourly` (Croner shortcuts supported).
26
- */
17
+ readonly apps: readonly ForgeApp[];
27
18
  readonly schedule: Readonly<Record<string, CronScheduleEntry>>;
28
- /** Timezone (IANA) for evaluating cron expressions. Default: process default. */
29
19
  readonly timezone?: string;
30
20
  }
31
21
  export interface CronWire {
32
- readonly apps: readonly App[];
33
- /** Active Cron handles (for inspection / testing). */
22
+ readonly apps: readonly ForgeApp[];
34
23
  readonly schedules: readonly Cron[];
35
24
  start(): Promise<void>;
36
25
  stop(): Promise<void>;
37
26
  }
38
27
  export declare function createCronWire(options: CronWireOptions): CronWire;
39
- //# sourceMappingURL=cron.d.ts.map
package/dist/cron.js CHANGED
@@ -5,13 +5,11 @@
5
5
  * owning app. Fresh envelope per tick; correlation/causation propagate
6
6
  * through chained dispatches. Built on `croner`. For multi-process
7
7
  * deployments run cron in ONE process.
8
- *
9
- * See: architecture-sketch.html §05 (Adapters tier).
10
8
  */
11
9
  import { Cron } from "croner";
12
10
  import { seedEnvelope } from "@nwire/envelope";
13
11
  export function createCronWire(options) {
14
- const instances = options.appInstances?.slice() ?? options.apps.map((def) => def.create());
12
+ const instances = options.apps;
15
13
  const schedules = [];
16
14
  return {
17
15
  apps: instances,
@@ -20,16 +18,14 @@ export function createCronWire(options) {
20
18
  await Promise.all(instances.map((a) => a.start()));
21
19
  for (const [expr, entry] of Object.entries(options.schedule)) {
22
20
  const spec = typeof entry === "string" ? { action: entry, input: {} } : entry;
23
- const owner = instances.find((a) => actionNames(a).includes(spec.action));
24
- if (!owner) {
21
+ const located = locateAction(instances, spec.action);
22
+ if (!located) {
25
23
  throw new Error(`@nwire/cron: action "${spec.action}" not found in any registered app`);
26
24
  }
27
- const action = findAction(owner, spec.action);
28
- if (!action)
29
- continue;
25
+ const { owner, action } = located;
30
26
  const cron = new Cron(expr, { timezone: options.timezone, protect: true }, async () => {
31
27
  const envelope = seedEnvelope({ tenant: spec.tenant });
32
- await owner.runtime.dispatch(action, spec.input ?? {}, envelope);
28
+ await owner.dispatch(action, spec.input ?? {}, envelope);
33
29
  });
34
30
  schedules.push(cron);
35
31
  }
@@ -38,24 +34,15 @@ export function createCronWire(options) {
38
34
  for (const c of schedules)
39
35
  c.stop();
40
36
  schedules.length = 0;
37
+ await Promise.all(instances.map((a) => a.stop()));
41
38
  },
42
39
  };
43
40
  }
44
- function actionNames(app) {
45
- const names = [];
46
- for (const m of app.modules) {
47
- for (const a of m.manifest.actions ?? [])
48
- names.push(a.name);
49
- }
50
- return names;
51
- }
52
- function findAction(app, name) {
53
- for (const m of app.modules) {
54
- for (const a of m.manifest.actions ?? []) {
55
- if (a.name === name)
56
- return a;
57
- }
41
+ function locateAction(apps, name) {
42
+ for (const app of apps) {
43
+ const action = app.dispatcher().findActionByName(name);
44
+ if (action)
45
+ return { owner: app, action };
58
46
  }
59
47
  return undefined;
60
48
  }
61
- //# sourceMappingURL=cron.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nwire/cron",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "description": "Nwire — cron interface factory. Dispatch actions on a schedule (croner-backed).",
5
5
  "keywords": [
6
6
  "cron",
@@ -29,8 +29,8 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "croner": "^9.1.0",
32
- "@nwire/envelope": "0.9.1",
33
- "@nwire/forge": "0.9.1"
32
+ "@nwire/forge": "0.10.0",
33
+ "@nwire/envelope": "0.10.0"
34
34
  },
35
35
  "devDependencies": {
36
36
  "@types/node": "^22.19.9",
@@ -1 +0,0 @@
1
- {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,qEAAqE;IACrE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,EAAE,CAAC;IACvC;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC/D,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IAC9B,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,QAAQ,CAiCjE"}
package/dist/cron.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../src/cron.ts"],"names":[],"mappings":"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"}