@arki/journal 0.1.1 → 0.2.1
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 +18 -10
- package/dist/api.d.ts +40 -6
- package/dist/api.d.ts.map +1 -1
- package/dist/command.d.ts.map +1 -1
- package/dist/command.js +4 -0
- package/dist/command.js.map +1 -1
- package/dist/dot.d.ts +83 -41
- package/dist/dot.d.ts.map +1 -1
- package/dist/dot.js +111 -82
- package/dist/dot.js.map +1 -1
- package/dist/handlers.d.ts +22 -2
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +26 -12
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +12 -5
- package/dist/journal.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/worker.d.ts +12 -5
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +13 -7
- package/dist/worker.js.map +1 -1
- package/dist/write.js +1 -1
- package/dist/write.js.map +1 -1
- package/docs/agent-guide.md +23 -20
- package/llms.txt +1 -1
- package/package.json +2 -2
- package/src/api.ts +46 -4
- package/src/command.ts +3 -0
- package/src/dot.ts +203 -134
- package/src/handlers.ts +41 -19
- package/src/index.ts +4 -0
- package/src/journal.ts +16 -6
- package/src/types.ts +9 -0
- package/src/worker.ts +45 -13
- package/src/write.ts +1 -1
package/dist/dot.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
import { driven, driver, sliceOf } from '@arki/dot/feature';
|
|
1
2
|
import { DotPluginError, plugin, service } from '@arki/dot/plugin';
|
|
2
3
|
import { debugWorker } from './debug.js';
|
|
3
4
|
import { JournalError } from './errors.js';
|
|
4
|
-
import {
|
|
5
|
+
import { givenServices } from './handlers.js';
|
|
5
6
|
export const JOURNAL_ACTION_META_SCHEMA = '@arki/journal/action-meta@1';
|
|
6
|
-
export const JOURNAL_PLUGIN_ERROR_CODES = { badSlice: '
|
|
7
|
+
export const JOURNAL_PLUGIN_ERROR_CODES = { badSlice: 'ARKI_JOURNAL_PLUGIN_E001' };
|
|
7
8
|
function effectAction(effect) {
|
|
8
9
|
return {
|
|
9
10
|
id: `${effect.name}.run`,
|
|
@@ -15,14 +16,14 @@ function effectAction(effect) {
|
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
18
|
/**
|
|
18
|
-
* Declare a feature's projections
|
|
19
|
-
* (`
|
|
20
|
-
*
|
|
21
|
-
* `journal({ j, tables, features })` collects it.
|
|
19
|
+
* Declare a feature's projections, effects and taps
|
|
20
|
+
* (`feature('orders', { use: [journalHandlers({ projections, effects })] })`).
|
|
21
|
+
* `journal({ j, tables })` reads them from the feature value and composes the journal.
|
|
22
22
|
*
|
|
23
23
|
* An effect with needs (`j.effect(name, entity, { mailer: need<Mailer>() }, on)`) gets
|
|
24
|
-
* them from the booted services of this feature, by name
|
|
25
|
-
* each one in its own `needs`: the slice's `resolve` does not
|
|
24
|
+
* them from the booted services of this feature, by name, when `journalWorker()` runs it.
|
|
25
|
+
* The feature must declare each one in its own `needs`: the slice's `resolve` does not
|
|
26
|
+
* type-check otherwise, and throws at the feature's boot when the types were bypassed.
|
|
26
27
|
* Two features may use the same need name for two different services.
|
|
27
28
|
*
|
|
28
29
|
* Actions: one per effect. Projections add none: they run inside the write, not
|
|
@@ -33,12 +34,17 @@ export function journalHandlers(handlers) {
|
|
|
33
34
|
return {
|
|
34
35
|
key: 'journal',
|
|
35
36
|
actions: effects.map(effect => effectAction(effect)),
|
|
37
|
+
handlers: { projections, effects, taps },
|
|
36
38
|
// The kernel hands the feature's services over untyped, so they are read by name here.
|
|
37
|
-
resolve: (services) =>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
resolve: (services) => {
|
|
40
|
+
const given = isServices(services) ? services : {};
|
|
41
|
+
// Checked at the feature's boot, so a missing service never waits for the first job.
|
|
42
|
+
for (const effect of effects)
|
|
43
|
+
givenServices('effect', effect, given);
|
|
44
|
+
for (const tap of taps)
|
|
45
|
+
givenServices('tap', tap, given);
|
|
46
|
+
return { services: given };
|
|
47
|
+
},
|
|
42
48
|
};
|
|
43
49
|
}
|
|
44
50
|
const isServices = (value) => typeof value === 'object' && value !== null;
|
|
@@ -48,80 +54,74 @@ const isHandler = (value) => typeof value === 'object' &&
|
|
|
48
54
|
typeof value.name === 'string' &&
|
|
49
55
|
'run' in value &&
|
|
50
56
|
typeof value.run === 'function';
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
const isHandlerList = (value) => Array.isArray(value) && value.every(item => isHandler(item));
|
|
58
|
+
/** A slice's static `handlers` are read untyped from the feature, so their shape is checked here. */
|
|
59
|
+
function isJournalDeclarations(value) {
|
|
53
60
|
return (typeof value === 'object' &&
|
|
54
61
|
value !== null &&
|
|
55
62
|
'projections' in value &&
|
|
56
|
-
|
|
57
|
-
value.projections.every(item => isHandler(item)) &&
|
|
63
|
+
isHandlerList(value.projections) &&
|
|
58
64
|
'effects' in value &&
|
|
59
|
-
|
|
60
|
-
value.effects.every(item => isHandler(item)) &&
|
|
65
|
+
isHandlerList(value.effects) &&
|
|
61
66
|
'taps' in value &&
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
isHandlerList(value.taps));
|
|
68
|
+
}
|
|
69
|
+
function badSlice(feature, what) {
|
|
70
|
+
return new DotPluginError({
|
|
71
|
+
code: JOURNAL_PLUGIN_ERROR_CODES.badSlice,
|
|
72
|
+
message: `[journal] feature "${feature.name}" has a \`journal\` slice whose ${what}.`,
|
|
73
|
+
remediation: 'Declare the slice with journalHandlers({ projections, effects, taps }) from @arki/journal/dot.',
|
|
74
|
+
docsUrl: 'https://github.com/arki-labs/arki/blob/HEAD/packages/journal/docs/agent-guide.md#dot-boot-errors',
|
|
75
|
+
});
|
|
64
76
|
}
|
|
65
77
|
/**
|
|
66
78
|
* Throws when another handler of this kind already has the name, and names the
|
|
67
|
-
*
|
|
79
|
+
* features that hold the two. `j.compose` makes the same check, but it gets
|
|
68
80
|
* one flat list and cannot say which feature a handler came from.
|
|
69
81
|
*/
|
|
70
82
|
function claimName(kind, owners, name, feature) {
|
|
71
|
-
const owner = owners.get(name);
|
|
83
|
+
const owner = owners.get(`${kind}:${name}`);
|
|
72
84
|
if (owner !== undefined) {
|
|
73
|
-
const where = owner === feature ? `feature "${feature}", twice` : `features "${owner}" and "${feature}"`;
|
|
85
|
+
const where = owner === feature ? `feature "${feature.name}", twice` : `features "${owner.name}" and "${feature.name}"`;
|
|
74
86
|
throw new JournalError('BAD_DEFINITION', kind, name, `journal: duplicate ${kind} name "${name}" (${where})`);
|
|
75
87
|
}
|
|
76
|
-
owners.set(name
|
|
88
|
+
owners.set(`${kind}:${name}`, feature);
|
|
77
89
|
}
|
|
78
90
|
/**
|
|
79
|
-
* Read each feature's `journal` slice
|
|
80
|
-
*
|
|
91
|
+
* Read each feature's `journal` slice declarations, in feature order. Refuses a name
|
|
92
|
+
* that is listed twice. `owners` maps `effect:<name>` and `tap:<name>` (and
|
|
93
|
+
* `projection:<name>`) to the feature that lists it.
|
|
81
94
|
*/
|
|
82
|
-
function
|
|
95
|
+
function readDeclarations(features) {
|
|
83
96
|
const projections = [];
|
|
84
97
|
const effects = [];
|
|
85
98
|
const taps = [];
|
|
86
|
-
const
|
|
87
|
-
const effectOwners = new Map();
|
|
88
|
-
const tapOwners = new Map();
|
|
99
|
+
const owners = new Map();
|
|
89
100
|
for (const feature of features) {
|
|
90
|
-
const
|
|
91
|
-
const slice = typeof slices === 'object' && slices !== null && 'journal' in slices ? slices.journal : undefined;
|
|
101
|
+
const slice = feature.use.find(item => item.key === 'journal');
|
|
92
102
|
if (slice === undefined) {
|
|
93
|
-
debugWorker.debug('[journal] feature "{
|
|
94
|
-
|
|
103
|
+
debugWorker.debug('[journal] feature "{featureName}" did not contribute a journal slice', {
|
|
104
|
+
featureName: feature.name,
|
|
95
105
|
});
|
|
96
106
|
continue;
|
|
97
107
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
for (const { name } of slice.taps)
|
|
111
|
-
claimName('tap', tapOwners, name, feature.key);
|
|
112
|
-
projections.push(...slice.projections);
|
|
113
|
-
effects.push(...slice.effects);
|
|
114
|
-
taps.push(...slice.taps);
|
|
108
|
+
const declared = 'handlers' in slice ? slice.handlers : undefined;
|
|
109
|
+
if (!isJournalDeclarations(declared))
|
|
110
|
+
throw badSlice(feature, 'handlers are not lists of projections, effects and taps');
|
|
111
|
+
for (const { name } of declared.projections)
|
|
112
|
+
claimName('projection', owners, name, feature);
|
|
113
|
+
for (const { name } of declared.effects)
|
|
114
|
+
claimName('effect', owners, name, feature);
|
|
115
|
+
for (const { name } of declared.taps)
|
|
116
|
+
claimName('tap', owners, name, feature);
|
|
117
|
+
projections.push(...declared.projections);
|
|
118
|
+
effects.push(...declared.effects);
|
|
119
|
+
taps.push(...declared.taps);
|
|
115
120
|
}
|
|
116
|
-
return { projections, effects, taps };
|
|
121
|
+
return { declarations: { projections, effects, taps }, owners };
|
|
117
122
|
}
|
|
118
|
-
|
|
119
|
-
let composed;
|
|
120
|
-
let worker;
|
|
121
|
-
// Each feature token is a need, so the kernel boots the features first and refuses a missing one.
|
|
122
|
-
const featureNeeds = 'features' in options ? options.features.map(feature => [feature.key, feature]) : [];
|
|
123
|
+
function journalPlugin(build) {
|
|
123
124
|
const needs = {
|
|
124
|
-
...Object.fromEntries(featureNeeds),
|
|
125
125
|
db: service(),
|
|
126
126
|
};
|
|
127
127
|
return plugin({
|
|
@@ -131,29 +131,58 @@ export function journal(options) {
|
|
|
131
131
|
ctx.registerService('journal', 'custom');
|
|
132
132
|
ctx.declareProvides('journal');
|
|
133
133
|
},
|
|
134
|
-
boot(
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
134
|
+
boot: () => ({ journal: build() }),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
export function journal(options) {
|
|
138
|
+
if ('journal' in options) {
|
|
139
|
+
const composed = options.journal;
|
|
140
|
+
return journalPlugin(() => composed);
|
|
141
|
+
}
|
|
142
|
+
const { j, tables } = options;
|
|
143
|
+
return driven(features => journalPlugin(() =>
|
|
144
|
+
// `'worker'`: the effects' services exist only once the features boot, after this journal.
|
|
145
|
+
j.compose({ tables, ...readDeclarations(features).declarations, services: 'worker' })));
|
|
146
|
+
}
|
|
147
|
+
/** The services a feature's `journal` slice published at its boot. */
|
|
148
|
+
function sliceServices(ctx, feature) {
|
|
149
|
+
const payload = sliceOf(ctx, feature).journal;
|
|
150
|
+
if (typeof payload !== 'object' || payload === null || !('services' in payload) || !isServices(payload.services))
|
|
151
|
+
throw badSlice(feature, 'boot payload holds no services; it was not made by journalHandlers');
|
|
152
|
+
return payload.services;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The driving part, for `.serve()`: one worker between `start` and `stop`, for the
|
|
156
|
+
* journal that `journal(...)` published. Each effect and tap of a feature gets the
|
|
157
|
+
* services of that feature. A process that serves no worker still writes: its jobs
|
|
158
|
+
* wait for a process that does.
|
|
159
|
+
*/
|
|
160
|
+
export function journalWorker(options = {}) {
|
|
161
|
+
return driver(features => {
|
|
162
|
+
let worker;
|
|
163
|
+
return plugin({
|
|
164
|
+
name: 'journal-worker',
|
|
165
|
+
needs: { db: service(), journal: service() },
|
|
166
|
+
boot(ctx) {
|
|
167
|
+
const { owners } = readDeclarations(features);
|
|
168
|
+
const byFeature = new Map();
|
|
169
|
+
// Every owner listed a `journal` slice, so each has a slice record.
|
|
170
|
+
for (const feature of new Set(owners.values()))
|
|
171
|
+
byFeature.set(feature, sliceServices(ctx, feature));
|
|
172
|
+
const services = ({ kind, name }) => {
|
|
173
|
+
const owner = owners.get(`${kind}:${name}`);
|
|
174
|
+
return (owner === undefined ? undefined : byFeature.get(owner)) ?? {};
|
|
175
|
+
};
|
|
176
|
+
// Built at boot, not at start: a missing service fails the boot.
|
|
177
|
+
worker = ctx.journal.worker(ctx.db, { ...options, services });
|
|
178
|
+
},
|
|
179
|
+
async start() {
|
|
180
|
+
await worker?.start();
|
|
181
|
+
},
|
|
182
|
+
async stop() {
|
|
183
|
+
await worker?.stop();
|
|
184
|
+
},
|
|
185
|
+
});
|
|
157
186
|
});
|
|
158
187
|
}
|
|
159
188
|
//# sourceMappingURL=dot.js.map
|
package/dist/dot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../src/dot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dot.js","sourceRoot":"","sources":["../src/dot.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AnyEntity, DbHandle, Effect, EffectHandlers, EffectSchedule, Need, Needs, Projection, ProjectionHandlers, ProjectionOptions, Services, Tap, TapHandlers } from './types.js';
|
|
1
|
+
import type { AnyEntity, DbHandle, Effect, EffectHandlers, EffectSchedule, HandlerServices, Need, Needs, Projection, ProjectionHandlers, ProjectionOptions, Services, Tap, TapHandlers } from './types.js';
|
|
2
2
|
export declare function defineProjection<E extends AnyEntity<Meta>, Meta, Tx extends DbHandle>(name: string, entity: E | readonly E[], on: NoInfer<ProjectionHandlers<E, Meta, Tx>>, opts?: ProjectionOptions): Projection<Meta, Tx>;
|
|
3
3
|
/** Declare one thing an effect needs: `j.effect('order-mail', order, { mailer: need<Mailer>() }, { ... })`. */
|
|
4
4
|
export declare const need: <T>() => Need<T>;
|
|
@@ -14,13 +14,33 @@ export declare function tapFor<Meta, AppDb>(): {
|
|
|
14
14
|
<E extends AnyEntity<Meta>>(name: string, entity: E | readonly E[], on: NoInfer<TapHandlers<E, Meta, AppDb>>): Tap<Meta, AppDb>;
|
|
15
15
|
<E extends AnyEntity<Meta>, N extends Needs>(name: string, entity: E | readonly E[], needs: N, on: NoInfer<TapHandlers<E, Meta, AppDb, N>>): Tap<Meta, AppDb, N>;
|
|
16
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* The value of each need of one handler, read from `services` by name. `services` may hold more.
|
|
19
|
+
* Throws when one is missing: without this check the handler would start, and fail on `undefined`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function givenServices(kind: 'effect' | 'tap', handler: {
|
|
22
|
+
readonly name: string;
|
|
23
|
+
readonly needs: Needs;
|
|
24
|
+
}, services: Services): Services;
|
|
17
25
|
/** Give one tap its services, as `bindEffect` does for an effect. */
|
|
18
26
|
export declare function bindTap<Meta, AppDb>(tap: Tap<Meta, AppDb, Needs>, services: Services): Tap<Meta, AppDb>;
|
|
19
27
|
/**
|
|
20
28
|
* Give one effect its services. The result needs nothing more, so the worker can run it.
|
|
21
29
|
* `services` may hold more than this effect needs: each need is read by its name.
|
|
22
30
|
* This is the only place a need meets its value. `j.compose` calls it with the app's
|
|
23
|
-
* `services`;
|
|
31
|
+
* `services`; a worker calls it with the services it was given (`HandlerServices`).
|
|
24
32
|
*/
|
|
25
33
|
export declare function bindEffect<Meta, AppDb, Run>(effect: Effect<Meta, AppDb, Run, Needs>, services: Services): Effect<Meta, AppDb, Run>;
|
|
34
|
+
/**
|
|
35
|
+
* The effects and taps as they run: each bound to its services from `services`.
|
|
36
|
+
* A handler `j.compose` already bound needs nothing, so it gets nothing. Throws on the first
|
|
37
|
+
* missing service, so a worker refuses to start instead of failing job after job.
|
|
38
|
+
*/
|
|
39
|
+
export declare function bindHandlers<Meta, AppDb, Run>(handlers: {
|
|
40
|
+
readonly effects: readonly Effect<Meta, AppDb, Run, Needs>[];
|
|
41
|
+
readonly taps: readonly Tap<Meta, AppDb, Needs>[];
|
|
42
|
+
}, services: HandlerServices | undefined): {
|
|
43
|
+
readonly effects: readonly Effect<Meta, AppDb, Run>[];
|
|
44
|
+
readonly taps: readonly Tap<Meta, AppDb>[];
|
|
45
|
+
};
|
|
26
46
|
//# sourceMappingURL=handlers.d.ts.map
|
package/dist/handlers.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,QAAQ,EACR,MAAM,EAEN,cAAc,EACd,cAAc,EACd,IAAI,EAEJ,KAAK,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EAEjB,QAAQ,EACR,GAAG,EAEH,WAAW,EACZ,MAAM,YAAY,CAAC;AAsBpB,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,QAAQ,EACnF,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,EACxB,EAAE,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAC5C,IAAI,CAAC,EAAE,iBAAiB,GACvB,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAatB;AAKD,+GAA+G;AAC/G,eAAO,MAAM,IAAI,GAAI,CAAC,OAAK,IAAI,CAAC,CAAC,CAAS,CAAC;AA8C3C,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,KAAK,EAC5D,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,UAAU,GAAG,cAAc,CAAC,EACtE,QAAQ,EAAE,cAAc,CAAC,IAAI,CAAC,GAC7B,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CA4B7B;AAED,8GAA8G;AAC9G,wBAAgB,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG;KACxB,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,QACjC,MAAM,UACJ,CAAC,GAAG,SAAS,CAAC,EAAE,MACpB,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,GAC/C,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC;KACX,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,QAClD,MAAM,UACJ,CAAC,GAAG,SAAS,CAAC,EAAE,SACjB,CAAC,MACJ,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAClD,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;EAS/B;AA8BD,wGAAwG;AACxG,wBAAgB,MAAM,CAAC,IAAI,EAAE,KAAK;KACnB,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,QAC9B,MAAM,UACJ,CAAC,GAAG,SAAS,CAAC,EAAE,MACpB,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,GACvC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC;KACN,CAAC,SAAS,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,QAC/C,MAAM,UACJ,CAAC,GAAG,SAAS,CAAC,EAAE,SACjB,CAAC,MACJ,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAC1C,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;EASvB;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers.js
CHANGED
|
@@ -101,30 +101,44 @@ export function tapFor() {
|
|
|
101
101
|
}
|
|
102
102
|
return tap;
|
|
103
103
|
}
|
|
104
|
-
/**
|
|
105
|
-
|
|
104
|
+
/**
|
|
105
|
+
* The value of each need of one handler, read from `services` by name. `services` may hold more.
|
|
106
|
+
* Throws when one is missing: without this check the handler would start, and fail on `undefined`.
|
|
107
|
+
*/
|
|
108
|
+
export function givenServices(kind, handler, services) {
|
|
106
109
|
const given = {};
|
|
107
|
-
for (const key of Object.keys(
|
|
110
|
+
for (const key of Object.keys(handler.needs)) {
|
|
108
111
|
if (!Object.hasOwn(services, key) || services[key] === undefined)
|
|
109
|
-
throw new JournalError('BAD_DEFINITION',
|
|
112
|
+
throw new JournalError('BAD_DEFINITION', kind, handler.name, `journal: ${kind} "${handler.name}" needs "${key}", but no service with that name was given; pass it as j.compose({ services: { ${key} } }), or in a Dot app add it to the \`needs\` of the feature that lists this ${kind}`);
|
|
110
113
|
given[key] = services[key];
|
|
111
114
|
}
|
|
115
|
+
return given;
|
|
116
|
+
}
|
|
117
|
+
/** Give one tap its services, as `bindEffect` does for an effect. */
|
|
118
|
+
export function bindTap(tap, services) {
|
|
119
|
+
const given = givenServices('tap', tap, services);
|
|
112
120
|
return { ...tap, needs: {}, run: (event, ctx) => tap.run(event, { ...given, ...ctx }) };
|
|
113
121
|
}
|
|
114
122
|
/**
|
|
115
123
|
* Give one effect its services. The result needs nothing more, so the worker can run it.
|
|
116
124
|
* `services` may hold more than this effect needs: each need is read by its name.
|
|
117
125
|
* This is the only place a need meets its value. `j.compose` calls it with the app's
|
|
118
|
-
* `services`;
|
|
126
|
+
* `services`; a worker calls it with the services it was given (`HandlerServices`).
|
|
119
127
|
*/
|
|
120
128
|
export function bindEffect(effect, services) {
|
|
121
|
-
const given =
|
|
122
|
-
for (const key of Object.keys(effect.needs)) {
|
|
123
|
-
// Without this check the effect would start, and every job would fail on `undefined`.
|
|
124
|
-
if (!Object.hasOwn(services, key) || services[key] === undefined)
|
|
125
|
-
throw new JournalError('BAD_DEFINITION', 'effect', effect.name, `journal: effect "${effect.name}" needs "${key}", but no service with that name was given; pass it as j.compose({ services: { ${key} } }), or in a Dot app add it to the \`needs\` of the feature that lists this effect`);
|
|
126
|
-
given[key] = services[key];
|
|
127
|
-
}
|
|
129
|
+
const given = givenServices('effect', effect, services);
|
|
128
130
|
return withSchedule({ ...effect, needs: {}, run: (event, ctx) => effect.run(event, { ...given, ...ctx }) }, effect.schedule);
|
|
129
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* The effects and taps as they run: each bound to its services from `services`.
|
|
134
|
+
* A handler `j.compose` already bound needs nothing, so it gets nothing. Throws on the first
|
|
135
|
+
* missing service, so a worker refuses to start instead of failing job after job.
|
|
136
|
+
*/
|
|
137
|
+
export function bindHandlers(handlers, services) {
|
|
138
|
+
const of = (kind, name) => services?.({ kind, name }) ?? {};
|
|
139
|
+
return {
|
|
140
|
+
effects: handlers.effects.map(effect => bindEffect(effect, of('effect', effect.name))),
|
|
141
|
+
taps: handlers.taps.map(tap => bindTap(tap, of('tap', tap.name))),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
130
144
|
//# sourceMappingURL=handlers.js.map
|
package/dist/handlers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export { initJournal } from './journal.js';
|
|
2
2
|
export { need } from './handlers.js';
|
|
3
|
-
export type { Command, CommandContext, CommandRunner, Journal, JournalDefinitions, ReplayResult, RootCommandRunner, RunOptions, CallOptions, VerifyResult, ForgetResult, NextEvents, WriteInput, WriteOptions, WriteResult, } from './api.js';
|
|
3
|
+
export type { Command, CommandAuthorize, CommandContext, CommandOptions, CommandRunner, Journal, JournalDefinitions, ReplayResult, RootCommandRunner, RunOptions, CallOptions, VerifyResult, ForgetResult, NextEvents, WriteInput, WriteOptions, WriteResult, } from './api.js';
|
|
4
4
|
export { CommandError, JournalError, isCommandError, isJournalError } from './errors.js';
|
|
5
5
|
export type { CommandErrorCode, JournalErrorCode } from './errors.js';
|
|
6
6
|
export type { GuaranteedCreateKeys, EntityBuilder, OnReducerRow, OnOnlyEntityBuilder } from './entity.js';
|
|
7
|
-
export type { AnyEntity, AnyEventDef, CreateReducer, DbHandle, Effect, EffectContext, EffectHandlers, EntityDef, EntityId, EntityIdOf, EntityInfo, EntityTable, EventDef, EventOptions, Upcaster, UpcasterSteps, ProjectionOptions, Tap, TapContext, TapHandlers, Unlisten, WakeListener, CommandHookContext, EffectHookContext, EventsOf, IdTable, KeyColumn, Need, Needed, Needs, ReducerValues, OnReducer, Patch, Pending, PendingOf, Projection, ProjectionHandlers, Recorded, RecordedOf, Reducers, ReducerRow, RootDb, Row, Services, ServicesFor, TransactionSource, JournalWorker, StrandedJobs, } from './types.js';
|
|
7
|
+
export type { AnyEntity, AnyEventDef, CreateReducer, DbHandle, Effect, EffectContext, EffectHandlers, EntityDef, EntityId, EntityIdOf, EntityInfo, EntityTable, EventDef, EventOptions, Upcaster, UpcasterSteps, ProjectionOptions, Tap, TapContext, TapHandlers, Unlisten, WakeListener, CommandHookContext, EffectHookContext, EventsOf, IdTable, KeyColumn, Need, Needed, Needs, ReducerValues, OnReducer, Patch, Pending, PendingOf, Projection, ProjectionHandlers, Recorded, RecordedOf, Reducers, ReducerRow, RootDb, Row, Services, ServicesFor, HandlerRef, HandlerServices, TransactionSource, JournalWorker, StrandedJobs, } from './types.js';
|
|
8
8
|
export type { JournalTables } from './pg.js';
|
|
9
9
|
export type { Around, HookPoint } from './hooks.js';
|
|
10
10
|
export { listenOnPool } from './listen.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,YAAY,EACV,OAAO,EACP,cAAc,EACd,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1G,YAAY,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,QAAQ,EACR,MAAM,EACN,aAAa,EACb,cAAc,EACd,SAAS,EACT,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,GAAG,EACH,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,EACJ,MAAM,EACN,KAAK,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,GAAG,EACH,QAAQ,EACR,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,YAAY,EACV,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,aAAa,EACb,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACzF,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC1G,YAAY,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,QAAQ,EACR,MAAM,EACN,aAAa,EACb,cAAc,EACd,SAAS,EACT,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,GAAG,EACH,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,IAAI,EACJ,MAAM,EACN,KAAK,EACL,aAAa,EACb,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,kBAAkB,EAClB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,UAAU,EACV,MAAM,EACN,GAAG,EACH,QAAQ,EACR,WAAW,EACX,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAoBrC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyDzF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/journal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAW,kBAAkB,EAAqB,MAAM,UAAU,CAAC;AAG/E,OAAO,KAAK,EAGV,QAAQ,
|
|
1
|
+
{"version":3,"file":"journal.d.ts","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAW,kBAAkB,EAAqB,MAAM,UAAU,CAAC;AAG/E,OAAO,KAAK,EAGV,QAAQ,EAQR,MAAM,EAGN,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAkCpB;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW;;KAnBR,IAAI,SAAS,CAAC,CAAC,SAAS;;;;SAoBjC,EAAE,SAAS,iBAAiB,CAAC,EAAE,CAAC;;;aApBvB,IAAI,SAAS,CAAC,CAAC,SAAS;;;;aAsB/B,KAAK,SAAS,MAAM;;;iBAtBb,IAAI,SAAS,CAAC,CAAC,SAAS;;;;;;SAwBjC,KAAK,SAAS,MAAM;;;aAxBX,IAAI,SAAS,CAAC,CAAC,SAAS;;;;aA0B/B,EAAE,SAAS,iBAAiB,CAAC,EAAE,CAAC;;;iBA1BzB,IAAI,SAAS,CAAC,CAAC,SAAS;;;;;;CA4BtC,CAAC"}
|
package/dist/journal.js
CHANGED
|
@@ -11,7 +11,7 @@ import { createCommandRunner } from './command.js';
|
|
|
11
11
|
import { defineEntity } from './entity.js';
|
|
12
12
|
import { JournalError } from './errors.js';
|
|
13
13
|
import { defineEvent } from './event.js';
|
|
14
|
-
import { bindEffect, bindTap, defineProjection, effectFor, tapFor } from './handlers.js';
|
|
14
|
+
import { bindEffect, bindHandlers, bindTap, defineProjection, effectFor, tapFor } from './handlers.js';
|
|
15
15
|
import { createHistory } from './history.js';
|
|
16
16
|
import { createHookPoint } from './hooks.js';
|
|
17
17
|
import { createAdmin, createCatchUp, createDrain, createStrandedJobs, createTapDispatch, createWorkers, } from './worker.js';
|
|
@@ -61,13 +61,17 @@ function createInit(metaSchema) {
|
|
|
61
61
|
return {
|
|
62
62
|
event: defineEvent,
|
|
63
63
|
entity,
|
|
64
|
-
command: (name, input, handler) =>
|
|
64
|
+
command: (name, input, handler, options) => options?.authorize === undefined
|
|
65
|
+
? { name, input, handler }
|
|
66
|
+
: { name, input, handler, authorize: options.authorize },
|
|
65
67
|
projection: (name, entity, on, opts) => defineProjection(name, entity, on, opts),
|
|
66
68
|
effect: effectFor(),
|
|
67
69
|
tap: tapFor(),
|
|
68
70
|
compose: config => {
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
+
// `'worker'`: the handlers keep their needs, and each worker or drain gives the services.
|
|
72
|
+
const services = config.services === 'worker' ? undefined : (config.services ?? {});
|
|
73
|
+
const effects = (config.effects ?? []).map(effect => services === undefined ? effect : bindEffect(effect, services));
|
|
74
|
+
const taps = (config.taps ?? []).map(tap => (services === undefined ? tap : bindTap(tap, services)));
|
|
71
75
|
return createJournal(metaSchema, config.tables, config.projections ?? [], effects, taps);
|
|
72
76
|
},
|
|
73
77
|
};
|
|
@@ -81,7 +85,9 @@ function assertUniqueNames(kind, handlers) {
|
|
|
81
85
|
seen.add(name);
|
|
82
86
|
}
|
|
83
87
|
}
|
|
84
|
-
function createJournal(metaSchema, tables, projections,
|
|
88
|
+
function createJournal(metaSchema, tables, projections,
|
|
89
|
+
/** An effect or a tap may still have needs (`services: 'worker'`): only the worker runs them, with its `services`. */
|
|
90
|
+
effects, taps = []) {
|
|
85
91
|
assertUniqueNames('tap', taps);
|
|
86
92
|
const eventsSchema = getTableConfig(tables.events).schema;
|
|
87
93
|
const wakeChannel = eventsSchema === undefined ? 'journal_wake' : `${eventsSchema}_journal_wake`;
|
|
@@ -128,6 +134,7 @@ function createJournal(metaSchema, tables, projections, effects, taps = []) {
|
|
|
128
134
|
drain: (db, opts) => journal.drain(db, opts),
|
|
129
135
|
catchUp: (db, opts) => journal.catchUp(db, opts),
|
|
130
136
|
dispatch,
|
|
137
|
+
checkServices: services => void bindHandlers({ effects, taps }, services),
|
|
131
138
|
tapNames: taps.map(tap => tap.name),
|
|
132
139
|
});
|
|
133
140
|
const strandedJobs = createStrandedJobs({ tables, effectNames: effects.map(effect => effect.name) });
|
package/dist/journal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"journal.js","sourceRoot":"","sources":["../src/journal.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -303,6 +303,18 @@ export type Needed<N extends Needs> = {
|
|
|
303
303
|
};
|
|
304
304
|
/** Real services by name, as an app or a Dot feature hands them over. */
|
|
305
305
|
export type Services = Readonly<Record<string, unknown>>;
|
|
306
|
+
/** Names one effect or one tap. Effect names and tap names are two separate sets. */
|
|
307
|
+
export type HandlerRef = {
|
|
308
|
+
readonly kind: 'effect' | 'tap';
|
|
309
|
+
readonly name: string;
|
|
310
|
+
};
|
|
311
|
+
/**
|
|
312
|
+
* The services of each effect and tap, given where they run instead of where the journal
|
|
313
|
+
* is composed: `j.compose({ ..., services: 'worker' })`, then `journal.worker(db, { services })`.
|
|
314
|
+
* One function, so each handler can get its own services: two Dot features may use one need
|
|
315
|
+
* name for two different services.
|
|
316
|
+
*/
|
|
317
|
+
export type HandlerServices = (handler: HandlerRef) => Services;
|
|
306
318
|
type UnionToIntersection<U> = (U extends unknown ? (member: U) => void : never) extends (all: infer I) => void ? I : never;
|
|
307
319
|
/** The needs of each effect in a union. An effect that needs nothing adds nothing. */
|
|
308
320
|
type DeclaredNeeds<E> = E extends {
|