@bgord/bun 1.12.8 → 1.12.9
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/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/message-bus-with-logger.adapter.d.ts +3 -3
- package/dist/message-bus-with-logger.adapter.d.ts.map +1 -1
- package/dist/message-bus-with-logger.adapter.js +3 -5
- package/dist/message-bus-with-logger.adapter.js.map +1 -1
- package/dist/sse-connection-hono.adapter.d.ts +19 -0
- package/dist/sse-connection-hono.adapter.d.ts.map +1 -0
- package/dist/sse-connection-hono.adapter.js +38 -0
- package/dist/sse-connection-hono.adapter.js.map +1 -0
- package/dist/sse-connection-hono.handler.d.ts +17 -0
- package/dist/sse-connection-hono.handler.d.ts.map +1 -0
- package/dist/sse-connection-hono.handler.js +19 -0
- package/dist/sse-connection-hono.handler.js.map +1 -0
- package/dist/sse-connection-noop.adapter.d.ts +7 -0
- package/dist/sse-connection-noop.adapter.d.ts.map +1 -0
- package/dist/sse-connection-noop.adapter.js +5 -0
- package/dist/sse-connection-noop.adapter.js.map +1 -0
- package/dist/sse-connection-with-logger.adapter.d.ts +16 -0
- package/dist/sse-connection-with-logger.adapter.d.ts.map +1 -0
- package/dist/sse-connection-with-logger.adapter.js +27 -0
- package/dist/sse-connection-with-logger.adapter.js.map +1 -0
- package/dist/sse-connection.port.d.ts +6 -0
- package/dist/sse-connection.port.d.ts.map +1 -0
- package/dist/sse-connection.port.js +2 -0
- package/dist/sse-connection.port.js.map +1 -0
- package/dist/sse-registry-collecting.adapter.d.ts +13 -0
- package/dist/sse-registry-collecting.adapter.d.ts.map +1 -0
- package/dist/sse-registry-collecting.adapter.js +9 -0
- package/dist/sse-registry-collecting.adapter.js.map +1 -0
- package/dist/sse-registry-noop.adapter.d.ts +9 -0
- package/dist/sse-registry-noop.adapter.d.ts.map +1 -0
- package/dist/sse-registry-noop.adapter.js +6 -0
- package/dist/sse-registry-noop.adapter.js.map +1 -0
- package/dist/sse-registry-with-logger.adapter.d.ts +18 -0
- package/dist/sse-registry-with-logger.adapter.d.ts.map +1 -0
- package/dist/sse-registry-with-logger.adapter.js +36 -0
- package/dist/sse-registry-with-logger.adapter.js.map +1 -0
- package/dist/sse-registry.adapter.d.ts +10 -0
- package/dist/sse-registry.adapter.d.ts.map +1 -0
- package/dist/sse-registry.adapter.js +17 -0
- package/dist/sse-registry.adapter.js.map +1 -0
- package/dist/sse-registry.port.d.ts +8 -0
- package/dist/sse-registry.port.d.ts.map +1 -0
- package/dist/sse-registry.port.js +2 -0
- package/dist/sse-registry.port.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/readme.md +10 -0
- package/src/index.ts +11 -0
- package/src/message-bus-with-logger.adapter.ts +4 -7
- package/src/sse-connection-hono.adapter.ts +49 -0
- package/src/sse-connection-hono.handler.ts +22 -0
- package/src/sse-connection-noop.adapter.ts +8 -0
- package/src/sse-connection-with-logger.adapter.ts +34 -0
- package/src/sse-connection.port.ts +7 -0
- package/src/sse-registry-collecting.adapter.ts +15 -0
- package/src/sse-registry-noop.adapter.ts +11 -0
- package/src/sse-registry-with-logger.adapter.ts +46 -0
- package/src/sse-registry.adapter.ts +23 -0
- package/src/sse-registry.port.ts +10 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bgord/bun",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.9",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Bartosz Gordon",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@bgord/tools": "1.3.24",
|
|
47
47
|
"emittery": "2.0.0",
|
|
48
|
-
"hono": "4.12.
|
|
48
|
+
"hono": "4.12.7",
|
|
49
49
|
"node-cache": "5.1.2"
|
|
50
50
|
},
|
|
51
51
|
"peerDependencies": {
|
package/readme.md
CHANGED
|
@@ -418,6 +418,16 @@ src/
|
|
|
418
418
|
├── smtp-pass.vo.ts
|
|
419
419
|
├── smtp-port.vo.ts
|
|
420
420
|
├── smtp-user.vo.ts
|
|
421
|
+
├── sse-connection-hono.adapter.ts
|
|
422
|
+
├── sse-connection-hono.handler.ts
|
|
423
|
+
├── sse-connection-noop.adapter.ts
|
|
424
|
+
├── sse-connection-with-logger.adapter.ts
|
|
425
|
+
├── sse-connection.port.ts
|
|
426
|
+
├── sse-registry-collecting.adapter.ts
|
|
427
|
+
├── sse-registry-noop.adapter.ts
|
|
428
|
+
├── sse-registry-with-logger.adapter.ts
|
|
429
|
+
├── sse-registry.adapter.ts
|
|
430
|
+
├── sse-registry.port.ts
|
|
421
431
|
├── ssr-bun.service.ts
|
|
422
432
|
├── ssr.service.ts
|
|
423
433
|
├── static-files-hono.service.ts
|
package/src/index.ts
CHANGED
|
@@ -344,6 +344,17 @@ export * from "./smtp-host.vo";
|
|
|
344
344
|
export * from "./smtp-pass.vo";
|
|
345
345
|
export * from "./smtp-port.vo";
|
|
346
346
|
export * from "./smtp-user.vo";
|
|
347
|
+
export * from "./sse-connection.port";
|
|
348
|
+
export * from "./sse-connection-hono.adapter";
|
|
349
|
+
export * from "./sse-connection-hono.handler";
|
|
350
|
+
export * from "./sse-connection-hono.handler";
|
|
351
|
+
export * from "./sse-connection-noop.adapter";
|
|
352
|
+
export * from "./sse-connection-with-logger.adapter";
|
|
353
|
+
export * from "./sse-registry.adapter";
|
|
354
|
+
export * from "./sse-registry.port";
|
|
355
|
+
export * from "./sse-registry-collecting.adapter";
|
|
356
|
+
export * from "./sse-registry-noop.adapter";
|
|
357
|
+
export * from "./sse-registry-with-logger.adapter";
|
|
347
358
|
export * from "./ssr.service";
|
|
348
359
|
export * from "./ssr-bun.service";
|
|
349
360
|
export * from "./static-files-hono.service";
|
|
@@ -3,15 +3,12 @@ import type { LogCoreType, LoggerPort } from "./logger.port";
|
|
|
3
3
|
import type { Message, ToMessageMap } from "./message.types";
|
|
4
4
|
import type { MessageBusPort } from "./message-bus.port";
|
|
5
5
|
|
|
6
|
-
type Dependencies = { Logger: LoggerPort };
|
|
6
|
+
type Dependencies<Messages extends Message> = { inner: MessageBusPort<Messages>; Logger: LoggerPort };
|
|
7
7
|
|
|
8
8
|
export class MessageBusWithLoggerAdapter<Messages extends Message> implements MessageBusPort<Messages> {
|
|
9
9
|
private readonly base = { component: "infra", operation: "message_bus_emit" };
|
|
10
10
|
|
|
11
|
-
constructor(
|
|
12
|
-
private readonly inner: MessageBusPort<Messages>,
|
|
13
|
-
private readonly deps: Dependencies,
|
|
14
|
-
) {}
|
|
11
|
+
constructor(private readonly deps: Dependencies<Messages>) {}
|
|
15
12
|
|
|
16
13
|
async emit<M extends Messages>(message: M): Promise<void> {
|
|
17
14
|
this.deps.Logger.info({
|
|
@@ -21,14 +18,14 @@ export class MessageBusWithLoggerAdapter<Messages extends Message> implements Me
|
|
|
21
18
|
...this.base,
|
|
22
19
|
});
|
|
23
20
|
|
|
24
|
-
return this.inner.emit(message);
|
|
21
|
+
return this.deps.inner.emit(message);
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
on<MessageName extends keyof ToMessageMap<Messages>>(
|
|
28
25
|
name: MessageName,
|
|
29
26
|
handler: (message: ToMessageMap<Messages>[MessageName]) => void | Promise<void>,
|
|
30
27
|
): void {
|
|
31
|
-
this.inner.on(name, handler);
|
|
28
|
+
this.deps.inner.on(name, handler);
|
|
32
29
|
}
|
|
33
30
|
}
|
|
34
31
|
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Message } from "./message.types";
|
|
2
|
+
import type { SseConnectionPort } from "./sse-connection.port";
|
|
3
|
+
import type { SseRegistryPort } from "./sse-registry.port";
|
|
4
|
+
|
|
5
|
+
export class SseRegistryCollectingAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
6
|
+
public emitted: Array<{ userId: string; message: Messages }> = [];
|
|
7
|
+
|
|
8
|
+
register(_userId: string, _connection: SseConnectionPort<Messages>): void {}
|
|
9
|
+
|
|
10
|
+
unregister(_userId: string, _connection: SseConnectionPort<Messages>): void {}
|
|
11
|
+
|
|
12
|
+
async emit<M extends Messages>(userId: string, message: M): Promise<void> {
|
|
13
|
+
this.emitted.push({ userId, message });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Message } from "./message.types";
|
|
2
|
+
import type { SseConnectionPort } from "./sse-connection.port";
|
|
3
|
+
import type { SseRegistryPort } from "./sse-registry.port";
|
|
4
|
+
|
|
5
|
+
export class SseRegistryNoopAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
6
|
+
register(_userId: string, _connection: SseConnectionPort<Messages>): void {}
|
|
7
|
+
|
|
8
|
+
unregister(_userId: string, _connection: SseConnectionPort<Messages>): void {}
|
|
9
|
+
|
|
10
|
+
async emit<M extends Messages>(_userId: string, _message: M): Promise<void> {}
|
|
11
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
import type { SseRegistryPort } from "./sse-registry.port";
|
|
6
|
+
|
|
7
|
+
type Dependencies<Messages extends Message> = { inner: SseRegistryPort<Messages>; Logger: LoggerPort };
|
|
8
|
+
|
|
9
|
+
export class SseRegistryWithLoggerAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
10
|
+
private readonly base = { component: "infra", operation: "sse_registry" };
|
|
11
|
+
|
|
12
|
+
constructor(private readonly deps: Dependencies<Messages>) {}
|
|
13
|
+
|
|
14
|
+
register(userId: string, connection: SseConnectionPort<Messages>): void {
|
|
15
|
+
this.deps.Logger.info({
|
|
16
|
+
message: "SSE connection registered",
|
|
17
|
+
metadata: { userId },
|
|
18
|
+
correlationId: CorrelationStorage.get(),
|
|
19
|
+
...this.base,
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
this.deps.inner.register(userId, connection);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
unregister(userId: string, connection: SseConnectionPort<Messages>): void {
|
|
26
|
+
this.deps.Logger.info({
|
|
27
|
+
message: "SSE connection unregistered",
|
|
28
|
+
metadata: { userId },
|
|
29
|
+
correlationId: CorrelationStorage.get(),
|
|
30
|
+
...this.base,
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
this.deps.inner.unregister(userId, connection);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async emit<M extends Messages>(userId: string, message: M): Promise<void> {
|
|
37
|
+
this.deps.Logger.info({
|
|
38
|
+
message: `${message.name} emitted`,
|
|
39
|
+
metadata: { userId, message },
|
|
40
|
+
correlationId: CorrelationStorage.get(),
|
|
41
|
+
...this.base,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return this.deps.inner.emit(userId, message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Message } from "./message.types";
|
|
2
|
+
import type { SseConnectionPort } from "./sse-connection.port";
|
|
3
|
+
import type { SseRegistryPort } from "./sse-registry.port";
|
|
4
|
+
|
|
5
|
+
export class SseRegistryAdapter<Messages extends Message> implements SseRegistryPort<Messages> {
|
|
6
|
+
private readonly connections = new Map<string, Set<SseConnectionPort<Messages>>>();
|
|
7
|
+
|
|
8
|
+
register(userId: string, connection: SseConnectionPort<Messages>): void {
|
|
9
|
+
if (!this.connections.has(userId)) this.connections.set(userId, new Set());
|
|
10
|
+
|
|
11
|
+
this.connections.get(userId)!.add(connection);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
unregister(userId: string, connection: SseConnectionPort<Messages>): void {
|
|
15
|
+
this.connections.get(userId)?.delete(connection);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async emit<M extends Messages>(userId: string, message: M): Promise<void> {
|
|
19
|
+
for (const connection of this.connections.get(userId) ?? []) {
|
|
20
|
+
await connection.send(message);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Message } from "./message.types";
|
|
2
|
+
import type { SseConnectionPort } from "./sse-connection.port";
|
|
3
|
+
|
|
4
|
+
export interface SseRegistryPort<Messages extends Message> {
|
|
5
|
+
register(userId: string, connection: SseConnectionPort<Messages>): void;
|
|
6
|
+
|
|
7
|
+
unregister(userId: string, connection: SseConnectionPort<Messages>): void;
|
|
8
|
+
|
|
9
|
+
emit<M extends Messages>(userId: string, message: M): Promise<void>;
|
|
10
|
+
}
|