@rotorsoft/act 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/act.d.ts +24 -0
  5. package/dist/act.d.ts.map +1 -0
  6. package/dist/act.js +136 -0
  7. package/dist/act.js.map +1 -0
  8. package/dist/adapters/InMemoryStore.d.ts +24 -0
  9. package/dist/adapters/InMemoryStore.d.ts.map +1 -0
  10. package/dist/adapters/InMemoryStore.js +125 -0
  11. package/dist/adapters/InMemoryStore.js.map +1 -0
  12. package/dist/builder.d.ts +30 -0
  13. package/dist/builder.d.ts.map +1 -0
  14. package/dist/builder.js +97 -0
  15. package/dist/builder.js.map +1 -0
  16. package/dist/config.d.ts +93 -0
  17. package/dist/config.d.ts.map +1 -0
  18. package/dist/config.js +41 -0
  19. package/dist/config.js.map +1 -0
  20. package/dist/event-sourcing.d.ts +5 -0
  21. package/dist/event-sourcing.d.ts.map +1 -0
  22. package/dist/event-sourcing.js +101 -0
  23. package/dist/event-sourcing.js.map +1 -0
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +27 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/ports.d.ts +17 -0
  29. package/dist/ports.d.ts.map +1 -0
  30. package/dist/ports.js +56 -0
  31. package/dist/ports.js.map +1 -0
  32. package/dist/types/action.d.ts +57 -0
  33. package/dist/types/action.d.ts.map +1 -0
  34. package/dist/types/action.js +2 -0
  35. package/dist/types/action.js.map +1 -0
  36. package/dist/types/errors.d.ts +41 -0
  37. package/dist/types/errors.d.ts.map +1 -0
  38. package/dist/types/errors.js +44 -0
  39. package/dist/types/errors.js.map +1 -0
  40. package/dist/types/index.d.ts +11 -0
  41. package/dist/types/index.d.ts.map +1 -0
  42. package/dist/types/index.js +17 -0
  43. package/dist/types/index.js.map +1 -0
  44. package/dist/types/ports.d.ts +16 -0
  45. package/dist/types/ports.d.ts.map +1 -0
  46. package/dist/types/ports.js +2 -0
  47. package/dist/types/ports.js.map +1 -0
  48. package/dist/types/reaction.d.ts +30 -0
  49. package/dist/types/reaction.d.ts.map +1 -0
  50. package/dist/types/reaction.js +2 -0
  51. package/dist/types/reaction.js.map +1 -0
  52. package/dist/types/registry.d.ts +23 -0
  53. package/dist/types/registry.d.ts.map +1 -0
  54. package/dist/types/registry.js +2 -0
  55. package/dist/types/registry.js.map +1 -0
  56. package/dist/types/schemas.d.ts +1046 -0
  57. package/dist/types/schemas.d.ts.map +1 -0
  58. package/dist/types/schemas.js +82 -0
  59. package/dist/types/schemas.js.map +1 -0
  60. package/dist/utils.d.ts +17 -0
  61. package/dist/utils.d.ts.map +1 -0
  62. package/dist/utils.js +73 -0
  63. package/dist/utils.js.map +1 -0
  64. package/package.json +32 -0
