sonamu 0.9.4 → 0.9.6
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/ai/providers/rtzr/utils.js +2 -2
- package/dist/api/config.d.ts +13 -2
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +1 -1
- package/dist/api/context.d.ts +17 -7
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +18 -0
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +54 -3
- package/dist/api/index.js +8 -3
- package/dist/api/sonamu.d.ts +24 -9
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +365 -79
- package/dist/api/websocket-helpers.d.ts +24 -0
- package/dist/api/websocket-helpers.d.ts.map +1 -0
- package/dist/api/websocket-helpers.js +77 -0
- package/dist/bin/cli.js +12 -4
- package/dist/database/upsert-builder.js +4 -4
- package/dist/dict/sonamu-dictionary.js +6 -6
- package/dist/entity/entity-manager.js +1 -1
- package/dist/entity/entity.js +3 -3
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -4
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +8 -9
- package/dist/stream/index.d.ts +6 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +13 -2
- package/dist/stream/ws-audience-resolver.d.ts +15 -0
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -0
- package/dist/stream/ws-audience-resolver.js +31 -0
- package/dist/stream/ws-audience.d.ts +28 -0
- package/dist/stream/ws-audience.d.ts.map +1 -0
- package/dist/stream/ws-audience.js +46 -0
- package/dist/stream/ws-cluster-bus.d.ts +23 -0
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -0
- package/dist/stream/ws-cluster-bus.js +18 -0
- package/dist/stream/ws-core.d.ts +15 -0
- package/dist/stream/ws-core.d.ts.map +1 -0
- package/dist/stream/ws-core.js +1 -0
- package/dist/stream/ws-delivery.d.ts +24 -0
- package/dist/stream/ws-delivery.d.ts.map +1 -0
- package/dist/stream/ws-delivery.js +103 -0
- package/dist/stream/ws-local-connection-store.d.ts +10 -0
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -0
- package/dist/stream/ws-local-connection-store.js +44 -0
- package/dist/stream/ws-presence-store.d.ts +61 -0
- package/dist/stream/ws-presence-store.d.ts.map +1 -0
- package/dist/stream/ws-presence-store.js +236 -0
- package/dist/stream/ws-registry.d.ts +42 -0
- package/dist/stream/ws-registry.d.ts.map +1 -0
- package/dist/stream/ws-registry.js +108 -0
- package/dist/stream/ws.d.ts +52 -0
- package/dist/stream/ws.d.ts.map +1 -0
- package/dist/stream/ws.js +397 -0
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +72 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +13 -12
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +7 -4
- package/dist/syncer/event-batcher.d.ts +27 -0
- package/dist/syncer/event-batcher.d.ts.map +1 -0
- package/dist/syncer/event-batcher.js +69 -0
- package/dist/syncer/file-patterns.d.ts +48 -26
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +71 -23
- package/dist/syncer/file-tracking.d.ts +13 -0
- package/dist/syncer/file-tracking.d.ts.map +1 -0
- package/dist/syncer/file-tracking.js +33 -0
- package/dist/syncer/index.js +2 -2
- package/dist/syncer/module-loader.d.ts +2 -11
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +3 -3
- package/dist/syncer/syncer-actions.d.ts +39 -6
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +125 -10
- package/dist/syncer/syncer.d.ts +33 -19
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +168 -168
- package/dist/syncer/watcher.d.ts +8 -0
- package/dist/syncer/watcher.d.ts.map +1 -0
- package/dist/syncer/watcher.js +105 -0
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +2 -1
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +36 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +8 -1
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +5 -3
- package/dist/testing/fixture-manager.js +1 -1
- package/dist/types/types.d.ts +2 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +2 -2
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +4 -3
- package/dist/ui/cdd-service.js +1 -1
- package/dist/ui-web/assets/{index-C5KUjXm0.js → index-BmThfg-s.js} +39 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.d.ts +27 -3
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +56 -6
- package/dist/utils/formatter.d.ts +7 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +95 -60
- package/dist/utils/fs-utils.d.ts +2 -0
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +10 -2
- package/dist/utils/process-utils.d.ts +6 -0
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +16 -3
- package/dist/utils/utils.d.ts +1 -0
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +2 -2
- package/package.json +7 -5
- package/src/ai/providers/rtzr/utils.ts +1 -1
- package/src/api/__tests__/sonamu.websocket.test.ts +64 -0
- package/src/api/__tests__/websocket-context.types.test.ts +58 -0
- package/src/api/config.ts +28 -2
- package/src/api/context.ts +21 -7
- package/src/api/decorators.ts +101 -1
- package/src/api/sonamu.ts +529 -127
- package/src/api/websocket-helpers.ts +122 -0
- package/src/bin/cli.ts +10 -2
- package/src/database/upsert-builder.ts +3 -3
- package/src/dict/sonamu-dictionary.ts +3 -3
- package/src/entity/entity.ts +1 -1
- package/src/index.ts +6 -0
- package/src/migration/code-generation.ts +6 -11
- package/src/shared/app.shared.ts.txt +312 -4
- package/src/shared/web.shared.ts.txt +340 -4
- package/src/stream/__tests__/ws-contracts.test.ts +381 -0
- package/src/stream/__tests__/ws.test.ts +449 -0
- package/src/stream/index.ts +6 -0
- package/src/stream/ws-audience-resolver.ts +35 -0
- package/src/stream/ws-audience.ts +62 -0
- package/src/stream/ws-cluster-bus.ts +32 -0
- package/src/stream/ws-core.ts +16 -0
- package/src/stream/ws-delivery.ts +138 -0
- package/src/stream/ws-local-connection-store.ts +44 -0
- package/src/stream/ws-presence-store.ts +326 -0
- package/src/stream/ws-registry.ts +138 -0
- package/src/stream/ws.ts +591 -0
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +78 -0
- package/src/syncer/api-parser.ts +112 -1
- package/src/syncer/checksum.ts +23 -29
- package/src/syncer/code-generator.ts +4 -1
- package/src/syncer/event-batcher.ts +72 -0
- package/src/syncer/file-patterns.ts +98 -30
- package/src/syncer/file-tracking.ts +27 -0
- package/src/syncer/module-loader.ts +5 -12
- package/src/syncer/syncer-actions.ts +179 -17
- package/src/syncer/syncer.ts +250 -287
- package/src/syncer/watcher.ts +128 -0
- package/src/tasks/workflow-manager.ts +1 -0
- package/src/template/__tests__/services.template.websocket.test.ts +79 -0
- package/src/template/implementations/services.template.ts +69 -0
- package/src/testing/bootstrap.ts +8 -1
- package/src/testing/data-explorer.ts +3 -2
- package/src/types/types.ts +20 -2
- package/src/ui/api.ts +10 -1
- package/src/utils/async-utils.ts +71 -4
- package/src/utils/formatter.ts +114 -75
- package/src/utils/fs-utils.ts +9 -0
- package/src/utils/process-utils.ts +17 -0
- package/src/utils/utils.ts +1 -1
- package/dist/ui-web/assets/index-Dr8pRJC_.css +0 -1
package/dist/stream/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC"}
|
package/dist/stream/index.js
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { createMockSSEFactory, createSSEFactory, init_sse } from "./sse.js";
|
|
2
|
+
import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
|
|
3
|
+
import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
|
|
4
|
+
import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-presence-store.js";
|
|
5
|
+
import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
|
|
6
|
+
import { WebSocketRuntime, createWebSocketRuntime, init_ws } from "./ws.js";
|
|
7
|
+
import "./ws-core.js";
|
|
2
8
|
|
|
3
9
|
//#region src/stream/index.ts
|
|
4
10
|
init_sse();
|
|
11
|
+
init_ws_audience();
|
|
12
|
+
init_ws_cluster_bus();
|
|
13
|
+
init_ws_presence_store();
|
|
14
|
+
init_ws();
|
|
15
|
+
init_ws_registry();
|
|
5
16
|
|
|
6
17
|
//#endregion
|
|
7
|
-
export { createMockSSEFactory, createSSEFactory };
|
|
8
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
18
|
+
export { InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, createMockSSEFactory, createSSEFactory, createWebSocketRuntime };
|
|
19
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1yZWdpc3RyeVwiO1xuIl0sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type WebSocketAudience } from "./ws-audience";
|
|
2
|
+
import { type WebSocketPresenceStore } from "./ws-presence-store";
|
|
3
|
+
export type WebSocketRoutingPlan = {
|
|
4
|
+
localSessionIds: string[];
|
|
5
|
+
remoteNodeIds: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare class WebSocketAudienceResolver {
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(options: {
|
|
10
|
+
nodeId: string;
|
|
11
|
+
presenceStore: WebSocketPresenceStore;
|
|
12
|
+
});
|
|
13
|
+
resolve(audience: WebSocketAudience): WebSocketRoutingPlan;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ws-audience-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-audience-resolver.d.ts","sourceRoot":"","sources":["../../src/stream/ws-audience-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,oBAAoB,GAAG;IACjC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,sBAAsB,CAAC;KACvC;IAGH,OAAO,CAAC,QAAQ,EAAE,iBAAiB,GAAG,oBAAoB;CAkB3D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
|
|
3
|
+
//#region src/stream/ws-audience-resolver.ts
|
|
4
|
+
var WebSocketAudienceResolver;
|
|
5
|
+
var init_ws_audience_resolver = __esmMin((() => {
|
|
6
|
+
WebSocketAudienceResolver = class {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
this.options = options;
|
|
9
|
+
}
|
|
10
|
+
resolve(audience) {
|
|
11
|
+
const localSessionIds = [];
|
|
12
|
+
const remoteNodeIds = new Set();
|
|
13
|
+
for (const meta of this.options.presenceStore.queryAudience(audience)) {
|
|
14
|
+
if (meta.nodeId === this.options.nodeId) {
|
|
15
|
+
localSessionIds.push(meta.sessionId);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
remoteNodeIds.add(meta.nodeId);
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
localSessionIds,
|
|
22
|
+
remoteNodeIds: [...remoteNodeIds]
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
//#endregion
|
|
29
|
+
init_ws_audience_resolver();
|
|
30
|
+
export { WebSocketAudienceResolver, init_ws_audience_resolver };
|
|
31
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtYXVkaWVuY2UtcmVzb2x2ZXIuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIHByZXNlbmNlU3RvcmU6IFdlYlNvY2tldFByZXNlbmNlU3RvcmU7XG4gICAgfSIsImxvY2FsU2Vzc2lvbklkczogc3RyaW5nW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWF1ZGllbmNlLXJlc29sdmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgfSBmcm9tIFwiLi93cy1hdWRpZW5jZVwiO1xuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlIH0gZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Um91dGluZ1BsYW4gPSB7XG4gIGxvY2FsU2Vzc2lvbklkczogc3RyaW5nW107XG4gIHJlbW90ZU5vZGVJZHM6IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldEF1ZGllbmNlUmVzb2x2ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IHtcbiAgICAgIG5vZGVJZDogc3RyaW5nO1xuICAgICAgcHJlc2VuY2VTdG9yZTogV2ViU29ja2V0UHJlc2VuY2VTdG9yZTtcbiAgICB9LFxuICApIHt9XG5cbiAgcmVzb2x2ZShhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UpOiBXZWJTb2NrZXRSb3V0aW5nUGxhbiB7XG4gICAgY29uc3QgbG9jYWxTZXNzaW9uSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlbW90ZU5vZGVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgbWV0YSBvZiB0aGlzLm9wdGlvbnMucHJlc2VuY2VTdG9yZS5xdWVyeUF1ZGllbmNlKGF1ZGllbmNlKSkge1xuICAgICAgaWYgKG1ldGEubm9kZUlkID09PSB0aGlzLm9wdGlvbnMubm9kZUlkKSB7XG4gICAgICAgIGxvY2FsU2Vzc2lvbklkcy5wdXNoKG1ldGEuc2Vzc2lvbklkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJlbW90ZU5vZGVJZHMuYWRkKG1ldGEubm9kZUlkKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxTZXNzaW9uSWRzLFxuICAgICAgcmVtb3RlTm9kZUlkczogWy4uLnJlbW90ZU5vZGVJZHNdLFxuICAgIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0FRYSw0QkFBYixNQUF1QztFQUNyQyxZQUNFLEFBQWlCQSxTQUlqQjtHQUppQjs7RUFNbkIsUUFBUSxVQUFtRDtHQUN6RCxNQUFNQyxrQkFBNEIsRUFBRTtHQUNwQyxNQUFNLGdCQUFnQixJQUFJLEtBQWE7QUFFdkMsUUFBSyxNQUFNLFFBQVEsS0FBSyxRQUFRLGNBQWMsY0FBYyxTQUFTLEVBQUU7QUFDckUsUUFBSSxLQUFLLFdBQVcsS0FBSyxRQUFRLFFBQVE7QUFDdkMscUJBQWdCLEtBQUssS0FBSyxVQUFVO0FBQ3BDOztBQUdGLGtCQUFjLElBQUksS0FBSyxPQUFPOztBQUdoQyxVQUFPO0lBQ0w7SUFDQSxlQUFlLENBQUMsR0FBRyxjQUFjO0lBQ2xDIn0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type WebSocketRoomId, type WebSocketUserId } from "./ws-core";
|
|
2
|
+
export type WebSocketAudience = {
|
|
3
|
+
type: "all";
|
|
4
|
+
namespace?: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: "room";
|
|
7
|
+
roomId: WebSocketRoomId;
|
|
8
|
+
namespace?: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "user";
|
|
11
|
+
userId: WebSocketUserId;
|
|
12
|
+
namespace?: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: "connections";
|
|
15
|
+
connectionIds: string[];
|
|
16
|
+
namespace?: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "union";
|
|
19
|
+
audiences: WebSocketAudience[];
|
|
20
|
+
};
|
|
21
|
+
export declare const WebSocketAudience: {
|
|
22
|
+
all(namespace?: string): WebSocketAudience;
|
|
23
|
+
room(roomId: WebSocketRoomId, namespace?: string): WebSocketAudience;
|
|
24
|
+
user(userId: WebSocketUserId, namespace?: string): WebSocketAudience;
|
|
25
|
+
connections(connectionIds: string[], namespace?: string): WebSocketAudience;
|
|
26
|
+
union(...audiences: WebSocketAudience[]): WebSocketAudience;
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=ws-audience.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-audience.d.ts","sourceRoot":"","sources":["../../src/stream/ws-audience.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,aAAa,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC,CAAC;AAEN,eAAO,MAAM,iBAAiB;oBACZ,MAAM,GAAG,iBAAiB;iBAM7B,eAAe,cAAc,MAAM,GAAG,iBAAiB;iBAOvD,eAAe,cAAc,MAAM,GAAG,iBAAiB;+BAOzC,MAAM,EAAE,cAAc,MAAM,GAAG,iBAAiB;wBAOvD,iBAAiB,EAAE,GAAG,iBAAiB;CAM5D,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
|
|
3
|
+
//#region src/stream/ws-audience.ts
|
|
4
|
+
var WebSocketAudience;
|
|
5
|
+
var init_ws_audience = __esmMin((() => {
|
|
6
|
+
WebSocketAudience = {
|
|
7
|
+
all(namespace) {
|
|
8
|
+
return {
|
|
9
|
+
type: "all",
|
|
10
|
+
namespace
|
|
11
|
+
};
|
|
12
|
+
},
|
|
13
|
+
room(roomId, namespace) {
|
|
14
|
+
return {
|
|
15
|
+
type: "room",
|
|
16
|
+
roomId,
|
|
17
|
+
namespace
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
user(userId, namespace) {
|
|
21
|
+
return {
|
|
22
|
+
type: "user",
|
|
23
|
+
userId,
|
|
24
|
+
namespace
|
|
25
|
+
};
|
|
26
|
+
},
|
|
27
|
+
connections(connectionIds, namespace) {
|
|
28
|
+
return {
|
|
29
|
+
type: "connections",
|
|
30
|
+
connectionIds,
|
|
31
|
+
namespace
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
union(...audiences) {
|
|
35
|
+
return {
|
|
36
|
+
type: "union",
|
|
37
|
+
audiences
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
init_ws_audience();
|
|
45
|
+
export { WebSocketAudience, init_ws_audience };
|
|
46
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtYXVkaWVuY2UuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1hdWRpZW5jZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldFJvb21JZCwgdHlwZSBXZWJTb2NrZXRVc2VySWQgfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldEF1ZGllbmNlID1cbiAgfCB7XG4gICAgICB0eXBlOiBcImFsbFwiO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInJvb21cIjtcbiAgICAgIHJvb21JZDogV2ViU29ja2V0Um9vbUlkO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcInVzZXJcIjtcbiAgICAgIHVzZXJJZDogV2ViU29ja2V0VXNlcklkO1xuICAgICAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImNvbm5lY3Rpb25zXCI7XG4gICAgICBjb25uZWN0aW9uSWRzOiBzdHJpbmdbXTtcbiAgICAgIG5hbWVzcGFjZT86IHN0cmluZztcbiAgICB9XG4gIHwge1xuICAgICAgdHlwZTogXCJ1bmlvblwiO1xuICAgICAgYXVkaWVuY2VzOiBXZWJTb2NrZXRBdWRpZW5jZVtdO1xuICAgIH07XG5cbmV4cG9ydCBjb25zdCBXZWJTb2NrZXRBdWRpZW5jZSA9IHtcbiAgYWxsKG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJhbGxcIixcbiAgICAgIG5hbWVzcGFjZSxcbiAgICB9O1xuICB9LFxuICByb29tKHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBXZWJTb2NrZXRBdWRpZW5jZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwicm9vbVwiLFxuICAgICAgcm9vbUlkLFxuICAgICAgbmFtZXNwYWNlLFxuICAgIH07XG4gIH0sXG4gIHVzZXIodXNlcklkOiBXZWJTb2NrZXRVc2VySWQsIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgICB1c2VySWQsXG4gICAgICBuYW1lc3BhY2UsXG4gICAgfTtcbiAgfSxcbiAgY29ubmVjdGlvbnMoY29ubmVjdGlvbklkczogc3RyaW5nW10sIG5hbWVzcGFjZT86IHN0cmluZyk6IFdlYlNvY2tldEF1ZGllbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJjb25uZWN0aW9uc1wiLFxuICAgICAgY29ubmVjdGlvbklkcyxcbiAgICAgIG5hbWVzcGFjZSxcbiAgICB9O1xuICB9LFxuICB1bmlvbiguLi5hdWRpZW5jZXM6IFdlYlNvY2tldEF1ZGllbmNlW10pOiBXZWJTb2NrZXRBdWRpZW5jZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwidW5pb25cIixcbiAgICAgIGF1ZGllbmNlcyxcbiAgICB9O1xuICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0EyQmEsb0JBQW9CO0VBQy9CLElBQUksV0FBdUM7QUFDekMsVUFBTztJQUNMLE1BQU07SUFDTjtJQUNEOztFQUVILEtBQUssUUFBeUIsV0FBdUM7QUFDbkUsVUFBTztJQUNMLE1BQU07SUFDTjtJQUNBO0lBQ0Q7O0VBRUgsS0FBSyxRQUF5QixXQUF1QztBQUNuRSxVQUFPO0lBQ0wsTUFBTTtJQUNOO0lBQ0E7SUFDRDs7RUFFSCxZQUFZLGVBQXlCLFdBQXVDO0FBQzFFLFVBQU87SUFDTCxNQUFNO0lBQ047SUFDQTtJQUNEOztFQUVILE1BQU0sR0FBRyxXQUFtRDtBQUMxRCxVQUFPO0lBQ0wsTUFBTTtJQUNOO0lBQ0Q7O0VBRUoifQ==
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type WebSocketAudience } from "./ws-audience";
|
|
2
|
+
export type WebSocketClusterEnvelope = {
|
|
3
|
+
id: string;
|
|
4
|
+
sourceNodeId: string;
|
|
5
|
+
targetNodeIds?: string[];
|
|
6
|
+
namespace?: string;
|
|
7
|
+
audience: WebSocketAudience;
|
|
8
|
+
event: string;
|
|
9
|
+
data: unknown;
|
|
10
|
+
emittedAt: number;
|
|
11
|
+
};
|
|
12
|
+
export type WebSocketClusterEnvelopeHandler = (envelope: WebSocketClusterEnvelope) => void | Promise<void>;
|
|
13
|
+
export interface WebSocketClusterBus {
|
|
14
|
+
publish(envelope: WebSocketClusterEnvelope): void | Promise<void>;
|
|
15
|
+
subscribe(handler: WebSocketClusterEnvelopeHandler): () => void;
|
|
16
|
+
shutdown(): void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export declare class NoopWebSocketClusterBus implements WebSocketClusterBus {
|
|
19
|
+
publish(_envelope: WebSocketClusterEnvelope): void;
|
|
20
|
+
subscribe(_handler: WebSocketClusterEnvelopeHandler): () => void;
|
|
21
|
+
shutdown(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ws-cluster-bus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-cluster-bus.d.ts","sourceRoot":"","sources":["../../src/stream/ws-cluster-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,CAC5C,QAAQ,EAAE,wBAAwB,KAC/B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,SAAS,CAAC,OAAO,EAAE,+BAA+B,GAAG,MAAM,IAAI,CAAC;IAChE,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI;IAElD,SAAS,CAAC,QAAQ,EAAE,+BAA+B,GAAG,MAAM,IAAI;IAIhE,QAAQ,IAAI,IAAI;CACjB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
|
|
3
|
+
//#region src/stream/ws-cluster-bus.ts
|
|
4
|
+
var NoopWebSocketClusterBus;
|
|
5
|
+
var init_ws_cluster_bus = __esmMin((() => {
|
|
6
|
+
NoopWebSocketClusterBus = class {
|
|
7
|
+
publish(_envelope) {}
|
|
8
|
+
subscribe(_handler) {
|
|
9
|
+
return () => {};
|
|
10
|
+
}
|
|
11
|
+
shutdown() {}
|
|
12
|
+
};
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
init_ws_cluster_bus();
|
|
17
|
+
export { NoopWebSocketClusterBus, init_ws_cluster_bus };
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtY2x1c3Rlci1idXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1jbHVzdGVyLWJ1cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlID0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VOb2RlSWQ6IHN0cmluZztcbiAgdGFyZ2V0Tm9kZUlkcz86IHN0cmluZ1tdO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZTtcbiAgZXZlbnQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbiAgZW1pdHRlZEF0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyID0gKFxuICBlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlLFxuKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRDbHVzdGVyQnVzIHtcbiAgcHVibGlzaChlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHN1YnNjcmliZShoYW5kbGVyOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyKTogKCkgPT4gdm9pZDtcbiAgc2h1dGRvd24oKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjbGFzcyBOb29wV2ViU29ja2V0Q2x1c3RlckJ1cyBpbXBsZW1lbnRzIFdlYlNvY2tldENsdXN0ZXJCdXMge1xuICBwdWJsaXNoKF9lbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB7fVxuXG4gIHN1YnNjcmliZShfaGFuZGxlcjogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlSGFuZGxlcik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiAoKSA9PiB7fTtcbiAgfVxuXG4gIHNodXRkb3duKCk6IHZvaWQge31cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0F1QmEsMEJBQWIsTUFBb0U7RUFDbEUsUUFBUSxXQUEyQztFQUVuRCxVQUFVLFVBQXVEO0FBQy9ELGdCQUFhOztFQUdmLFdBQWlCIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type WebSocketUserId = number | string;
|
|
2
|
+
export type WebSocketRoomId = string;
|
|
3
|
+
export interface ManagedWebSocketConnection {
|
|
4
|
+
id: string;
|
|
5
|
+
namespace: string;
|
|
6
|
+
closed: boolean;
|
|
7
|
+
publishUntyped(event: string, data: unknown): void;
|
|
8
|
+
close(code?: number, reason?: string): void;
|
|
9
|
+
}
|
|
10
|
+
export type WebSocketRegistryStats = {
|
|
11
|
+
totalConnections: number;
|
|
12
|
+
totalRooms: number;
|
|
13
|
+
byNamespace: Record<string, number>;
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=ws-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-core.d.ts","sourceRoot":"","sources":["../../src/stream/ws-core.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type WebSocketAudience } from "./ws-audience";
|
|
2
|
+
import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
|
|
3
|
+
import { type WebSocketClusterBus } from "./ws-cluster-bus";
|
|
4
|
+
import { type WebSocketLocalConnectionStore } from "./ws-local-connection-store";
|
|
5
|
+
export declare class WebSocketDeliveryEngine {
|
|
6
|
+
private readonly options;
|
|
7
|
+
private readonly pendingFanOutJobs;
|
|
8
|
+
private fanOutFlushScheduled;
|
|
9
|
+
private readonly unsubscribe;
|
|
10
|
+
constructor(options: {
|
|
11
|
+
nodeId: string;
|
|
12
|
+
localConnections: WebSocketLocalConnectionStore;
|
|
13
|
+
audienceResolver: WebSocketAudienceResolver;
|
|
14
|
+
clusterBus: WebSocketClusterBus;
|
|
15
|
+
});
|
|
16
|
+
publishToAudience(audience: WebSocketAudience, event: string, data: unknown): void;
|
|
17
|
+
shutdown(): Promise<void>;
|
|
18
|
+
private handleClusterEnvelope;
|
|
19
|
+
private enqueueFanOut;
|
|
20
|
+
private scheduleFanOutFlush;
|
|
21
|
+
private flushFanOutJobs;
|
|
22
|
+
private safePublish;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ws-delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-delivery.d.ts","sourceRoot":"","sources":["../../src/stream/ws-delivery.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,KAAK,mBAAmB,EAAiC,MAAM,kBAAkB,CAAC;AAE3F,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAKjF,qBAAa,uBAAuB;IAWhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAV1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAK1B;IACR,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAGtB,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,gBAAgB,EAAE,6BAA6B,CAAC;QAChD,gBAAgB,EAAE,yBAAyB,CAAC;QAC5C,UAAU,EAAE,mBAAmB,CAAC;KACjC;IAOH,iBAAiB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAoB5E,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
|
|
4
|
+
//#region src/stream/ws-delivery.ts
|
|
5
|
+
var FAN_OUT_BATCH_SIZE, WebSocketDeliveryEngine;
|
|
6
|
+
var init_ws_delivery = __esmMin((() => {
|
|
7
|
+
FAN_OUT_BATCH_SIZE = 250;
|
|
8
|
+
WebSocketDeliveryEngine = class {
|
|
9
|
+
pendingFanOutJobs = [];
|
|
10
|
+
fanOutFlushScheduled = false;
|
|
11
|
+
unsubscribe;
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.unsubscribe = this.options.clusterBus.subscribe((envelope) => {
|
|
15
|
+
this.handleClusterEnvelope(envelope);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
publishToAudience(audience, event, data) {
|
|
19
|
+
const routingPlan = this.options.audienceResolver.resolve(audience);
|
|
20
|
+
const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
|
|
21
|
+
this.enqueueFanOut(localTargets, event, data);
|
|
22
|
+
if (routingPlan.remoteNodeIds.length === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
void this.options.clusterBus.publish({
|
|
26
|
+
id: randomUUID(),
|
|
27
|
+
sourceNodeId: this.options.nodeId,
|
|
28
|
+
targetNodeIds: routingPlan.remoteNodeIds,
|
|
29
|
+
audience,
|
|
30
|
+
event,
|
|
31
|
+
data,
|
|
32
|
+
emittedAt: Date.now()
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async shutdown() {
|
|
36
|
+
this.unsubscribe();
|
|
37
|
+
await this.options.clusterBus.shutdown();
|
|
38
|
+
}
|
|
39
|
+
handleClusterEnvelope(envelope) {
|
|
40
|
+
if (envelope.sourceNodeId === this.options.nodeId) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (envelope.targetNodeIds && envelope.targetNodeIds.length > 0 && !envelope.targetNodeIds.includes(this.options.nodeId)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const routingPlan = this.options.audienceResolver.resolve(envelope.audience);
|
|
47
|
+
this.enqueueFanOut(this.options.localConnections.getConnections(routingPlan.localSessionIds), envelope.event, envelope.data);
|
|
48
|
+
}
|
|
49
|
+
enqueueFanOut(targets, event, data) {
|
|
50
|
+
if (targets.length === 0) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.pendingFanOutJobs.push({
|
|
54
|
+
targets,
|
|
55
|
+
event,
|
|
56
|
+
data,
|
|
57
|
+
cursor: 0
|
|
58
|
+
});
|
|
59
|
+
this.scheduleFanOutFlush();
|
|
60
|
+
}
|
|
61
|
+
scheduleFanOutFlush() {
|
|
62
|
+
if (this.fanOutFlushScheduled) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
this.fanOutFlushScheduled = true;
|
|
66
|
+
setImmediate(() => {
|
|
67
|
+
this.fanOutFlushScheduled = false;
|
|
68
|
+
this.flushFanOutJobs();
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
flushFanOutJobs() {
|
|
72
|
+
let processed = 0;
|
|
73
|
+
while (this.pendingFanOutJobs.length > 0 && processed < FAN_OUT_BATCH_SIZE) {
|
|
74
|
+
const job = this.pendingFanOutJobs[0];
|
|
75
|
+
while (job.cursor < job.targets.length && processed < FAN_OUT_BATCH_SIZE) {
|
|
76
|
+
this.safePublish(job.targets[job.cursor], job.event, job.data);
|
|
77
|
+
job.cursor += 1;
|
|
78
|
+
processed += 1;
|
|
79
|
+
}
|
|
80
|
+
if (job.cursor >= job.targets.length) {
|
|
81
|
+
this.pendingFanOutJobs.shift();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (this.pendingFanOutJobs.length > 0) {
|
|
85
|
+
this.scheduleFanOutFlush();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
safePublish(connection, event, data) {
|
|
89
|
+
try {
|
|
90
|
+
if (!connection.closed) {
|
|
91
|
+
connection.publishUntyped(event, data);
|
|
92
|
+
}
|
|
93
|
+
} catch {
|
|
94
|
+
connection.close(1011, "WebSocket publish failed");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}));
|
|
99
|
+
|
|
100
|
+
//#endregion
|
|
101
|
+
init_ws_delivery();
|
|
102
|
+
export { WebSocketDeliveryEngine, init_ws_delivery };
|
|
103
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtZGVsaXZlcnkuanMiLCJuYW1lcyI6WyJvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtZGVsaXZlcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuXG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB9IGZyb20gXCIuL3dzLWF1ZGllbmNlLXJlc29sdmVyXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldENsdXN0ZXJCdXMsIHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlIH0gZnJvbSBcIi4vd3MtY2x1c3Rlci1idXNcIjtcbmltcG9ydCB7IHR5cGUgTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tIFwiLi93cy1jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIH0gZnJvbSBcIi4vd3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZVwiO1xuXG4vLyBmYW4tb3V07J2EIGV2ZW50IGxvb3AgdGljayDri6jsnITroZwg64KY64igIO2VnCDrsojsl5Ag6ri0IOuPmeq4sCDro6jtlITrpbwg66eM65Ok7KeAIOyViuqyjCDtlahcbmNvbnN0IEZBTl9PVVRfQkFUQ0hfU0laRSA9IDI1MDtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldERlbGl2ZXJ5RW5naW5lIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nRmFuT3V0Sm9iczogQXJyYXk8e1xuICAgIHRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW107XG4gICAgZXZlbnQ6IHN0cmluZztcbiAgICBkYXRhOiB1bmtub3duO1xuICAgIGN1cnNvcjogbnVtYmVyO1xuICB9PiA9IFtdO1xuICBwcml2YXRlIGZhbk91dEZsdXNoU2NoZWR1bGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiB7XG4gICAgICBub2RlSWQ6IHN0cmluZztcbiAgICAgIGxvY2FsQ29ubmVjdGlvbnM6IFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlO1xuICAgICAgYXVkaWVuY2VSZXNvbHZlcjogV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlcjtcbiAgICAgIGNsdXN0ZXJCdXM6IFdlYlNvY2tldENsdXN0ZXJCdXM7XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnN1YnNjcmliZSgoZW52ZWxvcGUpID0+IHtcbiAgICAgIHRoaXMuaGFuZGxlQ2x1c3RlckVudmVsb3BlKGVudmVsb3BlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1Ymxpc2hUb0F1ZGllbmNlKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IHJvdXRpbmdQbGFuID0gdGhpcy5vcHRpb25zLmF1ZGllbmNlUmVzb2x2ZXIucmVzb2x2ZShhdWRpZW5jZSk7XG4gICAgY29uc3QgbG9jYWxUYXJnZXRzID0gdGhpcy5vcHRpb25zLmxvY2FsQ29ubmVjdGlvbnMuZ2V0Q29ubmVjdGlvbnMocm91dGluZ1BsYW4ubG9jYWxTZXNzaW9uSWRzKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQobG9jYWxUYXJnZXRzLCBldmVudCwgZGF0YSk7XG5cbiAgICBpZiAocm91dGluZ1BsYW4ucmVtb3RlTm9kZUlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2b2lkIHRoaXMub3B0aW9ucy5jbHVzdGVyQnVzLnB1Ymxpc2goe1xuICAgICAgaWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgIHNvdXJjZU5vZGVJZDogdGhpcy5vcHRpb25zLm5vZGVJZCxcbiAgICAgIHRhcmdldE5vZGVJZHM6IHJvdXRpbmdQbGFuLnJlbW90ZU5vZGVJZHMsXG4gICAgICBhdWRpZW5jZSxcbiAgICAgIGV2ZW50LFxuICAgICAgZGF0YSxcbiAgICAgIGVtaXR0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICBhd2FpdCB0aGlzLm9wdGlvbnMuY2x1c3RlckJ1cy5zaHV0ZG93bigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDbHVzdGVyRW52ZWxvcGUoZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQge1xuICAgIGlmIChlbnZlbG9wZS5zb3VyY2VOb2RlSWQgPT09IHRoaXMub3B0aW9ucy5ub2RlSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzICYmXG4gICAgICBlbnZlbG9wZS50YXJnZXROb2RlSWRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICFlbnZlbG9wZS50YXJnZXROb2RlSWRzLmluY2x1ZGVzKHRoaXMub3B0aW9ucy5ub2RlSWQpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm91dGluZ1BsYW4gPSB0aGlzLm9wdGlvbnMuYXVkaWVuY2VSZXNvbHZlci5yZXNvbHZlKGVudmVsb3BlLmF1ZGllbmNlKTtcbiAgICB0aGlzLmVucXVldWVGYW5PdXQoXG4gICAgICB0aGlzLm9wdGlvbnMubG9jYWxDb25uZWN0aW9ucy5nZXRDb25uZWN0aW9ucyhyb3V0aW5nUGxhbi5sb2NhbFNlc3Npb25JZHMpLFxuICAgICAgZW52ZWxvcGUuZXZlbnQsXG4gICAgICBlbnZlbG9wZS5kYXRhLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGVucXVldWVGYW5PdXQodGFyZ2V0czogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb25bXSwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmICh0YXJnZXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0Zhbk91dEpvYnMucHVzaCh7XG4gICAgICB0YXJnZXRzLFxuICAgICAgZXZlbnQsXG4gICAgICBkYXRhLFxuICAgICAgY3Vyc29yOiAwLFxuICAgIH0pO1xuICAgIHRoaXMuc2NoZWR1bGVGYW5PdXRGbHVzaCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZUZhbk91dEZsdXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZhbk91dEZsdXNoU2NoZWR1bGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mYW5PdXRGbHVzaFNjaGVkdWxlZCA9IHRydWU7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIHRoaXMuZmFuT3V0Rmx1c2hTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmx1c2hGYW5PdXRKb2JzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRmFuT3V0Sm9icygpOiB2b2lkIHtcbiAgICBsZXQgcHJvY2Vzc2VkID0gMDtcblxuICAgIHdoaWxlICh0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLmxlbmd0aCA+IDAgJiYgcHJvY2Vzc2VkIDwgRkFOX09VVF9CQVRDSF9TSVpFKSB7XG4gICAgICBjb25zdCBqb2IgPSB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzWzBdO1xuXG4gICAgICB3aGlsZSAoam9iLmN1cnNvciA8IGpvYi50YXJnZXRzLmxlbmd0aCAmJiBwcm9jZXNzZWQgPCBGQU5fT1VUX0JBVENIX1NJWkUpIHtcbiAgICAgICAgdGhpcy5zYWZlUHVibGlzaChqb2IudGFyZ2V0c1tqb2IuY3Vyc29yXSwgam9iLmV2ZW50LCBqb2IuZGF0YSk7XG4gICAgICAgIGpvYi5jdXJzb3IgKz0gMTtcbiAgICAgICAgcHJvY2Vzc2VkICs9IDE7XG4gICAgICB9XG5cbiAgICAgIGlmIChqb2IuY3Vyc29yID49IGpvYi50YXJnZXRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnBlbmRpbmdGYW5PdXRKb2JzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ0Zhbk91dEpvYnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZhbk91dEZsdXNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYWZlUHVibGlzaChjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiwgZXZlbnQ6IHN0cmluZywgZGF0YTogdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIWNvbm5lY3Rpb24uY2xvc2VkKSB7XG4gICAgICAgIGNvbm5lY3Rpb24ucHVibGlzaFVudHlwZWQoZXZlbnQsIGRhdGEpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgY29ubmVjdGlvbi5jbG9zZSgxMDExLCBcIldlYlNvY2tldCBwdWJsaXNoIGZhaWxlZFwiKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0NBU00scUJBQXFCO0NBRWQsMEJBQWIsTUFBcUM7RUFDbkMsQUFBaUIsb0JBS1osRUFBRTtFQUNQLEFBQVEsdUJBQXVCO0VBQy9CLEFBQWlCO0VBRWpCLFlBQ0UsQUFBaUJBLFNBTWpCO0dBTmlCO0FBT2pCLFFBQUssY0FBYyxLQUFLLFFBQVEsV0FBVyxXQUFXLGFBQWE7QUFDakUsU0FBSyxzQkFBc0IsU0FBUztLQUNwQzs7RUFHSixrQkFBa0IsVUFBNkIsT0FBZSxNQUFxQjtHQUNqRixNQUFNLGNBQWMsS0FBSyxRQUFRLGlCQUFpQixRQUFRLFNBQVM7R0FDbkUsTUFBTSxlQUFlLEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQjtBQUM5RixRQUFLLGNBQWMsY0FBYyxPQUFPLEtBQUs7QUFFN0MsT0FBSSxZQUFZLGNBQWMsV0FBVyxHQUFHO0FBQzFDOztBQUdGLFFBQUssS0FBSyxRQUFRLFdBQVcsUUFBUTtJQUNuQyxJQUFJLFlBQVk7SUFDaEIsY0FBYyxLQUFLLFFBQVE7SUFDM0IsZUFBZSxZQUFZO0lBQzNCO0lBQ0E7SUFDQTtJQUNBLFdBQVcsS0FBSyxLQUFLO0lBQ3RCLENBQUM7O0VBR0osTUFBTSxXQUEwQjtBQUM5QixRQUFLLGFBQWE7QUFDbEIsU0FBTSxLQUFLLFFBQVEsV0FBVyxVQUFVOztFQUcxQyxBQUFRLHNCQUFzQixVQUEwQztBQUN0RSxPQUFJLFNBQVMsaUJBQWlCLEtBQUssUUFBUSxRQUFRO0FBQ2pEOztBQUdGLE9BQ0UsU0FBUyxpQkFDVCxTQUFTLGNBQWMsU0FBUyxLQUNoQyxDQUFDLFNBQVMsY0FBYyxTQUFTLEtBQUssUUFBUSxPQUFPLEVBQ3JEO0FBQ0E7O0dBR0YsTUFBTSxjQUFjLEtBQUssUUFBUSxpQkFBaUIsUUFBUSxTQUFTLFNBQVM7QUFDNUUsUUFBSyxjQUNILEtBQUssUUFBUSxpQkFBaUIsZUFBZSxZQUFZLGdCQUFnQixFQUN6RSxTQUFTLE9BQ1QsU0FBUyxLQUNWOztFQUdILEFBQVEsY0FBYyxTQUF1QyxPQUFlLE1BQXFCO0FBQy9GLE9BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEI7O0FBR0YsUUFBSyxrQkFBa0IsS0FBSztJQUMxQjtJQUNBO0lBQ0E7SUFDQSxRQUFRO0lBQ1QsQ0FBQztBQUNGLFFBQUsscUJBQXFCOztFQUc1QixBQUFRLHNCQUE0QjtBQUNsQyxPQUFJLEtBQUssc0JBQXNCO0FBQzdCOztBQUdGLFFBQUssdUJBQXVCO0FBQzVCLHNCQUFtQjtBQUNqQixTQUFLLHVCQUF1QjtBQUM1QixTQUFLLGlCQUFpQjtLQUN0Qjs7RUFHSixBQUFRLGtCQUF3QjtHQUM5QixJQUFJLFlBQVk7QUFFaEIsVUFBTyxLQUFLLGtCQUFrQixTQUFTLEtBQUssWUFBWSxvQkFBb0I7SUFDMUUsTUFBTSxNQUFNLEtBQUssa0JBQWtCO0FBRW5DLFdBQU8sSUFBSSxTQUFTLElBQUksUUFBUSxVQUFVLFlBQVksb0JBQW9CO0FBQ3hFLFVBQUssWUFBWSxJQUFJLFFBQVEsSUFBSSxTQUFTLElBQUksT0FBTyxJQUFJLEtBQUs7QUFDOUQsU0FBSSxVQUFVO0FBQ2Qsa0JBQWE7O0FBR2YsUUFBSSxJQUFJLFVBQVUsSUFBSSxRQUFRLFFBQVE7QUFDcEMsVUFBSyxrQkFBa0IsT0FBTzs7O0FBSWxDLE9BQUksS0FBSyxrQkFBa0IsU0FBUyxHQUFHO0FBQ3JDLFNBQUsscUJBQXFCOzs7RUFJOUIsQUFBUSxZQUFZLFlBQXdDLE9BQWUsTUFBcUI7QUFDOUYsT0FBSTtBQUNGLFFBQUksQ0FBQyxXQUFXLFFBQVE7QUFDdEIsZ0JBQVcsZUFBZSxPQUFPLEtBQUs7O1dBRWxDO0FBQ04sZUFBVyxNQUFNLE1BQU0sMkJBQTJCIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ManagedWebSocketConnection } from "./ws-core";
|
|
2
|
+
export declare class WebSocketLocalConnectionStore {
|
|
3
|
+
private readonly connections;
|
|
4
|
+
register(connection: ManagedWebSocketConnection): void;
|
|
5
|
+
unregister(connectionId: string): void;
|
|
6
|
+
getConnection(connectionId: string): ManagedWebSocketConnection | undefined;
|
|
7
|
+
getConnections(connectionIds: string[]): ManagedWebSocketConnection[];
|
|
8
|
+
closeAll(code?: number, reason?: string): void;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ws-local-connection-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-local-connection-store.d.ts","sourceRoot":"","sources":["../../src/stream/ws-local-connection-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,WAAW,CAAC;AAE5D,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAE7E,QAAQ,CAAC,UAAU,EAAE,0BAA0B,GAAG,IAAI;IAItD,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAItC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS;IAI3E,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,0BAA0B,EAAE;IAqBrE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAK/C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { __esmMin } from "../_virtual/rolldown_runtime.js";
|
|
2
|
+
|
|
3
|
+
//#region src/stream/ws-local-connection-store.ts
|
|
4
|
+
var WebSocketLocalConnectionStore;
|
|
5
|
+
var init_ws_local_connection_store = __esmMin((() => {
|
|
6
|
+
WebSocketLocalConnectionStore = class {
|
|
7
|
+
connections = new Map();
|
|
8
|
+
register(connection) {
|
|
9
|
+
this.connections.set(connection.id, connection);
|
|
10
|
+
}
|
|
11
|
+
unregister(connectionId) {
|
|
12
|
+
this.connections.delete(connectionId);
|
|
13
|
+
}
|
|
14
|
+
getConnection(connectionId) {
|
|
15
|
+
return this.connections.get(connectionId);
|
|
16
|
+
}
|
|
17
|
+
getConnections(connectionIds) {
|
|
18
|
+
const targets = [];
|
|
19
|
+
const seen = new Set();
|
|
20
|
+
for (const connectionId of connectionIds) {
|
|
21
|
+
if (seen.has(connectionId)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
seen.add(connectionId);
|
|
25
|
+
const connection = this.connections.get(connectionId);
|
|
26
|
+
if (!connection || connection.closed) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
targets.push(connection);
|
|
30
|
+
}
|
|
31
|
+
return targets;
|
|
32
|
+
}
|
|
33
|
+
closeAll(code, reason) {
|
|
34
|
+
for (const connection of this.connections.values()) {
|
|
35
|
+
connection.close(code, reason);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
init_ws_local_connection_store();
|
|
43
|
+
export { WebSocketLocalConnectionStore, init_ws_local_connection_store };
|
|
44
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtbG9jYWwtY29ubmVjdGlvbi1zdG9yZS5qcyIsIm5hbWVzIjpbInRhcmdldHM6IE1hbmFnZWRXZWJTb2NrZXRDb25uZWN0aW9uW10iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyZWFtL3dzLWxvY2FsLWNvbm5lY3Rpb24tc3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gXCIuL3dzLWNvcmVcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldExvY2FsQ29ubmVjdGlvblN0b3JlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbj4oKTtcblxuICByZWdpc3Rlcihjb25uZWN0aW9uOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuc2V0KGNvbm5lY3Rpb24uaWQsIGNvbm5lY3Rpb24pO1xuICB9XG5cbiAgdW5yZWdpc3Rlcihjb25uZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb25JZCk7XG4gIH1cblxuICBnZXRDb25uZWN0aW9uKGNvbm5lY3Rpb25JZDogc3RyaW5nKTogTWFuYWdlZFdlYlNvY2tldENvbm5lY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb25zLmdldChjb25uZWN0aW9uSWQpO1xuICB9XG5cbiAgZ2V0Q29ubmVjdGlvbnMoY29ubmVjdGlvbklkczogc3RyaW5nW10pOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdIHtcbiAgICBjb25zdCB0YXJnZXRzOiBNYW5hZ2VkV2ViU29ja2V0Q29ubmVjdGlvbltdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uSWQgb2YgY29ubmVjdGlvbklkcykge1xuICAgICAgaWYgKHNlZW4uaGFzKGNvbm5lY3Rpb25JZCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChjb25uZWN0aW9uSWQpO1xuXG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gdGhpcy5jb25uZWN0aW9ucy5nZXQoY29ubmVjdGlvbklkKTtcbiAgICAgIGlmICghY29ubmVjdGlvbiB8fCBjb25uZWN0aW9uLmNsb3NlZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0cy5wdXNoKGNvbm5lY3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRzO1xuICB9XG5cbiAgY2xvc2VBbGwoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCkpIHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2UoY29kZSwgcmVhc29uKTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Q0FFYSxnQ0FBYixNQUEyQztFQUN6QyxBQUFpQixjQUFjLElBQUksS0FBeUM7RUFFNUUsU0FBUyxZQUE4QztBQUNyRCxRQUFLLFlBQVksSUFBSSxXQUFXLElBQUksV0FBVzs7RUFHakQsV0FBVyxjQUE0QjtBQUNyQyxRQUFLLFlBQVksT0FBTyxhQUFhOztFQUd2QyxjQUFjLGNBQThEO0FBQzFFLFVBQU8sS0FBSyxZQUFZLElBQUksYUFBYTs7RUFHM0MsZUFBZSxlQUF1RDtHQUNwRSxNQUFNQSxVQUF3QyxFQUFFO0dBQ2hELE1BQU0sT0FBTyxJQUFJLEtBQWE7QUFFOUIsUUFBSyxNQUFNLGdCQUFnQixlQUFlO0FBQ3hDLFFBQUksS0FBSyxJQUFJLGFBQWEsRUFBRTtBQUMxQjs7QUFFRixTQUFLLElBQUksYUFBYTtJQUV0QixNQUFNLGFBQWEsS0FBSyxZQUFZLElBQUksYUFBYTtBQUNyRCxRQUFJLENBQUMsY0FBYyxXQUFXLFFBQVE7QUFDcEM7O0FBR0YsWUFBUSxLQUFLLFdBQVc7O0FBRzFCLFVBQU87O0VBR1QsU0FBUyxNQUFlLFFBQXVCO0FBQzdDLFFBQUssTUFBTSxjQUFjLEtBQUssWUFBWSxRQUFRLEVBQUU7QUFDbEQsZUFBVyxNQUFNLE1BQU0sT0FBTyJ9
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type WebSocketAudience } from "./ws-audience";
|
|
2
|
+
import { type WebSocketRegistryStats, type WebSocketRoomId, type WebSocketUserId } from "./ws-core";
|
|
3
|
+
export type WebSocketSessionPresence = {
|
|
4
|
+
sessionId: string;
|
|
5
|
+
nodeId: string;
|
|
6
|
+
namespace: string;
|
|
7
|
+
active: boolean;
|
|
8
|
+
rooms: Set<WebSocketRoomId>;
|
|
9
|
+
connectedAt: Date;
|
|
10
|
+
lastSeenAt: Date;
|
|
11
|
+
userId?: WebSocketUserId;
|
|
12
|
+
};
|
|
13
|
+
export interface WebSocketPresenceStore {
|
|
14
|
+
register(input: {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
nodeId: string;
|
|
17
|
+
namespace: string;
|
|
18
|
+
active?: boolean;
|
|
19
|
+
}): WebSocketSessionPresence;
|
|
20
|
+
activate(sessionId: string): void;
|
|
21
|
+
unregister(sessionId: string): WebSocketSessionPresence | undefined;
|
|
22
|
+
touch(sessionId: string): void;
|
|
23
|
+
setUserId(sessionId: string, userId: WebSocketUserId): void;
|
|
24
|
+
clearUserId(sessionId: string): void;
|
|
25
|
+
join(sessionId: string, roomId: WebSocketRoomId): void;
|
|
26
|
+
leave(sessionId: string, roomId: WebSocketRoomId): void;
|
|
27
|
+
getConnection(sessionId: string): WebSocketSessionPresence | undefined;
|
|
28
|
+
getConnectionCount(namespace?: string): number;
|
|
29
|
+
getRoomMembers(roomId: WebSocketRoomId, namespace?: string): WebSocketSessionPresence[];
|
|
30
|
+
getStats(): WebSocketRegistryStats;
|
|
31
|
+
queryAudience(audience: WebSocketAudience): WebSocketSessionPresence[];
|
|
32
|
+
}
|
|
33
|
+
export declare class InMemoryWebSocketPresenceStore implements WebSocketPresenceStore {
|
|
34
|
+
private readonly connections;
|
|
35
|
+
private readonly rooms;
|
|
36
|
+
private readonly users;
|
|
37
|
+
register(input: {
|
|
38
|
+
sessionId: string;
|
|
39
|
+
nodeId: string;
|
|
40
|
+
namespace: string;
|
|
41
|
+
active?: boolean;
|
|
42
|
+
}): WebSocketSessionPresence;
|
|
43
|
+
activate(sessionId: string): void;
|
|
44
|
+
unregister(sessionId: string): WebSocketSessionPresence | undefined;
|
|
45
|
+
touch(sessionId: string): void;
|
|
46
|
+
setUserId(sessionId: string, userId: WebSocketUserId): void;
|
|
47
|
+
clearUserId(sessionId: string): void;
|
|
48
|
+
join(sessionId: string, roomId: WebSocketRoomId): void;
|
|
49
|
+
leave(sessionId: string, roomId: WebSocketRoomId): void;
|
|
50
|
+
getConnection(sessionId: string): WebSocketSessionPresence | undefined;
|
|
51
|
+
getConnectionCount(namespace?: string): number;
|
|
52
|
+
getRoomMembers(roomId: WebSocketRoomId, namespace?: string): WebSocketSessionPresence[];
|
|
53
|
+
getStats(): WebSocketRegistryStats;
|
|
54
|
+
queryAudience(audience: WebSocketAudience): WebSocketSessionPresence[];
|
|
55
|
+
private getActiveConnections;
|
|
56
|
+
private getBoundConnections;
|
|
57
|
+
private getScopedBindings;
|
|
58
|
+
private removeRoomBinding;
|
|
59
|
+
private removeUserBinding;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=ws-presence-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-presence-store.d.ts","sourceRoot":"","sources":["../../src/stream/ws-presence-store.ts"],"names":[],"mappings":"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"}
|