@bgord/bun 1.12.11 → 1.14.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/event-finder-noop.adapter.d.ts +9 -0
- package/dist/event-finder-noop.adapter.d.ts.map +1 -0
- package/dist/event-finder-noop.adapter.js +10 -0
- package/dist/event-finder-noop.adapter.js.map +1 -0
- package/dist/event-finder.port.d.ts +6 -0
- package/dist/event-finder.port.d.ts.map +1 -0
- package/dist/event-finder.port.js +2 -0
- package/dist/event-finder.port.js.map +1 -0
- package/dist/event-inserter-noop.adapter.d.ts +6 -0
- package/dist/event-inserter-noop.adapter.d.ts.map +1 -0
- package/dist/event-inserter-noop.adapter.js +6 -0
- package/dist/event-inserter-noop.adapter.js.map +1 -0
- package/dist/event-inserter.port.d.ts +5 -0
- package/dist/event-inserter.port.d.ts.map +1 -0
- package/dist/event-inserter.port.js +2 -0
- package/dist/event-inserter.port.js.map +1 -0
- package/dist/event-revision-assigner.adapter.d.ts +7 -0
- package/dist/event-revision-assigner.adapter.d.ts.map +1 -0
- package/dist/event-revision-assigner.adapter.js +7 -0
- package/dist/event-revision-assigner.adapter.js.map +1 -0
- package/dist/event-revision-assigner.port.d.ts +5 -0
- package/dist/event-revision-assigner.port.d.ts.map +1 -0
- package/dist/event-revision-assigner.port.js +2 -0
- package/dist/event-revision-assigner.port.js.map +1 -0
- package/dist/event-serializer-collecting.adapter.d.ts +8 -0
- package/dist/event-serializer-collecting.adapter.d.ts.map +1 -0
- package/dist/event-serializer-collecting.adapter.js +13 -0
- package/dist/event-serializer-collecting.adapter.js.map +1 -0
- package/dist/event-serializer-json.adapter.d.ts +6 -0
- package/dist/event-serializer-json.adapter.d.ts.map +1 -0
- package/dist/event-serializer-json.adapter.js +9 -0
- package/dist/event-serializer-json.adapter.js.map +1 -0
- package/dist/event-serializer.port.d.ts +5 -0
- package/dist/event-serializer.port.d.ts.map +1 -0
- package/dist/event-serializer.port.js +2 -0
- package/dist/event-serializer.port.js.map +1 -0
- package/dist/event-store-collecting.adapter.d.ts +10 -0
- package/dist/event-store-collecting.adapter.d.ts.map +1 -0
- package/dist/event-store-collecting.adapter.js +11 -0
- package/dist/event-store-collecting.adapter.js.map +1 -0
- package/dist/event-store-dispatching.adapter.d.ts +17 -0
- package/dist/event-store-dispatching.adapter.d.ts.map +1 -0
- package/dist/event-store-dispatching.adapter.js +15 -0
- package/dist/event-store-dispatching.adapter.js.map +1 -0
- package/dist/event-store-noop.adapter.d.ts +9 -0
- package/dist/event-store-noop.adapter.d.ts.map +1 -0
- package/dist/event-store-noop.adapter.js +9 -0
- package/dist/event-store-noop.adapter.js.map +1 -0
- package/dist/event-store.adapter.d.ts +20 -0
- package/dist/event-store.adapter.d.ts.map +1 -0
- package/dist/event-store.adapter.js +27 -0
- package/dist/event-store.adapter.js.map +1 -0
- package/dist/event-store.port.d.ts +8 -0
- package/dist/event-store.port.d.ts.map +1 -0
- package/dist/event-store.port.js +2 -0
- package/dist/event-store.port.js.map +1 -0
- package/dist/event-validator-registry-zod.adapter.d.ts +24 -0
- package/dist/event-validator-registry-zod.adapter.d.ts.map +1 -0
- package/dist/event-validator-registry-zod.adapter.js +25 -0
- package/dist/event-validator-registry-zod.adapter.js.map +1 -0
- package/dist/event-validator-registry.port.d.ts +7 -0
- package/dist/event-validator-registry.port.d.ts.map +1 -0
- package/dist/event-validator-registry.port.js +2 -0
- package/dist/event-validator-registry.port.js.map +1 -0
- package/dist/event.types.d.ts +13 -14
- package/dist/event.types.d.ts.map +1 -1
- package/dist/index.d.ts +22 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -13
- package/dist/index.js.map +1 -1
- package/dist/message-handler-bare.strategy.d.ts +8 -0
- package/dist/message-handler-bare.strategy.d.ts.map +1 -0
- package/dist/message-handler-bare.strategy.js +6 -0
- package/dist/message-handler-bare.strategy.js.map +1 -0
- package/dist/message-handler-noop.strategy.d.ts +8 -0
- package/dist/message-handler-noop.strategy.d.ts.map +1 -0
- package/dist/message-handler-noop.strategy.js +6 -0
- package/dist/message-handler-noop.strategy.js.map +1 -0
- package/dist/message-handler-with-logger.strategy.d.ts +17 -0
- package/dist/message-handler-with-logger.strategy.d.ts.map +1 -0
- package/dist/{event-handler-with-logger.strategy.js → message-handler-with-logger.strategy.js} +7 -7
- package/dist/message-handler-with-logger.strategy.js.map +1 -0
- package/dist/message-handler.strategy.d.ts +7 -0
- package/dist/message-handler.strategy.d.ts.map +1 -0
- package/dist/message-handler.strategy.js +2 -0
- package/dist/message-handler.strategy.js.map +1 -0
- package/dist/modules/preferences/command-handlers/handleSetUserLanguageCommand.d.ts +2 -2
- package/dist/modules/preferences/command-handlers/handleSetUserLanguageCommand.d.ts.map +1 -1
- package/dist/modules/system/services/passage-of-time-hourly.service.d.ts +2 -2
- package/dist/modules/system/services/passage-of-time-hourly.service.d.ts.map +1 -1
- package/dist/modules/system/services/passage-of-time-minute.service.d.ts +2 -2
- package/dist/modules/system/services/passage-of-time-minute.service.d.ts.map +1 -1
- package/dist/security-countermeasure-ban.strategy.d.ts +2 -2
- package/dist/security-countermeasure-ban.strategy.d.ts.map +1 -1
- package/dist/sse-hono.handler.d.ts +20 -0
- package/dist/sse-hono.handler.d.ts.map +1 -0
- package/dist/sse-hono.handler.js +35 -0
- package/dist/sse-hono.handler.js.map +1 -0
- package/dist/sse-registry-collecting.adapter.d.ts +6 -6
- package/dist/sse-registry-collecting.adapter.d.ts.map +1 -1
- package/dist/sse-registry-collecting.adapter.js +4 -4
- package/dist/sse-registry-collecting.adapter.js.map +1 -1
- package/dist/sse-registry-noop.adapter.d.ts +5 -5
- package/dist/sse-registry-noop.adapter.d.ts.map +1 -1
- package/dist/sse-registry-noop.adapter.js +3 -3
- package/dist/sse-registry-noop.adapter.js.map +1 -1
- package/dist/sse-registry-with-logger.adapter.d.ts +5 -5
- package/dist/sse-registry-with-logger.adapter.d.ts.map +1 -1
- package/dist/sse-registry-with-logger.adapter.js +11 -11
- package/dist/sse-registry-with-logger.adapter.js.map +1 -1
- package/dist/sse-registry.adapter.d.ts +6 -6
- package/dist/sse-registry.adapter.d.ts.map +1 -1
- package/dist/sse-registry.adapter.js +10 -10
- package/dist/sse-registry.adapter.js.map +1 -1
- package/dist/sse-registry.port.d.ts +5 -4
- package/dist/sse-registry.port.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/readme.md +21 -12
- package/src/event-finder-noop.adapter.ts +14 -0
- package/src/event-finder.port.ts +9 -0
- package/src/event-inserter-noop.adapter.ts +10 -0
- package/src/event-inserter.port.ts +5 -0
- package/src/event-revision-assigner.adapter.ts +13 -0
- package/src/event-revision-assigner.port.ts +8 -0
- package/src/event-serializer-collecting.adapter.ts +19 -0
- package/src/event-serializer-json.adapter.ts +11 -0
- package/src/event-serializer.port.ts +4 -0
- package/src/event-store-collecting.adapter.ts +21 -0
- package/src/event-store-dispatching.adapter.ts +29 -0
- package/src/event-store-noop.adapter.ts +17 -0
- package/src/event-store.adapter.ts +49 -0
- package/src/event-store.port.ts +12 -0
- package/src/event-validator-registry-zod.adapter.ts +47 -0
- package/src/event-validator-registry.port.ts +7 -0
- package/src/event.types.ts +12 -15
- package/src/index.ts +22 -13
- package/src/message-handler-bare.strategy.ts +11 -0
- package/src/message-handler-noop.strategy.ts +11 -0
- package/src/message-handler-with-logger.strategy.ts +32 -0
- package/src/message-handler.strategy.ts +8 -0
- package/src/modules/preferences/command-handlers/handleSetUserLanguageCommand.ts +2 -2
- package/src/modules/system/services/passage-of-time-hourly.service.ts +2 -2
- package/src/modules/system/services/passage-of-time-minute.service.ts +2 -2
- package/src/security-countermeasure-ban.strategy.ts +2 -2
- package/src/sse-hono.handler.ts +52 -0
- package/src/sse-registry-collecting.adapter.ts +7 -7
- package/src/sse-registry-noop.adapter.ts +5 -5
- package/src/sse-registry-with-logger.adapter.ts +13 -13
- package/src/sse-registry.adapter.ts +11 -11
- package/src/sse-registry.port.ts +6 -4
- package/dist/dispatching-event-store.d.ts +0 -15
- package/dist/dispatching-event-store.d.ts.map +0 -1
- package/dist/dispatching-event-store.js +0 -16
- package/dist/dispatching-event-store.js.map +0 -1
- package/dist/event-handler-bare.strategy.d.ts +0 -6
- package/dist/event-handler-bare.strategy.d.ts.map +0 -1
- package/dist/event-handler-bare.strategy.js +0 -6
- package/dist/event-handler-bare.strategy.js.map +0 -1
- package/dist/event-handler-noop.strategy.d.ts +0 -6
- package/dist/event-handler-noop.strategy.d.ts.map +0 -1
- package/dist/event-handler-noop.strategy.js +0 -6
- package/dist/event-handler-noop.strategy.js.map +0 -1
- package/dist/event-handler-with-logger.strategy.d.ts +0 -15
- package/dist/event-handler-with-logger.strategy.d.ts.map +0 -1
- package/dist/event-handler-with-logger.strategy.js.map +0 -1
- package/dist/event-handler.strategy.d.ts +0 -5
- package/dist/event-handler.strategy.d.ts.map +0 -1
- package/dist/event-handler.strategy.js +0 -2
- package/dist/event-handler.strategy.js.map +0 -1
- package/dist/event-store-like.types.d.ts +0 -5
- package/dist/event-store-like.types.d.ts.map +0 -1
- package/dist/event-store-like.types.js +0 -2
- package/dist/event-store-like.types.js.map +0 -1
- package/dist/event-store.d.ts +0 -22
- package/dist/event-store.d.ts.map +0 -1
- package/dist/event-store.js +0 -37
- package/dist/event-store.js.map +0 -1
- package/dist/sse-connection-hono.adapter.d.ts +0 -19
- package/dist/sse-connection-hono.adapter.d.ts.map +0 -1
- package/dist/sse-connection-hono.adapter.js +0 -38
- package/dist/sse-connection-hono.adapter.js.map +0 -1
- package/dist/sse-connection-hono.handler.d.ts +0 -17
- package/dist/sse-connection-hono.handler.d.ts.map +0 -1
- package/dist/sse-connection-hono.handler.js +0 -19
- package/dist/sse-connection-hono.handler.js.map +0 -1
- package/dist/sse-connection-noop.adapter.d.ts +0 -7
- package/dist/sse-connection-noop.adapter.d.ts.map +0 -1
- package/dist/sse-connection-noop.adapter.js +0 -5
- package/dist/sse-connection-noop.adapter.js.map +0 -1
- package/dist/sse-connection-with-logger.adapter.d.ts +0 -16
- package/dist/sse-connection-with-logger.adapter.d.ts.map +0 -1
- package/dist/sse-connection-with-logger.adapter.js +0 -27
- package/dist/sse-connection-with-logger.adapter.js.map +0 -1
- package/dist/sse-connection.port.d.ts +0 -6
- package/dist/sse-connection.port.d.ts.map +0 -1
- package/dist/sse-connection.port.js +0 -2
- package/dist/sse-connection.port.js.map +0 -1
- package/src/dispatching-event-store.ts +0 -34
- package/src/event-handler-bare.strategy.ts +0 -8
- package/src/event-handler-noop.strategy.ts +0 -8
- package/src/event-handler-with-logger.strategy.ts +0 -29
- package/src/event-handler.strategy.ts +0 -5
- package/src/event-store-like.types.ts +0 -5
- package/src/event-store.ts +0 -64
- package/src/sse-connection-hono.adapter.ts +0 -49
- package/src/sse-connection-hono.handler.ts +0 -22
- package/src/sse-connection-noop.adapter.ts +0 -8
- package/src/sse-connection-with-logger.adapter.ts +0 -34
- package/src/sse-connection.port.ts +0 -7
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { CorrelationStorage } from "./correlation-storage.service";
|
|
2
|
-
export class SseConnectionWithLoggerAdapter {
|
|
3
|
-
deps;
|
|
4
|
-
base = { component: "infra", operation: "sse_connection" };
|
|
5
|
-
constructor(deps) {
|
|
6
|
-
this.deps = deps;
|
|
7
|
-
}
|
|
8
|
-
async send(message) {
|
|
9
|
-
this.deps.Logger.debug({
|
|
10
|
-
message: `${message.name} sent`,
|
|
11
|
-
metadata: message,
|
|
12
|
-
correlationId: CorrelationStorage.get(),
|
|
13
|
-
...this.base,
|
|
14
|
-
});
|
|
15
|
-
await this.deps.inner.send(message);
|
|
16
|
-
}
|
|
17
|
-
close(callback) {
|
|
18
|
-
this.deps.Logger.debug({
|
|
19
|
-
message: "SSE connection closed",
|
|
20
|
-
metadata: {},
|
|
21
|
-
correlationId: CorrelationStorage.get(),
|
|
22
|
-
...this.base,
|
|
23
|
-
});
|
|
24
|
-
this.deps.inner.close(callback);
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=sse-connection-with-logger.adapter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-connection-with-logger.adapter.js","sourceRoot":"","sources":["../src/sse-connection-with-logger.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAOnE,MAAM,OAAO,8BAA8B;IAGZ;IAFZ,IAAI,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAE5E,YAA6B,IAA4B;QAA5B,SAAI,GAAJ,IAAI,CAAwB;IAAG,CAAC;IAE7D,KAAK,CAAC,IAAI,CAAqB,OAAU;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACrB,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO;YAC/B,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,kBAAkB,CAAC,GAAG,EAAE;YACvC,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,QAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YACrB,OAAO,EAAE,uBAAuB;YAChC,QAAQ,EAAE,EAAE;YACZ,aAAa,EAAE,kBAAkB,CAAC,GAAG,EAAE;YACvC,GAAG,IAAI,CAAC,IAAI;SACb,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-connection.port.d.ts","sourceRoot":"","sources":["../src/sse-connection.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,OAAO;IACzD,IAAI,CAAC,CAAC,SAAS,QAAQ,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEpD,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACnC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sse-connection.port.js","sourceRoot":"","sources":["../src/sse-connection.port.ts"],"names":[],"mappings":""}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// Stryker disable all
|
|
2
|
-
import type * as z from "zod/v4";
|
|
3
|
-
import type { GenericEventSchema, GenericParsedEventSchema } from "./event.types";
|
|
4
|
-
import { EventStore as BaseStore } from "./event-store";
|
|
5
|
-
import type { EventStreamType } from "./event-stream.vo";
|
|
6
|
-
import type { EventBusPort } from "./message-bus.port";
|
|
7
|
-
|
|
8
|
-
export class DispatchingEventStore<AllEvents extends GenericEventSchema> extends BaseStore<AllEvents> {
|
|
9
|
-
static EMPTY_STREAM_REVISION = -1;
|
|
10
|
-
|
|
11
|
-
constructor(
|
|
12
|
-
config: {
|
|
13
|
-
finder: (
|
|
14
|
-
stream: EventStreamType,
|
|
15
|
-
names: ReadonlyArray<string>,
|
|
16
|
-
) => Promise<ReadonlyArray<z.infer<GenericEventSchema>>>;
|
|
17
|
-
inserter: (
|
|
18
|
-
events: ReadonlyArray<z.infer<GenericParsedEventSchema>>,
|
|
19
|
-
) => Promise<ReadonlyArray<z.infer<GenericParsedEventSchema>>>;
|
|
20
|
-
},
|
|
21
|
-
private readonly publisher: EventBusPort<z.infer<AllEvents>>,
|
|
22
|
-
) {
|
|
23
|
-
super(config);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async save(_events: ReadonlyArray<z.infer<AllEvents>>): Promise<ReadonlyArray<z.infer<AllEvents>>> {
|
|
27
|
-
const events = await super.save(_events);
|
|
28
|
-
|
|
29
|
-
await Promise.all(events.map((event) => this.publisher.emit(event)));
|
|
30
|
-
|
|
31
|
-
return events;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
// Stryker restore all
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { EventHandlerStrategy } from "./event-handler.strategy";
|
|
2
|
-
import type { Message } from "./message.types";
|
|
3
|
-
|
|
4
|
-
export class EventHandlerBareStrategy implements EventHandlerStrategy {
|
|
5
|
-
handle<Event extends Message>(handler: (event: Event) => Promise<void>) {
|
|
6
|
-
return async (event: Event) => handler(event);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { EventHandlerStrategy } from "./event-handler.strategy";
|
|
2
|
-
import type { Message } from "./message.types";
|
|
3
|
-
|
|
4
|
-
export class EventHandlerNoopStrategy implements EventHandlerStrategy {
|
|
5
|
-
handle<Event extends Message>(_handler: (event: Event) => Promise<void>) {
|
|
6
|
-
return async (_event: Event) => {};
|
|
7
|
-
}
|
|
8
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { ClockPort } from "./clock.port";
|
|
2
|
-
import type { EventHandlerStrategy } from "./event-handler.strategy";
|
|
3
|
-
import type { LoggerPort } from "./logger.port";
|
|
4
|
-
import type { Message } from "./message.types";
|
|
5
|
-
import { Stopwatch } from "./stopwatch.service";
|
|
6
|
-
|
|
7
|
-
type Dependencies = { Logger: LoggerPort; Clock: ClockPort };
|
|
8
|
-
|
|
9
|
-
export class EventHandlerWithLoggerStrategy implements EventHandlerStrategy {
|
|
10
|
-
constructor(private readonly deps: Dependencies) {}
|
|
11
|
-
|
|
12
|
-
handle<Event extends Message>(handler: (event: Event) => Promise<void>) {
|
|
13
|
-
return async (event: Event) => {
|
|
14
|
-
const duration = new Stopwatch(this.deps);
|
|
15
|
-
|
|
16
|
-
try {
|
|
17
|
-
await handler(event);
|
|
18
|
-
} catch (error) {
|
|
19
|
-
this.deps.Logger.error({
|
|
20
|
-
message: `Unknown ${event.name} event handler error`,
|
|
21
|
-
component: "infra",
|
|
22
|
-
operation: "event_handler",
|
|
23
|
-
metadata: { name: event.name, duration: duration.stop() },
|
|
24
|
-
error,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
}
|
package/src/event-store.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
// Stryker disable all
|
|
2
|
-
import type * as z from "zod/v4";
|
|
3
|
-
import type { GenericEventSchema, GenericParsedEventSchema } from "./event.types";
|
|
4
|
-
import type { EventStreamType } from "./event-stream.vo";
|
|
5
|
-
|
|
6
|
-
export type EventNameType = z.infer<GenericEventSchema["shape"]["name"]>;
|
|
7
|
-
|
|
8
|
-
type FindEventsHandler = (
|
|
9
|
-
stream: EventStreamType,
|
|
10
|
-
acceptedEventsNames: ReadonlyArray<EventNameType>,
|
|
11
|
-
) => Promise<ReadonlyArray<z.infer<GenericEventSchema>>>;
|
|
12
|
-
|
|
13
|
-
type InserterEventsHandler = (
|
|
14
|
-
events: ReadonlyArray<z.infer<GenericParsedEventSchema>>,
|
|
15
|
-
) => Promise<ReadonlyArray<z.infer<GenericParsedEventSchema>>>;
|
|
16
|
-
|
|
17
|
-
type Config = { finder: FindEventsHandler; inserter: InserterEventsHandler };
|
|
18
|
-
|
|
19
|
-
export class EventStore<AllEvents extends GenericEventSchema> {
|
|
20
|
-
constructor(private readonly config: Config) {}
|
|
21
|
-
|
|
22
|
-
static EMPTY_STREAM_REVISION = -1;
|
|
23
|
-
|
|
24
|
-
async find<AcceptedEvents extends ReadonlyArray<AllEvents>>(
|
|
25
|
-
acceptedEvents: AcceptedEvents,
|
|
26
|
-
stream: EventStreamType,
|
|
27
|
-
): Promise<ReadonlyArray<z.infer<AcceptedEvents[number]>>> {
|
|
28
|
-
const acceptedEventsNames = acceptedEvents.map((event) => event.shape.name.value);
|
|
29
|
-
|
|
30
|
-
const rows = await this.config.finder(stream, acceptedEventsNames);
|
|
31
|
-
|
|
32
|
-
return rows
|
|
33
|
-
.map((row) => ({ ...row, payload: JSON.parse(row.payload) }))
|
|
34
|
-
.map((row) => acceptedEvents.find((event) => event.shape.name.value === row.name)?.parse(row))
|
|
35
|
-
.filter((event): event is z.infer<AcceptedEvents[number]> => event !== undefined);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async save(events: ReadonlyArray<z.infer<AllEvents>>): Promise<ReadonlyArray<z.infer<AllEvents>>> {
|
|
39
|
-
if (!events[0]) return [];
|
|
40
|
-
|
|
41
|
-
const stream = events[0].stream;
|
|
42
|
-
|
|
43
|
-
if (!events.every((event) => event.stream === stream)) throw new EventStoreSaveUniqueStream();
|
|
44
|
-
|
|
45
|
-
// The returned variable has the `revision` fields added by the inserter,
|
|
46
|
-
// but we need to re-parse it to keep the contract.
|
|
47
|
-
const processed = await this.config.inserter(
|
|
48
|
-
events.map((event) => ({ ...event, payload: JSON.stringify(event.payload) })),
|
|
49
|
-
);
|
|
50
|
-
|
|
51
|
-
return processed.map((event) => ({
|
|
52
|
-
...event,
|
|
53
|
-
payload: JSON.parse(event.payload),
|
|
54
|
-
})) as Array<z.infer<AllEvents>>;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export class EventStoreSaveUniqueStream extends Error {
|
|
59
|
-
constructor() {
|
|
60
|
-
super();
|
|
61
|
-
Object.setPrototypeOf(this, EventStoreSaveUniqueStream.prototype);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
// Stryker restore all
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import type * as tools from "@bgord/tools";
|
|
2
|
-
import type { Context } from "hono";
|
|
3
|
-
import { streamSSE } from "hono/streaming";
|
|
4
|
-
import type { Message } from "./message.types";
|
|
5
|
-
import type { SseConnectionPort } from "./sse-connection.port";
|
|
6
|
-
import type { SseRegistryPort } from "./sse-registry.port";
|
|
7
|
-
|
|
8
|
-
export type SseConnectionHonoAdapterConfig = { keepalive: tools.Duration };
|
|
9
|
-
|
|
10
|
-
export class SseConnectionHonoAdapter<Messages extends Message> implements SseConnectionPort<Messages> {
|
|
11
|
-
private stream: Awaited<Parameters<Parameters<typeof streamSSE>[1]>[0]> | null = null;
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
private readonly registry: SseRegistryPort<Messages>,
|
|
15
|
-
private readonly userId: string,
|
|
16
|
-
private readonly config: SseConnectionHonoAdapterConfig,
|
|
17
|
-
) {}
|
|
18
|
-
|
|
19
|
-
attach(c: Context): Response {
|
|
20
|
-
return streamSSE(c, async (stream) => {
|
|
21
|
-
this.stream = stream;
|
|
22
|
-
|
|
23
|
-
this.registry.register(this.userId, this);
|
|
24
|
-
|
|
25
|
-
// Stryker disable all
|
|
26
|
-
stream.onAbort(() => this.registry.unregister(this.userId, this));
|
|
27
|
-
// Stryker restore all
|
|
28
|
-
|
|
29
|
-
while (!stream.closed) {
|
|
30
|
-
await stream.sleep(this.config.keepalive.ms);
|
|
31
|
-
await stream.writeSSE({ event: "ping", data: "" });
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async send<M extends Messages>(message: M): Promise<void> {
|
|
37
|
-
// Stryker disable all
|
|
38
|
-
await this.stream?.writeSSE({ event: message.name, data: JSON.stringify(message) });
|
|
39
|
-
// Stryker restore all;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
close(callback: () => void): void {
|
|
43
|
-
this.registry.unregister(this.userId, this);
|
|
44
|
-
callback();
|
|
45
|
-
// Stryker disable all
|
|
46
|
-
this.stream?.close();
|
|
47
|
-
// Stryker restore all
|
|
48
|
-
}
|
|
49
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { createFactory } from "hono/factory";
|
|
2
|
-
import type { HandlerHonoPort } from "./handler-hono.port";
|
|
3
|
-
import type { Message } from "./message.types";
|
|
4
|
-
import { SseConnectionHonoAdapter, type SseConnectionHonoAdapterConfig } from "./sse-connection-hono.adapter";
|
|
5
|
-
import type { SseRegistryPort } from "./sse-registry.port";
|
|
6
|
-
|
|
7
|
-
const factory = createFactory();
|
|
8
|
-
|
|
9
|
-
export class SseConnectionHonoHandler<Messages extends Message> implements HandlerHonoPort {
|
|
10
|
-
constructor(
|
|
11
|
-
private readonly registry: SseRegistryPort<Messages>,
|
|
12
|
-
private readonly config: SseConnectionHonoAdapterConfig,
|
|
13
|
-
) {}
|
|
14
|
-
|
|
15
|
-
handle() {
|
|
16
|
-
return factory.createHandlers<{}, any, { Variables: { user: { id: string } } }>((c) => {
|
|
17
|
-
const userId = c.get("user").id;
|
|
18
|
-
const adapter = new SseConnectionHonoAdapter<Messages>(this.registry, userId, this.config);
|
|
19
|
-
return adapter.attach(c);
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Message } from "./message.types";
|
|
2
|
-
import type { SseConnectionPort } from "./sse-connection.port";
|
|
3
|
-
|
|
4
|
-
export class SseConnectionNoopAdapter<Messages extends Message> implements SseConnectionPort<Messages> {
|
|
5
|
-
async send<M extends Messages>(_message: M) {}
|
|
6
|
-
|
|
7
|
-
close(_callback: () => void): void {}
|
|
8
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { CorrelationStorage } from "./correlation-storage.service";
|
|
2
|
-
import type { LoggerPort } from "./logger.port";
|
|
3
|
-
import type { Message } from "./message.types";
|
|
4
|
-
import type { SseConnectionPort } from "./sse-connection.port";
|
|
5
|
-
|
|
6
|
-
type Dependencies<Messages extends Message> = { inner: SseConnectionPort<Messages>; Logger: LoggerPort };
|
|
7
|
-
|
|
8
|
-
export class SseConnectionWithLoggerAdapter<Messages extends Message> implements SseConnectionPort<Messages> {
|
|
9
|
-
private readonly base = { component: "infra", operation: "sse_connection" };
|
|
10
|
-
|
|
11
|
-
constructor(private readonly deps: Dependencies<Messages>) {}
|
|
12
|
-
|
|
13
|
-
async send<M extends Messages>(message: M) {
|
|
14
|
-
this.deps.Logger.debug({
|
|
15
|
-
message: `${message.name} sent`,
|
|
16
|
-
metadata: message,
|
|
17
|
-
correlationId: CorrelationStorage.get(),
|
|
18
|
-
...this.base,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
await this.deps.inner.send(message);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
close(callback: () => void): void {
|
|
25
|
-
this.deps.Logger.debug({
|
|
26
|
-
message: "SSE connection closed",
|
|
27
|
-
metadata: {},
|
|
28
|
-
correlationId: CorrelationStorage.get(),
|
|
29
|
-
...this.base,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
this.deps.inner.close(callback);
|
|
33
|
-
}
|
|
34
|
-
}
|