package/dist/ports.js ADDED
@@ -0,0 +1,56 @@
1
+ import pino from "pino";
2
+ import { InMemoryStore } from "./adapters/InMemoryStore";
3
+ import { config } from "./config";
4
+ export const ExitCodes = ["ERROR", "EXIT"];
5
+ export const logger = pino({
6
+ transport: config().env !== "production"
7
+ ? {
8
+ target: "pino-pretty",
9
+ options: {
10
+ ignore: "pid,hostname",
11
+ singleLine: config().logSingleLine,
12
+ colorize: true,
13
+ },
14
+ }
15
+ : undefined,
16
+ level: config().logLevel,
17
+ });
18
+ const adapters = new Map();
19
+ export function port(injector) {
20
+ return function (adapter) {
21
+ if (!adapters.has(injector.name)) {
22
+ const injected = injector(adapter);
23
+ adapters.set(injector.name, injected);
24
+ logger.info(`🔌 injected ${injector.name}:${injected.constructor.name}`);
25
+ }
26
+ return adapters.get(injector.name);
27
+ };
28
+ }
29
+ const disposers = [];
30
+ export async function disposeAndExit(code = "EXIT") {
31
+ // ignore when errors are caught in production
32
+ if (code === "ERROR" && config().env === "production")
33
+ return;
34
+ await Promise.all(disposers.map((disposer) => disposer()));
35
+ await Promise.all([...adapters.values()].reverse().map(async (adapter) => {
36
+ await adapter.dispose();
37
+ logger.info(`🔌 disposed ${adapter.constructor.name}`);
38
+ }));
39
+ adapters.clear();
40
+ config().env !== "test" && process.exit(code === "ERROR" ? 1 : 0);
41
+ }
42
+ /**
43
+ * Registers resource disposers that are triggered on process exit
44
+ * @param disposer the disposer function
45
+ * @returns a function that triggers all registered disposers and terminates the process
46
+ */
47
+ export function dispose(disposer) {
48
+ disposer && disposers.push(disposer);
49
+ return disposeAndExit;
50
+ }
51
+ // singleton ports
52
+ export const SNAP_EVENT = "__snapshot__";
53
+ export const store = port(function store(adapter) {
54
+ return adapter || new InMemoryStore();
55
+ });
56
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../src/ports.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,MAAM,CAAU,CAAC;AAGpD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EACP,MAAM,EAAE,CAAC,GAAG,KAAK,YAAY;QAC3B,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,MAAM,EAAE,cAAc;gBACtB,UAAU,EAAE,MAAM,EAAE,CAAC,aAAa;gBAClC,QAAQ,EAAE,IAAI;aACf;SACF;QACH,CAAC,CAAC,SAAS;IACf,KAAK,EAAE,MAAM,EAAE,CAAC,QAAQ;CACzB,CAAC,CAAC;AAGH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;AAC/C,MAAM,UAAU,IAAI,CAA0B,QAAwB;IACpE,OAAO,UAAU,OAAc;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,eAAe,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAS,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAe,EAAE,CAAC;AACjC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAiB,MAAM;IAC1D,8CAA8C;IAC9C,IAAI,IAAI,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC,GAAG,KAAK,YAAY;QAAE,OAAO;IAE9D,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,CAAC,GAAG,CACf,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACrD,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CACH,CAAC;IACF,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,MAAM,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CACrB,QAAmB;IAEnB,QAAQ,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,UAAU,GAAG,cAAc,CAAC;AACzC,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,OAAe;IACtD,OAAO,OAAO,IAAI,IAAI,aAAa,EAAE,CAAC;AACxC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { z, ZodSchema } from "zod";
2
+ import { ActorSchema, CommittedMetaSchema, EventMetaSchema, QuerySchema, TargetSchema } from "./schemas";
3
+ export type Actor = z.infer<typeof ActorSchema>;
4
+ export type Target = z.infer<typeof TargetSchema>;
5
+ export type EventMeta = z.infer<typeof EventMetaSchema>;
6
+ export type CommittedMeta = z.infer<typeof CommittedMetaSchema>;
7
+ export type Query = z.infer<typeof QuerySchema>;
8
+ export type Schema = Record<string, any>;
9
+ export type Schemas = Record<string, Schema>;
10
+ export type EmptySchema = Record<string, never>;
11
+ export type Patch<T> = {
12
+ [K in keyof T]?: T[K] extends Schema ? Patch<T[K]> : T[K];
13
+ };
14
+ export type Message<E extends Schemas, K extends keyof E> = {
15
+ readonly name: K;
16
+ readonly data: Readonly<E[K]>;
17
+ };
18
+ export type Committed<E extends Schemas, K extends keyof E> = Message<E, K> & CommittedMeta;
19
+ export type Snapshot<E extends Schemas, S extends Schema> = {
20
+ readonly state: S;
21
+ readonly event?: Committed<E, keyof E>;
22
+ readonly patches: number;
23
+ readonly snaps: number;
24
+ };
25
+ export type Invariant<S extends Schema> = {
26
+ description: string;
27
+ valid: (state: Readonly<S>, actor?: Actor) => boolean;
28
+ };
29
+ export type Emitted<E extends Schemas> = {
30
+ [K in keyof E]: readonly [K, Readonly<E[K]>];
31
+ }[keyof E];
32
+ export type StateSchemas<E extends Schemas, A extends Schemas, S extends Schema> = {
33
+ readonly events: {
34
+ [K in keyof E]: ZodSchema<E[K]>;
35
+ };
36
+ readonly actions: {
37
+ [K in keyof A]: ZodSchema<A[K]>;
38
+ };
39
+ readonly state: ZodSchema<S>;
40
+ };
41
+ export type ActionHandler<E extends Schemas, A extends Schemas, S extends Schema, K extends keyof A> = (action: Readonly<A[K]>, state: Readonly<S>, target: Target) => Promise<Emitted<E> | Emitted<E>[] | undefined>;
42
+ export type State<E extends Schemas, A extends Schemas, S extends Schema> = StateSchemas<E, A, S> & {
43
+ init: () => Readonly<S>;
44
+ patch: {
45
+ [K in keyof E]: (event: Committed<E, K>, state: Readonly<S>) => Readonly<Patch<S>>;
46
+ };
47
+ on: {
48
+ [K in keyof A]: ActionHandler<E, A, S, K>;
49
+ };
50
+ given?: {
51
+ [K in keyof A]?: Invariant<S>[];
52
+ };
53
+ snap?: (snapshot: Snapshot<E, S>) => boolean;
54
+ };
55
+ export type StateFactory<E extends Schemas = Schemas, A extends Schemas = Schemas, S extends Schema = Schema> = () => State<E, A, S>;
56
+ export type Infer<X> = X extends StateSchemas<infer E, infer A, infer S> ? State<E, A, S> : never;
57
+ //# sourceMappingURL=action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.d.ts","sourceRoot":"","sources":["../../src/types/action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","sourceRoot":"","sources":["../../src/types/action.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ import type { Message, Schema, Schemas, Target } from "./action";
2
+ /**
3
+ * Application error types
4
+ * - `ERR_VALIDATION` schema validation error
5
+ * - `ERR_INVARIANT` invariant validation error
6
+ * - `ERR_CONCURRENCY` optimistic concurrency validation error on commits
7
+ */
8
+ export declare const Errors: {
9
+ readonly ValidationError: "ERR_VALIDATION";
10
+ readonly InvariantError: "ERR_INVARIANT";
11
+ readonly ConcurrencyError: "ERR_CONCURRENCY";
12
+ };
13
+ export declare class ValidationError extends Error {
14
+ readonly target: string;
15
+ readonly payload: any;
16
+ readonly details: any;
17
+ constructor(target: string, payload: any, details: any);
18
+ }
19
+ export declare class InvariantError extends Error {
20
+ readonly details: {
21
+ name: string;
22
+ payload: Schema;
23
+ target: Readonly<{
24
+ stream: string;
25
+ actor: Readonly<{
26
+ id: string;
27
+ name: string;
28
+ }>;
29
+ expectedVersion?: number | undefined;
30
+ }>;
31
+ description: string;
32
+ };
33
+ constructor(name: string, payload: Schema, target: Target, description: string);
34
+ }
35
+ export declare class ConcurrencyError extends Error {
36
+ readonly lastVersion: number;
37
+ readonly events: Message<Schemas, keyof Schemas>[];
38
+ readonly expectedVersion: number;
39
+ constructor(lastVersion: number, events: Message<Schemas, keyof Schemas>[], expectedVersion: number);
40
+ }
41
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,qBAAa,eAAgB,SAAQ,KAAK;aAEtB,MAAM,EAAE,MAAM;aACd,OAAO,EAAE,GAAG;aACZ,OAAO,EAAE,GAAG;gBAFZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,EACZ,OAAO,EAAE,GAAG;CAK/B;AAED,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,OAAO;;;;;;;;;;;;MAAC;gBAEtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM;CAMtB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,WAAW,EAAE,MAAM;aACnB,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE;aACzC,eAAe,EAAE,MAAM;gBAFvB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE,EACzC,eAAe,EAAE,MAAM;CAS1C"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Application error types
3
+ * - `ERR_VALIDATION` schema validation error
4
+ * - `ERR_INVARIANT` invariant validation error
5
+ * - `ERR_CONCURRENCY` optimistic concurrency validation error on commits
6
+ */
7
+ export const Errors = {
8
+ ValidationError: "ERR_VALIDATION",
9
+ InvariantError: "ERR_INVARIANT",
10
+ ConcurrencyError: "ERR_CONCURRENCY",
11
+ };
12
+ export class ValidationError extends Error {
13
+ target;
14
+ payload;
15
+ details;
16
+ constructor(target, payload, details) {
17
+ super(`Invalid ${target} payload`);
18
+ this.target = target;
19
+ this.payload = payload;
20
+ this.details = details;
21
+ this.name = Errors.ValidationError;
22
+ }
23
+ }
24
+ export class InvariantError extends Error {
25
+ details;
26
+ constructor(name, payload, target, description) {
27
+ super(`${name} failed invariant: ${description}`);
28
+ this.name = Errors.InvariantError;
29
+ this.details = { name, payload, target, description };
30
+ }
31
+ }
32
+ export class ConcurrencyError extends Error {
33
+ lastVersion;
34
+ events;
35
+ expectedVersion;
36
+ constructor(lastVersion, events, expectedVersion) {
37
+ super(`Concurrency error committing event "${events.at(0)?.name}". Expected version ${expectedVersion} but found version ${lastVersion}.`);
38
+ this.lastVersion = lastVersion;
39
+ this.events = events;
40
+ this.expectedVersion = expectedVersion;
41
+ this.name = Errors.ConcurrencyError;
42
+ }
43
+ }
44
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/types/errors.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,eAAe,EAAE,gBAAgB;IACjC,cAAc,EAAE,eAAe;IAC/B,gBAAgB,EAAE,iBAAiB;CAC3B,CAAC;AAEX,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IACA;IACA;IAHlB,YACkB,MAAc,EACd,OAAY,EACZ,OAAY;QAE5B,KAAK,CAAC,WAAW,MAAM,UAAU,CAAC,CAAC;QAJnB,WAAM,GAAN,MAAM,CAAQ;QACd,YAAO,GAAP,OAAO,CAAK;QACZ,YAAO,GAAP,OAAO,CAAK;QAG5B,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,OAAO,CAAC;IACxB,YACE,IAAY,EACZ,OAAe,EACf,MAAc,EACd,WAAmB;QAEnB,KAAK,CAAC,GAAG,IAAI,sBAAsB,WAAW,EAAE,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAEvB;IACA;IACA;IAHlB,YACkB,WAAmB,EACnB,MAAyC,EACzC,eAAuB;QAEvC,KAAK,CACH,uCACE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAChB,uBAAuB,eAAe,sBAAsB,WAAW,GAAG,CAC3E,CAAC;QARc,gBAAW,GAAX,WAAW,CAAQ;QACnB,WAAM,GAAN,MAAM,CAAmC;QACzC,oBAAe,GAAf,eAAe,CAAQ;QAOvC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,gBAAgB,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ export type * from "./action";
2
+ export * from "./errors";
3
+ export type * from "./ports";
4
+ export type * from "./reaction";
5
+ export type * from "./registry";
6
+ export * from "./schemas";
7
+ export declare const Environments: readonly ["development", "test", "staging", "production"];
8
+ export type Environment = (typeof Environments)[number];
9
+ export declare const LogLevels: readonly ["fatal", "error", "warn", "info", "debug", "trace"];
10
+ export type LogLevel = (typeof LogLevels)[number];
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,mBAAmB,UAAU,CAAC;AAC9B,cAAc,UAAU,CAAC;AACzB,mBAAmB,SAAS,CAAC;AAC7B,mBAAmB,YAAY,CAAC;AAChC,mBAAmB,YAAY,CAAC;AAChC,cAAc,WAAW,CAAC;AAE1B,eAAO,MAAM,YAAY,2DAKf,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAExD,eAAO,MAAM,SAAS,+DAOZ,CAAC;AACX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export * from "./errors";
2
+ export * from "./schemas";
3
+ export const Environments = [
4
+ "development",
5
+ "test",
6
+ "staging",
7
+ "production",
8
+ ];
9
+ export const LogLevels = [
10
+ "fatal",
11
+ "error",
12
+ "warn",
13
+ "info",
14
+ "debug",
15
+ "trace",
16
+ ];
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,UAAU,CAAC;AAIzB,cAAc,WAAW,CAAC;AAE1B,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,MAAM;IACN,SAAS;IACT,YAAY;CACJ,CAAC;AAGX,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;CACC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Committed, EventMeta, Message, Query, Schemas } from "./action";
2
+ import type { Fetch, Lease } from "./reaction";
3
+ export type Disposer = () => Promise<void>;
4
+ export type Disposable = {
5
+ dispose: Disposer;
6
+ };
7
+ export interface Store extends Disposable {
8
+ seed: () => Promise<void>;
9
+ drop: () => Promise<void>;
10
+ commit: <E extends Schemas>(stream: string, msgs: Message<E, keyof E>[], meta: EventMeta, expectedVersion?: number) => Promise<Committed<E, keyof E>[]>;
11
+ query: <E extends Schemas>(callback: (event: Committed<E, keyof E>) => void, query?: Query, withSnaps?: boolean) => Promise<number>;
12
+ fetch: <E extends Schemas>(limit: number) => Promise<Fetch<E>>;
13
+ lease: (leases: Lease[]) => Promise<Lease[]>;
14
+ ack: (leases: Lease[]) => Promise<void>;
15
+ }
16
+ //# sourceMappingURL=ports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/types/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAC9E,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3C,MAAM,MAAM,UAAU,GAAG;IAAE,OAAO,EAAE,QAAQ,CAAA;CAAE,CAAC;AAE/C,MAAM,WAAW,KAAM,SAAQ,UAAU;IACvC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAG1B,MAAM,EAAE,CAAC,CAAC,SAAS,OAAO,EACxB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,EAC3B,IAAI,EAAE,SAAS,EACf,eAAe,CAAC,EAAE,MAAM,KACrB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,CAAC,SAAS,OAAO,EACvB,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,IAAI,EAChD,KAAK,CAAC,EAAE,KAAK,EACb,SAAS,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,MAAM,CAAC,CAAC;IAGrB,KAAK,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7C,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ports.js","sourceRoot":"","sources":["../../src/types/ports.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { Committed, Schema, Schemas, Snapshot } from "./action";
2
+ export type ReactionHandler<E extends Schemas, K extends keyof E> = (event: Committed<E, K>, stream: string) => Promise<Snapshot<E, Schema> | void>;
3
+ export type ReactionResolver<E extends Schemas, K extends keyof E> = ((event: Committed<E, K>) => string | undefined) | string;
4
+ export type ReactionOptions = {
5
+ readonly blockOnError: boolean;
6
+ readonly maxRetries: number;
7
+ readonly retryDelayMs: number;
8
+ };
9
+ export type Reaction<E extends Schemas, K extends keyof E = keyof E> = {
10
+ readonly handler: ReactionHandler<E, K>;
11
+ readonly resolver: ReactionResolver<E, K>;
12
+ readonly options: ReactionOptions;
13
+ };
14
+ export type ReactionPayload<E extends Schemas> = Reaction<E> & {
15
+ readonly event: Committed<E, keyof E>;
16
+ };
17
+ export type Fetch<E extends Schemas> = {
18
+ streams: string[];
19
+ events: Committed<E, keyof E>[];
20
+ };
21
+ export type Lease = {
22
+ stream: string;
23
+ by: string;
24
+ at: number;
25
+ retry: number;
26
+ block: boolean;
27
+ error?: unknown;
28
+ count?: number;
29
+ };
30
+ //# sourceMappingURL=reaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reaction.d.ts","sourceRoot":"","sources":["../../src/types/reaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAErE,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAClE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,KACX,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AAEzC,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,IAC7D,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC,GAChD,MAAM,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI;IACrE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,OAAO,IAAI;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reaction.js","sourceRoot":"","sources":["../../src/types/reaction.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { z, ZodType } from "zod";
2
+ import type { CommittedMeta, Schema, Schemas, State } from "./action";
3
+ import type { Reaction } from "./reaction";
4
+ export type EventRegister<E extends Schemas> = {
5
+ [K in keyof E]: {
6
+ schema: ZodType<E[K]>;
7
+ reactions: Map<string, Reaction<E, K>>;
8
+ };
9
+ };
10
+ export type SchemaRegister<A> = {
11
+ [K in keyof A]: Schema;
12
+ };
13
+ export type Registry<E extends Schemas, A extends Schemas, S extends SchemaRegister<A>> = {
14
+ readonly actions: {
15
+ [K in keyof A]: State<E, A, S[K]>;
16
+ };
17
+ readonly events: EventRegister<E>;
18
+ };
19
+ export type AsCommitted<R extends EventRegister<any>, K extends keyof R> = {
20
+ readonly name: K;
21
+ readonly data: z.infer<R[K]["schema"]>;
22
+ } & CommittedMeta;
23
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/types/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,IAAI;KAC5C,CAAC,IAAI,MAAM,CAAC,GAAG;QACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KACxC;CACF,CAAC;AAEF,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM;CAAE,CAAC;AAE3D,MAAM,MAAM,QAAQ,CAClB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,OAAO,EACjB,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,IACzB;IACF,QAAQ,CAAC,OAAO,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI;IACzE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;CACxC,GAAG,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/types/registry.ts"],"names":[],"mappings":""}