sonamu 0.11.16 → 0.13.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/_virtual/_rolldown/runtime.js +1 -2
- package/dist/ai/agents/agent.js +2 -3
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +1 -2
- package/dist/ai/providers/rtzr/error.js +2 -3
- package/dist/ai/providers/rtzr/model.js +1 -2
- package/dist/ai/providers/rtzr/options.js +1 -2
- package/dist/ai/providers/rtzr/provider.js +1 -2
- package/dist/ai/providers/rtzr/utils.js +1 -2
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.d.ts +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +9 -9
- package/dist/api/code-converters.js +6 -5
- package/dist/api/config.d.ts +1 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +2 -3
- package/dist/api/context.d.ts +2 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +2 -3
- package/dist/api/http-validator.js +2 -3
- package/dist/api/index.js +8 -3
- package/dist/api/secret.js +1 -2
- package/dist/api/sonamu.d.ts +3 -5
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +30 -24
- package/dist/api/validator.js +1 -2
- package/dist/api/websocket-helpers.js +2 -3
- package/dist/auth/audit-log/builders.js +1 -2
- package/dist/auth/audit-log/client-ip.js +2 -3
- package/dist/auth/audit-log/events.js +1 -2
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +2 -3
- package/dist/auth/audit-log-ingestor.js +2 -3
- package/dist/auth/auth-generator.js +2 -3
- package/dist/auth/better-auth-entities.js +1 -2
- package/dist/auth/better-auth-request.js +2 -3
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +2 -3
- package/dist/auth/plugins/entity-definitions/admin.js +1 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +1 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +1 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +1 -2
- package/dist/auth/plugins/entity-definitions/index.js +1 -2
- package/dist/auth/plugins/entity-definitions/jwt.js +1 -2
- package/dist/auth/plugins/entity-definitions/organization.js +1 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +1 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +1 -2
- package/dist/auth/plugins/entity-definitions/sso.js +1 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +1 -2
- package/dist/auth/plugins/entity-definitions/username.js +1 -2
- package/dist/auth/plugins/wrappers/admin.d.ts +33 -32
- package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.d.ts +43 -1
- package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.d.ts +138 -187
- package/dist/auth/plugins/wrappers/sso.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/sso.js +1 -2
- package/dist/auth/plugins/wrappers/two-factor.d.ts +51 -10
- package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.d.ts +39 -5
- package/dist/auth/plugins/wrappers/username.d.ts.map +1 -1
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +5 -5
- package/dist/bin/compiler-policy.js +2 -3
- package/dist/bin/fixture.js +7 -5
- package/dist/bin/hmr-hook-register.js +1 -2
- package/dist/bin/migrate-targets.js +2 -3
- package/dist/bin/test-command.js +2 -3
- package/dist/bin/ts-loader-register.js +2 -3
- package/dist/bin/ts-loader-registration.js +2 -3
- package/dist/bin/typecheck-web.js +2 -3
- package/dist/cache/cache-manager.js +1 -2
- package/dist/cache/decorator.js +2 -3
- package/dist/cache/drivers.js +1 -2
- package/dist/cache/index.js +2 -3
- package/dist/cache-control/cache-control.js +1 -2
- package/dist/code-formatting/index.js +2 -3
- package/dist/code-formatting/oxfmt.js +2 -3
- package/dist/code-formatting/oxlint.js +2 -3
- package/dist/compress/compress.js +1 -2
- package/dist/compress/index.js +2 -2
- package/dist/compress/types.d.ts +1 -1
- package/dist/compress/types.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +2 -3
- package/dist/database/_batch_update.js +1 -2
- package/dist/database/base-model.js +4 -4
- package/dist/database/db.js +4 -4
- package/dist/database/knex.js +2 -3
- package/dist/database/puri-wrapper.js +2 -3
- package/dist/database/puri.js +23 -22
- package/dist/database/puri.types.js +1 -2
- package/dist/database/transaction-context.js +1 -2
- package/dist/database/upsert-builder.js +2 -3
- package/dist/dict/en.js +2 -3
- package/dist/dict/index.js +3 -3
- package/dist/dict/ko.js +2 -3
- package/dist/dict/rc-keys.js +1 -2
- package/dist/dict/sd.js +2 -3
- package/dist/dict/sonamu-dictionary.js +7 -6
- package/dist/dict/utils.js +2 -3
- package/dist/entity/entity-manager.d.ts +66 -66
- package/dist/entity/entity-manager.js +4 -4
- package/dist/entity/entity-template-cone.js +2 -3
- package/dist/entity/entity.js +21 -18
- package/dist/env.js +1 -2
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +2 -3
- package/dist/filter/index.js +3 -2
- package/dist/filter/types.js +1 -2
- package/dist/filter/utils.js +7 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -6
- package/dist/logger/category.js +2 -3
- package/dist/logger/configure.js +5 -5
- package/dist/migration/code-generation.js +23 -16
- package/dist/migration/index-where-predicate.js +2 -3
- package/dist/migration/migration-set.js +2 -3
- package/dist/migration/migrator.js +2 -3
- package/dist/migration/postgresql-schema-reader.js +6 -9
- package/dist/migration/slack-confirm.js +2 -3
- package/dist/naite/naite-reporter.js +2 -3
- package/dist/naite/naite.js +10 -8
- package/dist/runtime-type.js +2 -3
- package/dist/ssr/hmr-opt-out.js +1 -2
- package/dist/ssr/index.js +7 -4
- package/dist/ssr/registry.js +1 -2
- package/dist/ssr/renderer.js +2 -3
- package/dist/storage/base-file.js +1 -2
- package/dist/storage/buffered-file.js +2 -3
- package/dist/storage/drivers.js +1 -2
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +1 -2
- package/dist/storage/storage-manager.js +2 -3
- package/dist/storage/uploaded-file.js +2 -3
- package/dist/stream/__tests__/ws-test-helpers.d.ts +108 -0
- package/dist/stream/__tests__/ws-test-helpers.d.ts.map +1 -0
- package/dist/stream/__tests__/ws-test-helpers.js +259 -0
- package/dist/stream/index.d.ts +1 -0
- package/dist/stream/index.d.ts.map +1 -1
- package/dist/stream/index.js +15 -4
- package/dist/stream/sse.js +1 -2
- package/dist/stream/ws-audience-resolver.d.ts +8 -5
- package/dist/stream/ws-audience-resolver.d.ts.map +1 -1
- package/dist/stream/ws-audience-resolver.js +17 -15
- package/dist/stream/ws-audience.js +1 -2
- package/dist/stream/ws-cluster-bus.d.ts +9 -4
- package/dist/stream/ws-cluster-bus.d.ts.map +1 -1
- package/dist/stream/ws-cluster-bus.js +2 -3
- package/dist/stream/ws-core.d.ts +10 -0
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +30 -4
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +200 -54
- package/dist/stream/ws-frame.d.ts +15 -0
- package/dist/stream/ws-frame.d.ts.map +1 -0
- package/dist/stream/ws-frame.js +28 -0
- package/dist/stream/ws-local-connection-store.d.ts +4 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +3 -4
- package/dist/stream/ws-presence-index.d.ts +36 -0
- package/dist/stream/ws-presence-index.d.ts.map +1 -0
- package/dist/stream/ws-presence-index.js +176 -0
- package/dist/stream/ws-presence-store.d.ts +39 -39
- package/dist/stream/ws-presence-store.d.ts.map +1 -1
- package/dist/stream/ws-presence-store.js +23 -154
- package/dist/stream/ws-registry.d.ts +45 -17
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +170 -62
- package/dist/stream/ws-session-id.d.ts +14 -0
- package/dist/stream/ws-session-id.d.ts.map +1 -0
- package/dist/stream/ws-session-id.js +36 -0
- package/dist/stream/ws-telemetry-memory.js +3 -4
- package/dist/stream/ws-telemetry-trace.js +1 -2
- package/dist/stream/ws-telemetry.js +2 -3
- package/dist/stream/ws.d.ts +20 -10
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +60 -38
- package/dist/syncer/api-parser.js +2 -3
- package/dist/syncer/checksum.js +4 -4
- package/dist/syncer/code-generator.js +4 -4
- package/dist/syncer/entity-operations.js +2 -3
- package/dist/syncer/event-batcher.js +1 -2
- package/dist/syncer/file-copy.js +2 -3
- package/dist/syncer/file-patterns.js +2 -3
- package/dist/syncer/file-tracking.js +2 -3
- package/dist/syncer/filesystem-dependencies.js +1 -2
- package/dist/syncer/index.js +8 -2
- package/dist/syncer/module-loader.js +8 -6
- package/dist/syncer/syncer-actions.js +8 -7
- package/dist/syncer/syncer.js +13 -8
- package/dist/syncer/watcher.js +2 -3
- package/dist/tasks/decorator.js +1 -2
- package/dist/tasks/step-wrapper.js +2 -3
- package/dist/tasks/workflow-manager.js +2 -3
- package/dist/template/entity-converter.js +17 -16
- package/dist/template/helpers.js +2 -3
- package/dist/template/implementations/entity.template.js +2 -3
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +2 -3
- package/dist/template/implementations/generated_http.template.js +6 -6
- package/dist/template/implementations/generated_sso.template.js +2 -3
- package/dist/template/implementations/http_validators.template.js +2 -3
- package/dist/template/implementations/init_types.template.js +2 -3
- package/dist/template/implementations/model.template.js +4 -4
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +2 -3
- package/dist/template/implementations/sd.template.js +2 -3
- package/dist/template/implementations/services.template.js +2 -3
- package/dist/template/implementations/view_form.template.js +12 -9
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +19 -17
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +9 -3
- package/dist/template/template-manager.js +2 -3
- package/dist/template/template-types.js +1 -2
- package/dist/template/template.js +2 -3
- package/dist/template/zod-converter.js +54 -47
- package/dist/testing/_relation-graph.js +2 -3
- package/dist/testing/bootstrap.js +2 -3
- package/dist/testing/data-explorer.js +2 -3
- package/dist/testing/dev-test-routes.js +2 -3
- package/dist/testing/dev-vitest-manager.js +15 -12
- package/dist/testing/faker-mappings.js +1 -2
- package/dist/testing/filesystem.js +2 -3
- package/dist/testing/fixture-generator.js +2 -3
- package/dist/testing/fixture-loader.js +1 -2
- package/dist/testing/fixture-manager.js +12 -9
- package/dist/testing/global-setup.js +5 -5
- package/dist/testing/index.js +6 -3
- package/dist/testing/naite-vitest-reporter.js +1 -2
- package/dist/testing/parallel-db-manager.js +2 -3
- package/dist/testing/vitest-helpers.js +2 -3
- package/dist/tooling/__tests__/helpers/sonamu-test-root.js +2 -3
- package/dist/tooling/cdd-service.js +1 -2
- package/dist/tooling/cli-tooling.js +1 -2
- package/dist/tooling/fixture-service.js +1 -2
- package/dist/tooling/index.js +1 -2
- package/dist/tooling/test-run-client.js +2 -3
- package/dist/tsdown.api.config.js +1 -2
- package/dist/types/types.js +2 -3
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +4 -5
- package/dist/ui/ai-client.d.ts +2 -2
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +9 -8
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +11 -8
- package/dist/ui/async-route.js +1 -2
- package/dist/ui/cdd-service.js +22 -21
- package/dist/ui/migrations-api.js +6 -5
- package/dist/ui-web/assets/index-QDMyy31K.js +180 -0
- package/dist/ui-web/assets/index-dV7akMFB.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +1 -2
- package/dist/utils/class-name.js +1 -2
- package/dist/utils/console-util.js +1 -2
- package/dist/utils/controller.js +2 -3
- package/dist/utils/esm-utils.js +1 -2
- package/dist/utils/fs-utils.js +2 -3
- package/dist/utils/lodash-able.js +1 -2
- package/dist/utils/model.js +1 -2
- package/dist/utils/object-utils.js +2 -3
- package/dist/utils/path-utils.js +2 -3
- package/dist/utils/process-utils.js +2 -3
- package/dist/utils/runtime-value.js +1 -2
- package/dist/utils/sql-parser.js +2 -3
- package/dist/utils/type-utils.js +8 -8
- package/dist/utils/utils.js +2 -3
- package/dist/utils/zod-error.js +2 -3
- package/dist/vector/chunking.js +1 -2
- package/dist/vector/config.js +1 -2
- package/dist/vector/embedding.js +4 -4
- package/package.json +63 -63
- package/src/ai/agents/agent.ts +1 -1
- package/src/api/__tests__/sonamu.plugins.test.ts +11 -1
- package/src/api/__tests__/sonamu.websocket-routes.test.ts +234 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +241 -24
- package/src/api/config.ts +1 -1
- package/src/api/context.ts +2 -8
- package/src/api/sonamu.ts +46 -28
- package/src/auth/audit-log/plugin.ts +2 -0
- package/src/compress/types.ts +1 -1
- package/src/exceptions/error-handler.ts +3 -2
- package/src/index.ts +1 -0
- package/src/stream/__tests__/ws-contracts.test.ts +483 -265
- package/src/stream/__tests__/ws-multinode.test.ts +326 -0
- package/src/stream/__tests__/ws-registry-async.test.ts +855 -0
- package/src/stream/__tests__/ws-test-helpers.ts +360 -0
- package/src/stream/__tests__/ws.test.ts +342 -145
- package/src/stream/index.ts +1 -0
- package/src/stream/ws-audience-resolver.ts +21 -19
- package/src/stream/ws-cluster-bus.ts +12 -4
- package/src/stream/ws-core.ts +14 -0
- package/src/stream/ws-delivery.ts +321 -97
- package/src/stream/ws-frame.ts +39 -0
- package/src/stream/ws-local-connection-store.ts +10 -9
- package/src/stream/ws-presence-index.ts +273 -0
- package/src/stream/ws-presence-store.ts +64 -284
- package/src/stream/ws-registry.ts +272 -85
- package/src/stream/ws-session-id.ts +39 -0
- package/src/stream/ws.ts +91 -50
- package/src/template/implementations/model.template.ts +3 -3
- package/src/template/implementations/view_list.template.ts +12 -13
- package/src/ui/ai-api.ts +4 -2
- package/src/ui/ai-client.ts +2 -2
- package/src/ui/api.ts +58 -62
- package/dist/ui-web/assets/index-BMdIyKXS.css +0 -1
- package/dist/ui-web/assets/index-LpE8u19O.js +0 -178
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws-test-helpers.d.ts","sourceRoot":"","sources":["../../../src/stream/__tests__/ws-test-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,+BAA+B,EACrC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAGtE,wBAAsB,UAAU,CAAC,MAAM,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMlE;AAGD,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,SAAS,GAAE,MAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhG;AAED,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAgB,cAAc,CAAC,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAQtD;AAGD,wBAAsB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAYxE;AAED,qBAAa,aAAc,SAAQ,YAAY;IAC7C,UAAU,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAK;IAC9B,cAAc,SAAK;IACnB,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5B,SAAS,SAAK;IACd,UAAU,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAQ;IAE7D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvB;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAI1C;IAED,IAAI,IAAI,IAAI,CAEX;IAED,SAAS,IAAI,IAAI,CAGhB;CACF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB,CA2BrE;AAaD,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAIzF;AAED,KAAK,cAAc,GACf,UAAU,GACV,UAAU,GACV,YAAY,GACZ,WAAW,GACX,aAAa,GACb,MAAM,GACN,OAAO,GACP,cAAc,GACd,oBAAoB,GACpB,UAAU,CAAC;AAGf,KAAK,mBAAmB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtD;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAC9B,QAAQ,CAAC,KAAK,EAAE,8BAA8B,CAAC;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoD;IAEjF,YAAY,KAAK,GAAE,8BAAqE,EAEvF;IAED,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAKnE;IAGD,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,GAAG,IAAI,CAKrE;IAED,QAAQ,CAAC,KAAK,EAAE;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,OAAO,CAAC;QAChB,WAAW,EAAE,IAAI,CAAC;KACnB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGvB;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhD;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlD;IAED,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E;IAED,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnD;IAED,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE;IAED,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE;IAED,YAAY,CACV,QAAQ,EAAE,iBAAiB,EAC3B,MAAM,EAAE,MAAM,GAEZ;QAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GACtD,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAGlE;IAED,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxF;IAED,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/B;IAED,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhC;IAED,OAAO,CAAC,GAAG;CAYZ;AAED;;;GAGG;AACH,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,SAAS,EAAE,wBAAwB,EAAE,CAAM;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IAEpF,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAEvC;IAED,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,+BAA+B,GAAG,MAAM,IAAI,CAO9E;IAED,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAWhD;CACF;AAED,qBAAa,mBAAoB,YAAW,mBAAmB;IAK3D,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,aAAa,SAAK;IAClB,gBAAgB,SAAK;IAErB,YACW,MAAM,EAAE,MAAM,EACN,OAAO,EAAE,uBAAuB,EAC/C;IAEJ,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAEhD;IAGK,SAAS,CAAC,OAAO,EAAE,+BAA+B,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAM7E;IAED,QAAQ,IAAI,IAAI,CAEf;CACF;AAGD,qBAAa,mBAAoB,YAAW,mBAAmB;IAC7D,QAAQ,CAAC,SAAS,EAAE,wBAAwB,EAAE,CAAM;IACpD,QAAQ,CAAC,QAAQ,uCAA8C;IAC/D,aAAa,SAAK;IAClB,gBAAgB,SAAK;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;IAED,SAAS,CAAC,OAAO,EAAE,+BAA+B,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,CAMtF;IAEK,IAAI,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D;IAED,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/B;CACF;AAGD,wBAAgB,0BAA0B,IAAI,MAAM,KAAK,EAAE,CAU1D"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "../ws-presence-store.js";
|
|
2
|
+
import { EventEmitter } from "node:events";
|
|
3
|
+
// src/stream/__tests__/ws-test-helpers.ts
|
|
4
|
+
init_ws_presence_store();
|
|
5
|
+
async function flushAsync(rounds = 5) {
|
|
6
|
+
for (let index = 0; index < rounds; index += 1) await new Promise((resolve) => {
|
|
7
|
+
setImmediate(resolve);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
async function flushUntil(predicate, maxRounds = 50) {
|
|
11
|
+
for (let index = 0; index < maxRounds && !predicate(); index += 1) await flushAsync(1);
|
|
12
|
+
}
|
|
13
|
+
function createDeferred() {
|
|
14
|
+
let resolve;
|
|
15
|
+
let reject;
|
|
16
|
+
return {
|
|
17
|
+
promise: new Promise((innerResolve, innerReject) => {
|
|
18
|
+
resolve = innerResolve;
|
|
19
|
+
reject = innerReject;
|
|
20
|
+
}),
|
|
21
|
+
resolve,
|
|
22
|
+
reject
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async function isSettled(promise) {
|
|
26
|
+
let settled = false;
|
|
27
|
+
promise.then(() => {
|
|
28
|
+
settled = true;
|
|
29
|
+
}, () => {
|
|
30
|
+
settled = true;
|
|
31
|
+
});
|
|
32
|
+
await flushAsync(2);
|
|
33
|
+
return settled;
|
|
34
|
+
}
|
|
35
|
+
var FakeWebSocket = class extends EventEmitter {
|
|
36
|
+
readyState = 1;
|
|
37
|
+
bufferedAmount = 0;
|
|
38
|
+
sentMessages = [];
|
|
39
|
+
pingCount = 0;
|
|
40
|
+
closedWith = null;
|
|
41
|
+
send(data) {
|
|
42
|
+
this.sentMessages.push(data);
|
|
43
|
+
}
|
|
44
|
+
close(code, reason) {
|
|
45
|
+
this.closedWith = {
|
|
46
|
+
code,
|
|
47
|
+
reason
|
|
48
|
+
};
|
|
49
|
+
this.readyState = 3;
|
|
50
|
+
this.emit("close", code ?? 1e3, Buffer.from(reason ?? "", "utf-8"));
|
|
51
|
+
}
|
|
52
|
+
ping() {
|
|
53
|
+
this.pingCount += 1;
|
|
54
|
+
}
|
|
55
|
+
terminate() {
|
|
56
|
+
this.readyState = 3;
|
|
57
|
+
this.emit("close", 1006, Buffer.alloc(0));
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
function asWebSocket(socket) {
|
|
61
|
+
return {
|
|
62
|
+
get bufferedAmount() {
|
|
63
|
+
return socket.bufferedAmount;
|
|
64
|
+
},
|
|
65
|
+
get readyState() {
|
|
66
|
+
return socket.readyState;
|
|
67
|
+
},
|
|
68
|
+
close(code, reason) {
|
|
69
|
+
socket.close(code, reason?.toString());
|
|
70
|
+
},
|
|
71
|
+
off(...args) {
|
|
72
|
+
socket.off(...args);
|
|
73
|
+
},
|
|
74
|
+
on(...args) {
|
|
75
|
+
socket.on(...args);
|
|
76
|
+
},
|
|
77
|
+
ping() {
|
|
78
|
+
socket.ping();
|
|
79
|
+
},
|
|
80
|
+
send(data) {
|
|
81
|
+
socket.send(data.toString());
|
|
82
|
+
},
|
|
83
|
+
terminate() {
|
|
84
|
+
socket.terminate();
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function parseTestJson(raw) {
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(raw);
|
|
91
|
+
} catch (error) {
|
|
92
|
+
throw new Error(`테스트 JSON 파싱 실패: ${raw}`, { cause: error });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function parseFrames(socket) {
|
|
96
|
+
return socket.sentMessages.map((message) => parseTestJson(message));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* InMemoryWebSocketPresenceStore를 감싸 호출 순서를 기록하고, 메서드별로 다음 호출의 동작을 스크립트할 수 있는 store.
|
|
100
|
+
* 호출 기록은 store가 호출을 "받은" 시점에 남긴다.
|
|
101
|
+
*/
|
|
102
|
+
var ScriptedPresenceStore = class {
|
|
103
|
+
calls = [];
|
|
104
|
+
inner;
|
|
105
|
+
nodeId;
|
|
106
|
+
interceptors = /* @__PURE__ */ new Map();
|
|
107
|
+
constructor(inner = new InMemoryWebSocketPresenceStore()) {
|
|
108
|
+
this.inner = inner;
|
|
109
|
+
}
|
|
110
|
+
next(method, interceptor) {
|
|
111
|
+
const queue = this.interceptors.get(method) ?? [];
|
|
112
|
+
queue.push(interceptor);
|
|
113
|
+
this.interceptors.set(method, queue);
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
always(method, interceptor) {
|
|
117
|
+
for (let index = 0; index < 1e3; index += 1) this.next(method, interceptor);
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
register(input) {
|
|
121
|
+
this.calls.push(`register:${input.sessionId}`);
|
|
122
|
+
return this.run("register", () => this.inner.register(input));
|
|
123
|
+
}
|
|
124
|
+
activate(sessionId) {
|
|
125
|
+
this.calls.push(`activate:${sessionId}`);
|
|
126
|
+
return this.run("activate", () => this.inner.activate(sessionId));
|
|
127
|
+
}
|
|
128
|
+
unregister(sessionId) {
|
|
129
|
+
this.calls.push(`unregister:${sessionId}`);
|
|
130
|
+
return this.run("unregister", () => this.inner.unregister(sessionId));
|
|
131
|
+
}
|
|
132
|
+
setUserId(sessionId, userId) {
|
|
133
|
+
this.calls.push(`setUserId:${sessionId}:${JSON.stringify(userId)}`);
|
|
134
|
+
return this.run("setUserId", () => this.inner.setUserId(sessionId, userId));
|
|
135
|
+
}
|
|
136
|
+
clearUserId(sessionId) {
|
|
137
|
+
this.calls.push(`clearUserId:${sessionId}`);
|
|
138
|
+
return this.run("clearUserId", () => this.inner.clearUserId(sessionId));
|
|
139
|
+
}
|
|
140
|
+
join(sessionId, roomId) {
|
|
141
|
+
this.calls.push(`join:${sessionId}:${roomId}`);
|
|
142
|
+
return this.run("join", () => this.inner.join(sessionId, roomId));
|
|
143
|
+
}
|
|
144
|
+
leave(sessionId, roomId) {
|
|
145
|
+
this.calls.push(`leave:${sessionId}:${roomId}`);
|
|
146
|
+
return this.run("leave", () => this.inner.leave(sessionId, roomId));
|
|
147
|
+
}
|
|
148
|
+
resolveRoute(audience, nodeId) {
|
|
149
|
+
this.calls.push(`resolveRoute:${nodeId}:${audience.type}`);
|
|
150
|
+
return this.run("resolveRoute", () => this.inner.resolveRoute(audience, nodeId));
|
|
151
|
+
}
|
|
152
|
+
getRoomMemberCount(roomId, namespace) {
|
|
153
|
+
this.calls.push(`getRoomMemberCount:${roomId}`);
|
|
154
|
+
return this.run("getRoomMemberCount", () => this.inner.getRoomMemberCount(roomId, namespace));
|
|
155
|
+
}
|
|
156
|
+
shutdown() {
|
|
157
|
+
this.calls.push("shutdown");
|
|
158
|
+
return this.run("shutdown", () => void 0);
|
|
159
|
+
}
|
|
160
|
+
callsOf(prefix) {
|
|
161
|
+
return this.calls.filter((call) => call.startsWith(prefix));
|
|
162
|
+
}
|
|
163
|
+
run(method, delegate) {
|
|
164
|
+
const interceptor = this.interceptors.get(method)?.shift();
|
|
165
|
+
if (!interceptor) return delegate();
|
|
166
|
+
const result = interceptor();
|
|
167
|
+
if (result instanceof Promise) return result.then(() => delegate());
|
|
168
|
+
return delegate();
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* 한 프로세스 안에서 targetNodeIds 기준으로 envelope을 라우팅하는 fake cluster 네트워크.
|
|
173
|
+
* 전송 구간을 흉내내기 위해 envelope을 JSON 직렬화/역직렬화한 뒤 다음 tick에 전달한다.
|
|
174
|
+
*/
|
|
175
|
+
var InProcessClusterNetwork = class {
|
|
176
|
+
published = [];
|
|
177
|
+
handlers = /* @__PURE__ */ new Map();
|
|
178
|
+
bus(nodeId) {
|
|
179
|
+
return new InProcessClusterBus(nodeId, this);
|
|
180
|
+
}
|
|
181
|
+
subscribe(nodeId, handler) {
|
|
182
|
+
const handlers = this.handlers.get(nodeId) ?? /* @__PURE__ */ new Set();
|
|
183
|
+
handlers.add(handler);
|
|
184
|
+
this.handlers.set(nodeId, handlers);
|
|
185
|
+
return () => {
|
|
186
|
+
handlers.delete(handler);
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
deliver(envelope) {
|
|
190
|
+
const wire = JSON.stringify(envelope);
|
|
191
|
+
this.published.push(parseTestJson(wire));
|
|
192
|
+
setImmediate(() => {
|
|
193
|
+
for (const targetNodeId of envelope.targetNodeIds ?? []) for (const handler of this.handlers.get(targetNodeId) ?? []) {
|
|
194
|
+
const received = parseTestJson(wire);
|
|
195
|
+
Promise.resolve(handler(received)).catch(() => {});
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
var InProcessClusterBus = class {
|
|
201
|
+
nodeId;
|
|
202
|
+
network;
|
|
203
|
+
shutdownCalls = 0;
|
|
204
|
+
unsubscribeCalls = 0;
|
|
205
|
+
constructor(nodeId, network) {
|
|
206
|
+
this.nodeId = nodeId;
|
|
207
|
+
this.network = network;
|
|
208
|
+
}
|
|
209
|
+
publish(envelope) {
|
|
210
|
+
this.network.deliver(envelope);
|
|
211
|
+
}
|
|
212
|
+
async subscribe(handler) {
|
|
213
|
+
const unsubscribe = this.network.subscribe(this.nodeId, handler);
|
|
214
|
+
return () => {
|
|
215
|
+
this.unsubscribeCalls += 1;
|
|
216
|
+
unsubscribe();
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
shutdown() {
|
|
220
|
+
this.shutdownCalls += 1;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
var RecordingClusterBus = class {
|
|
224
|
+
published = [];
|
|
225
|
+
handlers = /* @__PURE__ */ new Set();
|
|
226
|
+
shutdownCalls = 0;
|
|
227
|
+
unsubscribeCalls = 0;
|
|
228
|
+
nodeId;
|
|
229
|
+
publish(envelope) {
|
|
230
|
+
this.published.push(envelope);
|
|
231
|
+
}
|
|
232
|
+
subscribe(handler) {
|
|
233
|
+
this.handlers.add(handler);
|
|
234
|
+
return () => {
|
|
235
|
+
this.unsubscribeCalls += 1;
|
|
236
|
+
this.handlers.delete(handler);
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
async emit(envelope) {
|
|
240
|
+
for (const handler of this.handlers) await handler(envelope);
|
|
241
|
+
}
|
|
242
|
+
shutdown() {
|
|
243
|
+
this.shutdownCalls += 1;
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
function collectUnhandledRejections() {
|
|
247
|
+
const collected = [];
|
|
248
|
+
const listener = (reason) => {
|
|
249
|
+
collected.push(reason);
|
|
250
|
+
};
|
|
251
|
+
process.on("unhandledRejection", listener);
|
|
252
|
+
return () => {
|
|
253
|
+
process.off("unhandledRejection", listener);
|
|
254
|
+
return collected;
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
export { FakeWebSocket, InProcessClusterBus, InProcessClusterNetwork, RecordingClusterBus, ScriptedPresenceStore, asWebSocket, collectUnhandledRejections, createDeferred, flushAsync, flushUntil, isSettled, parseFrames };
|
|
258
|
+
|
|
259
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVzdC1oZWxwZXJzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdHJlYW0vX190ZXN0c19fL3dzLXRlc3QtaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tIFwibm9kZTpldmVudHNcIjtcblxuaW1wb3J0IHsgdHlwZSBXZWJTb2NrZXRUcmFuc3BvcnQgfSBmcm9tIFwiLi4vd3NcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0QXVkaWVuY2UgfSBmcm9tIFwiLi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7XG4gIHR5cGUgV2ViU29ja2V0Q2x1c3RlckJ1cyxcbiAgdHlwZSBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGUsXG4gIHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlSGFuZGxlcixcbn0gZnJvbSBcIi4uL3dzLWNsdXN0ZXItYnVzXCI7XG5pbXBvcnQgeyB0eXBlIFdlYlNvY2tldFJvb21JZCwgdHlwZSBXZWJTb2NrZXRVc2VySWQgfSBmcm9tIFwiLi4vd3MtY29yZVwiO1xuaW1wb3J0IHsgSW5NZW1vcnlXZWJTb2NrZXRQcmVzZW5jZVN0b3JlIH0gZnJvbSBcIi4uL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5cbi8vIHNldEltbWVkaWF0ZSDri6jsnITroZwg7YGQ66W8IOu5hOybjCBmYW4tb3V0L291dGJvdW5kIGZsdXNoL2NsdXN0ZXIg7KCE64us7J20IOuBneuCmOq4sOulvCDquLDri6TrprDri6RcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaEFzeW5jKHJvdW5kczogbnVtYmVyID0gNSk6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcm91bmRzOyBpbmRleCArPSAxKSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHNldEltbWVkaWF0ZShyZXNvbHZlKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyDsobDqsbTsnbQg66eM7KGx65CgIOuVjOq5jOyngCBzZXRJbW1lZGlhdGUg64uo7JyE66GcIOq4sOuLpOumsOuLpC4g64Gd64K0IOunjOyhse2VmOyngCDslYrsnLzrqbQg6re464yA66GcIOuwmO2ZmO2VtCBhc3NlcnRpb27sl5DshJwg7Iuk7Yyo7ZWY6rKMIO2VnOuLpFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoVW50aWwocHJlZGljYXRlOiAoKSA9PiBib29sZWFuLCBtYXhSb3VuZHM6IG51bWJlciA9IDUwKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYXhSb3VuZHMgJiYgIXByZWRpY2F0ZSgpOyBpbmRleCArPSAxKSB7XG4gICAgYXdhaXQgZmx1c2hBc3luYygxKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBEZWZlcnJlZDxUPiA9IHtcbiAgcHJvbWlzZTogUHJvbWlzZTxUPjtcbiAgcmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmZXJyZWQ8VCA9IHZvaWQ+KCk6IERlZmVycmVkPFQ+IHtcbiAgbGV0IHJlc29sdmUhOiAodmFsdWU6IFQpID0+IHZvaWQ7XG4gIGxldCByZWplY3QhOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKGlubmVyUmVzb2x2ZSwgaW5uZXJSZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gaW5uZXJSZXNvbHZlO1xuICAgIHJlamVjdCA9IGlubmVyUmVqZWN0O1xuICB9KTtcbiAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG59XG5cbi8vIHByb21pc2XqsIAg7JWE7KeBIHNldHRsZeuQmOyngCDslYrslZjripTsp4Ag7ZmV7J247ZWc64ukXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNTZXR0bGVkPFQ+KHByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgcHJvbWlzZS50aGVuKFxuICAgICgpID0+IHtcbiAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgfSxcbiAgKTtcbiAgYXdhaXQgZmx1c2hBc3luYygyKTtcbiAgcmV0dXJuIHNldHRsZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBGYWtlV2ViU29ja2V0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgcmVhZHlTdGF0ZTogMCB8IDEgfCAyIHwgMyA9IDE7XG4gIGJ1ZmZlcmVkQW1vdW50ID0gMDtcbiAgc2VudE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICBwaW5nQ291bnQgPSAwO1xuICBjbG9zZWRXaXRoOiB7IGNvZGU/OiBudW1iZXI7IHJlYXNvbj86IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgc2VuZChkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNlbnRNZXNzYWdlcy5wdXNoKGRhdGEpO1xuICB9XG5cbiAgY2xvc2UoY29kZT86IG51bWJlciwgcmVhc29uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZWRXaXRoID0geyBjb2RlLCByZWFzb24gfTtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSAzO1xuICAgIHRoaXMuZW1pdChcImNsb3NlXCIsIGNvZGUgPz8gMTAwMCwgQnVmZmVyLmZyb20ocmVhc29uID8/IFwiXCIsIFwidXRmLThcIikpO1xuICB9XG5cbiAgcGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnBpbmdDb3VudCArPSAxO1xuICB9XG5cbiAgdGVybWluYXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVhZHlTdGF0ZSA9IDM7XG4gICAgdGhpcy5lbWl0KFwiY2xvc2VcIiwgMTAwNiwgQnVmZmVyLmFsbG9jKDApKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNXZWJTb2NrZXQoc29ja2V0OiBGYWtlV2ViU29ja2V0KTogV2ViU29ja2V0VHJhbnNwb3J0IHtcbiAgcmV0dXJuIHtcbiAgICBnZXQgYnVmZmVyZWRBbW91bnQoKSB7XG4gICAgICByZXR1cm4gc29ja2V0LmJ1ZmZlcmVkQW1vdW50O1xuICAgIH0sXG4gICAgZ2V0IHJlYWR5U3RhdGUoKSB7XG4gICAgICByZXR1cm4gc29ja2V0LnJlYWR5U3RhdGU7XG4gICAgfSxcbiAgICBjbG9zZShjb2RlLCByZWFzb24pIHtcbiAgICAgIHNvY2tldC5jbG9zZShjb2RlLCByZWFzb24/LnRvU3RyaW5nKCkpO1xuICAgIH0sXG4gICAgb2ZmKC4uLmFyZ3MpIHtcbiAgICAgIHNvY2tldC5vZmYoLi4uYXJncyk7XG4gICAgfSxcbiAgICBvbiguLi5hcmdzKSB7XG4gICAgICBzb2NrZXQub24oLi4uYXJncyk7XG4gICAgfSxcbiAgICBwaW5nKCkge1xuICAgICAgc29ja2V0LnBpbmcoKTtcbiAgICB9LFxuICAgIHNlbmQoZGF0YSkge1xuICAgICAgc29ja2V0LnNlbmQoZGF0YS50b1N0cmluZygpKTtcbiAgICB9LFxuICAgIHRlcm1pbmF0ZSgpIHtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICB9LFxuICB9O1xufVxuXG4vLyDthYzsiqTtirgg642w7J207YSwIOyngeugrO2ZlCDqsrDqs7zrpbwg65CY64+M66aw64ukLiDquajsp4QgSlNPTuydtOuptCDsm5DrrLjsnYQg7Y+s7ZWo7ZWcIOyXkOufrOuhnCDthYzsiqTtirjrpbwg7Iuk7Yyo7Iuc7YKo64ukXG5mdW5jdGlvbiBwYXJzZVRlc3RKc29uPFQ+KHJhdzogc3RyaW5nKTogVCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIC8qIFNBRkVUWTog7YWM7Iqk7Yq46rCAIOyngeygkSDsp4HroKztmZTtlojqsbDrgpggcnVudGltZeydtCDsp4HroKztmZTtlZwg6rCS66eMIOuEmOq4tOuLpC4gKi8gSlNPTi5wYXJzZShcbiAgICAgIHJhdyxcbiAgICApIGFzIFQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDthYzsiqTtirggSlNPTiDtjIzsi7Eg7Iuk7YyoOiAke3Jhd31gLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGcmFtZXMoc29ja2V0OiBGYWtlV2ViU29ja2V0KTogQXJyYXk8eyBldmVudDogc3RyaW5nOyBkYXRhOiBvYmplY3QgfT4ge1xuICByZXR1cm4gc29ja2V0LnNlbnRNZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgcGFyc2VUZXN0SnNvbjx7IGV2ZW50OiBzdHJpbmc7IGRhdGE6IG9iamVjdCB9PihtZXNzYWdlKSxcbiAgKTtcbn1cblxudHlwZSBTY3JpcHRlZE1ldGhvZCA9XG4gIHwgXCJyZWdpc3RlclwiXG4gIHwgXCJhY3RpdmF0ZVwiXG4gIHwgXCJ1bnJlZ2lzdGVyXCJcbiAgfCBcInNldFVzZXJJZFwiXG4gIHwgXCJjbGVhclVzZXJJZFwiXG4gIHwgXCJqb2luXCJcbiAgfCBcImxlYXZlXCJcbiAgfCBcInJlc29sdmVSb3V0ZVwiXG4gIHwgXCJnZXRSb29tTWVtYmVyQ291bnRcIlxuICB8IFwic2h1dGRvd25cIjtcblxuLy8g64uk7J2MIO2YuOy2nCDsp4HsoITsl5Ag64G87JuM64Sj7J2EIOuPmeyekS4g64+Z6riwIHRocm93LCByZWplY3QsIOyngOyXsOuQnCBwcm9taXNl66W8IOq3uOuMgOuhnCDtnYnrgrTrgrjri6RcbnR5cGUgU2NyaXB0ZWRJbnRlcmNlcHRvciA9ICgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEluTWVtb3J5V2ViU29ja2V0UHJlc2VuY2VTdG9yZeulvCDqsJDsi7gg7Zi47LacIOyInOyEnOulvCDquLDroZ3tlZjqs6AsIOuplOyEnOuTnOuzhOuhnCDri6TsnYwg7Zi47Lac7J2YIOuPmeyekeydhCDsiqTtgazrpr3tirjtlaAg7IiYIOyeiOuKlCBzdG9yZS5cbiAqIO2YuOy2nCDquLDroZ3snYAgc3RvcmXqsIAg7Zi47Lac7J2EIFwi67Cb7J2AXCIg7Iuc7KCQ7JeQIOuCqOq4tOuLpC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjcmlwdGVkUHJlc2VuY2VTdG9yZSB7XG4gIHJlYWRvbmx5IGNhbGxzOiBzdHJpbmdbXSA9IFtdO1xuICByZWFkb25seSBpbm5lcjogSW5NZW1vcnlXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICBub2RlSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJjZXB0b3JzID0gbmV3IE1hcDxTY3JpcHRlZE1ldGhvZCwgU2NyaXB0ZWRJbnRlcmNlcHRvcltdPigpO1xuXG4gIGNvbnN0cnVjdG9yKGlubmVyOiBJbk1lbW9yeVdlYlNvY2tldFByZXNlbmNlU3RvcmUgPSBuZXcgSW5NZW1vcnlXZWJTb2NrZXRQcmVzZW5jZVN0b3JlKCkpIHtcbiAgICB0aGlzLmlubmVyID0gaW5uZXI7XG4gIH1cblxuICBuZXh0KG1ldGhvZDogU2NyaXB0ZWRNZXRob2QsIGludGVyY2VwdG9yOiBTY3JpcHRlZEludGVyY2VwdG9yKTogdGhpcyB7XG4gICAgY29uc3QgcXVldWUgPSB0aGlzLmludGVyY2VwdG9ycy5nZXQobWV0aG9kKSA/PyBbXTtcbiAgICBxdWV1ZS5wdXNoKGludGVyY2VwdG9yKTtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5zZXQobWV0aG9kLCBxdWV1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyDsnbTtm4Qg66qo65OgIO2YuOy2nOyXkCDqsJnsnYAg64+Z7J6R7J2EIOyggeyaqe2VnOuLpFxuICBhbHdheXMobWV0aG9kOiBTY3JpcHRlZE1ldGhvZCwgaW50ZXJjZXB0b3I6IFNjcmlwdGVkSW50ZXJjZXB0b3IpOiB0aGlzIHtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMV8wMDA7IGluZGV4ICs9IDEpIHtcbiAgICAgIHRoaXMubmV4dChtZXRob2QsIGludGVyY2VwdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICByZWdpc3RlcihpbnB1dDoge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIG5vZGVJZDogc3RyaW5nO1xuICAgIG5hbWVzcGFjZTogc3RyaW5nO1xuICAgIGFjdGl2ZTogYm9vbGVhbjtcbiAgICBjb25uZWN0ZWRBdDogRGF0ZTtcbiAgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNhbGxzLnB1c2goYHJlZ2lzdGVyOiR7aW5wdXQuc2Vzc2lvbklkfWApO1xuICAgIHJldHVybiB0aGlzLnJ1bihcInJlZ2lzdGVyXCIsICgpID0+IHRoaXMuaW5uZXIucmVnaXN0ZXIoaW5wdXQpKTtcbiAgfVxuXG4gIGFjdGl2YXRlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FsbHMucHVzaChgYWN0aXZhdGU6JHtzZXNzaW9uSWR9YCk7XG4gICAgcmV0dXJuIHRoaXMucnVuKFwiYWN0aXZhdGVcIiwgKCkgPT4gdGhpcy5pbm5lci5hY3RpdmF0ZShzZXNzaW9uSWQpKTtcbiAgfVxuXG4gIHVucmVnaXN0ZXIoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jYWxscy5wdXNoKGB1bnJlZ2lzdGVyOiR7c2Vzc2lvbklkfWApO1xuICAgIHJldHVybiB0aGlzLnJ1bihcInVucmVnaXN0ZXJcIiwgKCkgPT4gdGhpcy5pbm5lci51bnJlZ2lzdGVyKHNlc3Npb25JZCkpO1xuICB9XG5cbiAgc2V0VXNlcklkKHNlc3Npb25JZDogc3RyaW5nLCB1c2VySWQ6IFdlYlNvY2tldFVzZXJJZCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNhbGxzLnB1c2goYHNldFVzZXJJZDoke3Nlc3Npb25JZH06JHtKU09OLnN0cmluZ2lmeSh1c2VySWQpfWApO1xuICAgIHJldHVybiB0aGlzLnJ1bihcInNldFVzZXJJZFwiLCAoKSA9PiB0aGlzLmlubmVyLnNldFVzZXJJZChzZXNzaW9uSWQsIHVzZXJJZCkpO1xuICB9XG5cbiAgY2xlYXJVc2VySWQoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jYWxscy5wdXNoKGBjbGVhclVzZXJJZDoke3Nlc3Npb25JZH1gKTtcbiAgICByZXR1cm4gdGhpcy5ydW4oXCJjbGVhclVzZXJJZFwiLCAoKSA9PiB0aGlzLmlubmVyLmNsZWFyVXNlcklkKHNlc3Npb25JZCkpO1xuICB9XG5cbiAgam9pbihzZXNzaW9uSWQ6IHN0cmluZywgcm9vbUlkOiBXZWJTb2NrZXRSb29tSWQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jYWxscy5wdXNoKGBqb2luOiR7c2Vzc2lvbklkfToke3Jvb21JZH1gKTtcbiAgICByZXR1cm4gdGhpcy5ydW4oXCJqb2luXCIsICgpID0+IHRoaXMuaW5uZXIuam9pbihzZXNzaW9uSWQsIHJvb21JZCkpO1xuICB9XG5cbiAgbGVhdmUoc2Vzc2lvbklkOiBzdHJpbmcsIHJvb21JZDogV2ViU29ja2V0Um9vbUlkKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FsbHMucHVzaChgbGVhdmU6JHtzZXNzaW9uSWR9OiR7cm9vbUlkfWApO1xuICAgIHJldHVybiB0aGlzLnJ1bihcImxlYXZlXCIsICgpID0+IHRoaXMuaW5uZXIubGVhdmUoc2Vzc2lvbklkLCByb29tSWQpKTtcbiAgfVxuXG4gIHJlc29sdmVSb3V0ZShcbiAgICBhdWRpZW5jZTogV2ViU29ja2V0QXVkaWVuY2UsXG4gICAgbm9kZUlkOiBzdHJpbmcsXG4gICk6XG4gICAgfCB7IGxvY2FsU2Vzc2lvbklkczogc3RyaW5nW107IHJlbW90ZU5vZGVJZHM6IHN0cmluZ1tdIH1cbiAgICB8IFByb21pc2U8eyBsb2NhbFNlc3Npb25JZHM6IHN0cmluZ1tdOyByZW1vdGVOb2RlSWRzOiBzdHJpbmdbXSB9PiB7XG4gICAgdGhpcy5jYWxscy5wdXNoKGByZXNvbHZlUm91dGU6JHtub2RlSWR9OiR7YXVkaWVuY2UudHlwZX1gKTtcbiAgICByZXR1cm4gdGhpcy5ydW4oXCJyZXNvbHZlUm91dGVcIiwgKCkgPT4gdGhpcy5pbm5lci5yZXNvbHZlUm91dGUoYXVkaWVuY2UsIG5vZGVJZCkpO1xuICB9XG5cbiAgZ2V0Um9vbU1lbWJlckNvdW50KHJvb21JZDogV2ViU29ja2V0Um9vbUlkLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBudW1iZXIgfCBQcm9taXNlPG51bWJlcj4ge1xuICAgIHRoaXMuY2FsbHMucHVzaChgZ2V0Um9vbU1lbWJlckNvdW50OiR7cm9vbUlkfWApO1xuICAgIHJldHVybiB0aGlzLnJ1bihcImdldFJvb21NZW1iZXJDb3VudFwiLCAoKSA9PiB0aGlzLmlubmVyLmdldFJvb21NZW1iZXJDb3VudChyb29tSWQsIG5hbWVzcGFjZSkpO1xuICB9XG5cbiAgc2h1dGRvd24oKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2FsbHMucHVzaChcInNodXRkb3duXCIpO1xuICAgIHJldHVybiB0aGlzLnJ1bihcInNodXRkb3duXCIsICgpID0+IHVuZGVmaW5lZCk7XG4gIH1cblxuICBjYWxsc09mKHByZWZpeDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNhbGxzLmZpbHRlcigoY2FsbCkgPT4gY2FsbC5zdGFydHNXaXRoKHByZWZpeCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBydW48VD4obWV0aG9kOiBTY3JpcHRlZE1ldGhvZCwgZGVsZWdhdGU6ICgpID0+IFQgfCBQcm9taXNlPFQ+KTogVCB8IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGludGVyY2VwdG9yID0gdGhpcy5pbnRlcmNlcHRvcnMuZ2V0KG1ldGhvZCk/LnNoaWZ0KCk7XG4gICAgaWYgKCFpbnRlcmNlcHRvcikge1xuICAgICAgcmV0dXJuIGRlbGVnYXRlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gaW50ZXJjZXB0b3IoKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKCgpID0+IGRlbGVnYXRlKCkpO1xuICAgIH1cbiAgICByZXR1cm4gZGVsZWdhdGUoKTtcbiAgfVxufVxuXG4vKipcbiAqIO2VnCDtlITroZzshLjsiqQg7JWI7JeQ7IScIHRhcmdldE5vZGVJZHMg6riw7KSA7Jy866GcIGVudmVsb3Bl7J2EIOudvOyasO2Mhe2VmOuKlCBmYWtlIGNsdXN0ZXIg64Sk7Yq47JuM7YGsLlxuICog7KCE7IahIOq1rOqwhOydhCDtnYnrgrTrgrTquLAg7JyE7ZW0IGVudmVsb3Bl7J2EIEpTT04g7KeB66Cs7ZmUL+yXreyngeugrO2ZlO2VnCDrkqQg64uk7J2MIHRpY2vsl5Ag7KCE64us7ZWc64ukLlxuICovXG5leHBvcnQgY2xhc3MgSW5Qcm9jZXNzQ2x1c3Rlck5ldHdvcmsge1xuICByZWFkb25seSBwdWJsaXNoZWQ6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZVtdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnMgPSBuZXcgTWFwPHN0cmluZywgU2V0PFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZUhhbmRsZXI+PigpO1xuXG4gIGJ1cyhub2RlSWQ6IHN0cmluZyk6IEluUHJvY2Vzc0NsdXN0ZXJCdXMge1xuICAgIHJldHVybiBuZXcgSW5Qcm9jZXNzQ2x1c3RlckJ1cyhub2RlSWQsIHRoaXMpO1xuICB9XG5cbiAgc3Vic2NyaWJlKG5vZGVJZDogc3RyaW5nLCBoYW5kbGVyOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyKTogKCkgPT4gdm9pZCB7XG4gICAgY29uc3QgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzLmdldChub2RlSWQpID8/IG5ldyBTZXQoKTtcbiAgICBoYW5kbGVycy5hZGQoaGFuZGxlcik7XG4gICAgdGhpcy5oYW5kbGVycy5zZXQobm9kZUlkLCBoYW5kbGVycyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG5cbiAgZGVsaXZlcihlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB7XG4gICAgY29uc3Qgd2lyZSA9IEpTT04uc3RyaW5naWZ5KGVudmVsb3BlKTtcbiAgICB0aGlzLnB1Ymxpc2hlZC5wdXNoKHBhcnNlVGVzdEpzb248V2ViU29ja2V0Q2x1c3RlckVudmVsb3BlPih3aXJlKSk7XG4gICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0Tm9kZUlkIG9mIGVudmVsb3BlLnRhcmdldE5vZGVJZHMgPz8gW10pIHtcbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMuZ2V0KHRhcmdldE5vZGVJZCkgPz8gW10pIHtcbiAgICAgICAgICBjb25zdCByZWNlaXZlZCA9IHBhcnNlVGVzdEpzb248V2ViU29ja2V0Q2x1c3RlckVudmVsb3BlPih3aXJlKTtcbiAgICAgICAgICB2b2lkIFByb21pc2UucmVzb2x2ZShoYW5kbGVyKHJlY2VpdmVkKSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEluUHJvY2Vzc0NsdXN0ZXJCdXMgaW1wbGVtZW50cyBXZWJTb2NrZXRDbHVzdGVyQnVzIHtcbiAgc2h1dGRvd25DYWxscyA9IDA7XG4gIHVuc3Vic2NyaWJlQ2FsbHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5vZGVJZDogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbmV0d29yazogSW5Qcm9jZXNzQ2x1c3Rlck5ldHdvcmssXG4gICkge31cblxuICBwdWJsaXNoKGVudmVsb3BlOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGUpOiB2b2lkIHtcbiAgICB0aGlzLm5ldHdvcmsuZGVsaXZlcihlbnZlbG9wZSk7XG4gIH1cblxuICAvLyDsi6TsoJwgYWRhcHRlcuyymOufvCDqtazrj4Ug7JmE66OM66W8IHByb21pc2XroZwg7JWM66aw64ukXG4gIGFzeW5jIHN1YnNjcmliZShoYW5kbGVyOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVIYW5kbGVyKTogUHJvbWlzZTwoKSA9PiB2b2lkPiB7XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLm5ldHdvcmsuc3Vic2NyaWJlKHRoaXMubm9kZUlkLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy51bnN1YnNjcmliZUNhbGxzICs9IDE7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgIH07XG4gIH1cblxuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLnNodXRkb3duQ2FsbHMgKz0gMTtcbiAgfVxufVxuXG4vLyDrsJztlonrkJwgZW52ZWxvcGXsnYQg6riw66Gd7ZWY6rOgIO2FjOyKpO2KuOqwgCDsp4HsoJEg7IiY7IugIGVudmVsb3Bl7J2EIOyjvOyehe2VoCDsiJgg7J6I64qUIGJ1c1xuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0NsdXN0ZXJCdXMgaW1wbGVtZW50cyBXZWJTb2NrZXRDbHVzdGVyQnVzIHtcbiAgcmVhZG9ubHkgcHVibGlzaGVkOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGVbXSA9IFtdO1xuICByZWFkb25seSBoYW5kbGVycyA9IG5ldyBTZXQ8V2ViU29ja2V0Q2x1c3RlckVudmVsb3BlSGFuZGxlcj4oKTtcbiAgc2h1dGRvd25DYWxscyA9IDA7XG4gIHVuc3Vic2NyaWJlQ2FsbHMgPSAwO1xuICBub2RlSWQ/OiBzdHJpbmc7XG5cbiAgcHVibGlzaChlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogdm9pZCB8IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucHVibGlzaGVkLnB1c2goZW52ZWxvcGUpO1xuICB9XG5cbiAgc3Vic2NyaWJlKGhhbmRsZXI6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZUhhbmRsZXIpOiAoKCkgPT4gdm9pZCkgfCBQcm9taXNlPCgpID0+IHZvaWQ+IHtcbiAgICB0aGlzLmhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy51bnN1YnNjcmliZUNhbGxzICs9IDE7XG4gICAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZW1pdChlbnZlbG9wZTogV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIHRoaXMuaGFuZGxlcnMpIHtcbiAgICAgIGF3YWl0IGhhbmRsZXIoZW52ZWxvcGUpO1xuICAgIH1cbiAgfVxuXG4gIHNodXRkb3duKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNodXRkb3duQ2FsbHMgKz0gMTtcbiAgfVxufVxuXG4vLyDsoITsl60gdW5oYW5kbGVkUmVqZWN0aW9u7J2EIOyImOynke2VnOuLpC4g67CY7ZmY7ZWcIO2VqOyImOuhnCDtlbTsoJztlZjqs6Ag7IiY7KeRIOqysOqzvOulvCDrsJvripTri6RcbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0VW5oYW5kbGVkUmVqZWN0aW9ucygpOiAoKSA9PiBFcnJvcltdIHtcbiAgY29uc3QgY29sbGVjdGVkOiBFcnJvcltdID0gW107XG4gIGNvbnN0IGxpc3RlbmVyID0gKHJlYXNvbjogRXJyb3IpID0+IHtcbiAgICBjb2xsZWN0ZWQucHVzaChyZWFzb24pO1xuICB9O1xuICBwcm9jZXNzLm9uKFwidW5oYW5kbGVkUmVqZWN0aW9uXCIsIGxpc3RlbmVyKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBwcm9jZXNzLm9mZihcInVuaGFuZGxlZFJlamVjdGlvblwiLCBsaXN0ZW5lcik7XG4gICAgcmV0dXJuIGNvbGxlY3RlZDtcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBVXFFLHVCQUFBO0FBR3JFLGVBQXNCLFdBQVcsU0FBaUIsR0FBa0I7Q0FDbEUsS0FBSyxJQUFJLFFBQVEs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
|
package/dist/stream/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export * from "./ws-audience";
|
|
|
3
3
|
export * from "./ws-cluster-bus";
|
|
4
4
|
export * from "./ws-core";
|
|
5
5
|
export * from "./ws-presence-store";
|
|
6
|
+
export * from "./ws-session-id";
|
|
6
7
|
export * from "./ws-telemetry";
|
|
7
8
|
export * from "./ws-telemetry-memory";
|
|
8
9
|
export * from "./ws-telemetry-trace";
|
|
@@ -1 +1 @@
|
|
|
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,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,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,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,MAAM,CAAC;AACrB,cAAc,eAAe,CAAC"}
|
package/dist/stream/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createMockSSEFactory, createSSEFactory, init_sse } from "./sse.js";
|
|
2
2
|
import { WebSocketAudience, init_ws_audience } from "./ws-audience.js";
|
|
3
|
+
import { createWebSocketNodeId, createWebSocketSessionId, init_ws_session_id, parseWebSocketSessionNodeId } from "./ws-session-id.js";
|
|
3
4
|
import { NoopWebSocketClusterBus, init_ws_cluster_bus } from "./ws-cluster-bus.js";
|
|
4
5
|
import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory } from "./ws-telemetry-memory.js";
|
|
5
6
|
import { formatTraceParent, generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
|
|
@@ -8,17 +9,27 @@ import { InMemoryWebSocketPresenceStore, init_ws_presence_store } from "./ws-pre
|
|
|
8
9
|
import { WebSocketRegistry, init_ws_registry } from "./ws-registry.js";
|
|
9
10
|
import { WebSocketRuntime, createWebSocketRuntime, init_ws } from "./ws.js";
|
|
10
11
|
import "./ws-core.js";
|
|
11
|
-
|
|
12
|
+
// src/stream/index.ts
|
|
13
|
+
init_sse();
|
|
14
|
+
init_ws_audience();
|
|
15
|
+
init_ws_session_id();
|
|
16
|
+
init_ws_cluster_bus();
|
|
17
|
+
init_ws_telemetry_memory();
|
|
18
|
+
init_ws_telemetry_trace();
|
|
19
|
+
init_ws_telemetry();
|
|
20
|
+
init_ws_presence_store();
|
|
21
|
+
init_ws_registry();
|
|
22
|
+
init_ws();
|
|
12
23
|
init_sse();
|
|
13
24
|
init_ws_audience();
|
|
14
25
|
init_ws_cluster_bus();
|
|
15
26
|
init_ws_presence_store();
|
|
27
|
+
init_ws_session_id();
|
|
16
28
|
init_ws_telemetry();
|
|
17
29
|
init_ws_telemetry_memory();
|
|
18
30
|
init_ws_telemetry_trace();
|
|
19
31
|
init_ws();
|
|
20
32
|
init_ws_registry();
|
|
21
|
-
|
|
22
|
-
export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, NoopWebSocketTelemetryController, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WebSocketTelemetryControllerImpl, createMockSSEFactory, createSSEFactory, createWebSocketRuntime, createWebSocketTelemetryController, formatTraceParent, generateSpanId, generateTraceId, isPromiseLike, parseTraceParent };
|
|
33
|
+
export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, InMemoryWebSocketPresenceStore, NoopWebSocketClusterBus, NoopWebSocketTelemetryController, WebSocketAudience, WebSocketRegistry, WebSocketRuntime, WebSocketTelemetryControllerImpl, createMockSSEFactory, createSSEFactory, createWebSocketNodeId, createWebSocketRuntime, createWebSocketSessionId, createWebSocketTelemetryController, formatTraceParent, generateSpanId, generateTraceId, isPromiseLike, parseTraceParent, parseWebSocketSessionNodeId };
|
|
23
34
|
|
|
24
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9zc2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLWF1ZGllbmNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cy1jbHVzdGVyLWJ1c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtY29yZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcHJlc2VuY2Utc3RvcmVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLXNlc3Npb24taWRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dzLXRlbGVtZXRyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LW1lbW9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LXRyYWNlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3MtcmVnaXN0cnlcIjtcbiJdLCJtYXBwaW5ncyI6IiJ9
|
package/dist/stream/sse.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
|
|
2
|
+
// src/stream/sse.ts
|
|
3
3
|
function createSSEFactory(socket, reply, _events) {
|
|
4
4
|
return new SSEConnectionImpl(socket, reply);
|
|
5
5
|
}
|
|
@@ -63,7 +63,6 @@ var init_sse = __esmMin((() => {
|
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
65
|
}));
|
|
66
|
-
//#endregion
|
|
67
66
|
init_sse();
|
|
68
67
|
export { createMockSSEFactory, createSSEFactory, init_sse };
|
|
69
68
|
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { type WebSocketAudience } from "./ws-audience";
|
|
2
2
|
import { type WebSocketPresenceStore } from "./ws-presence-store";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
};
|
|
3
|
+
/**
|
|
4
|
+
* publish 대상 중 원격 노드를 찾는다. 로컬 대상은 registry 메모리로 해석하므로 여기서는 원격 노드만 다룬다.
|
|
5
|
+
*/
|
|
7
6
|
export declare class WebSocketAudienceResolver {
|
|
8
7
|
private readonly options;
|
|
9
8
|
constructor(options: {
|
|
10
9
|
nodeId: string;
|
|
11
10
|
presenceStore: WebSocketPresenceStore;
|
|
12
11
|
});
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
* `connections` audience는 세션 ID에 든 노드 ID로 store 조회 없이 라우팅한다.
|
|
14
|
+
* 그 밖의 audience는 store.resolveRoute를 호출하며, 동기 throw도 rejection으로 바꾼다.
|
|
15
|
+
*/
|
|
16
|
+
resolveRemoteNodeIds(audience: WebSocketAudience): Promise<string[]>;
|
|
14
17
|
}
|
|
15
18
|
//# sourceMappingURL=ws-audience-resolver.d.ts.map
|
|
@@ -1 +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;
|
|
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;AAGlE;;GAEG;AACH,qBAAa,yBAAyB;IAElC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAD1B,YACmB,OAAO,EAAE;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,sBAAsB,CAAC;KACvC,EACC;IAEJ;;;OAGG;IACG,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBzE;CACF"}
|
|
@@ -1,31 +1,33 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
|
|
2
|
+
import { init_ws_session_id, parseWebSocketSessionNodeId } from "./ws-session-id.js";
|
|
3
|
+
// src/stream/ws-audience-resolver.ts
|
|
3
4
|
var WebSocketAudienceResolver;
|
|
4
5
|
var init_ws_audience_resolver = __esmMin((() => {
|
|
6
|
+
init_ws_session_id();
|
|
5
7
|
WebSocketAudienceResolver = class {
|
|
6
8
|
options;
|
|
7
9
|
constructor(options) {
|
|
8
10
|
this.options = options;
|
|
9
11
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
/**
|
|
13
|
+
* `connections` audience는 세션 ID에 든 노드 ID로 store 조회 없이 라우팅한다.
|
|
14
|
+
* 그 밖의 audience는 store.resolveRoute를 호출하며, 동기 throw도 rejection으로 바꾼다.
|
|
15
|
+
*/
|
|
16
|
+
async resolveRemoteNodeIds(audience) {
|
|
17
|
+
if (audience.type === "connections") {
|
|
18
|
+
const nodeIds = /* @__PURE__ */ new Set();
|
|
19
|
+
for (const connectionId of audience.connectionIds) {
|
|
20
|
+
const nodeId = parseWebSocketSessionNodeId(connectionId);
|
|
21
|
+
if (nodeId !== void 0 && nodeId !== this.options.nodeId) nodeIds.add(nodeId);
|
|
17
22
|
}
|
|
18
|
-
|
|
23
|
+
return [...nodeIds];
|
|
19
24
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
remoteNodeIds: [...remoteNodeIds]
|
|
23
|
-
};
|
|
25
|
+
const plan = await Promise.resolve().then(() => this.options.presenceStore.resolveRoute(audience, this.options.nodeId));
|
|
26
|
+
return [...new Set(plan.remoteNodeIds)].filter((nodeId) => nodeId !== this.options.nodeId);
|
|
24
27
|
}
|
|
25
28
|
};
|
|
26
29
|
}));
|
|
27
|
-
//#endregion
|
|
28
30
|
init_ws_audience_resolver();
|
|
29
31
|
export { WebSocketAudienceResolver, init_ws_audience_resolver };
|
|
30
32
|
|
|
31
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtYXVkaWVuY2UtcmVzb2x2ZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1hdWRpZW5jZS1yZXNvbHZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgV2ViU29ja2V0UHJlc2VuY2VTdG9yZSB9IGZyb20gXCIuL3dzLXByZXNlbmNlLXN0b3JlXCI7XG5pbXBvcnQgeyBwYXJzZVdlYlNvY2tldFNlc3Npb25Ob2RlSWQgfSBmcm9tIFwiLi93cy1zZXNzaW9uLWlkXCI7XG5cbi8qKlxuICogcHVibGlzaCDrjIDsg4Eg7KSRIOybkOqyqSDrhbjrk5zrpbwg7LC+64qU64ukLiDroZzsu6wg64yA7IOB7J2AIHJlZ2lzdHJ5IOuplOuqqOumrOuhnCDtlbTshJ3tlZjrr4DroZwg7Jes6riw7ISc64qUIOybkOqyqSDrhbjrk5zrp4wg64uk66Os64ukLlxuICovXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0QXVkaWVuY2VSZXNvbHZlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczoge1xuICAgICAgbm9kZUlkOiBzdHJpbmc7XG4gICAgICBwcmVzZW5jZVN0b3JlOiBXZWJTb2NrZXRQcmVzZW5jZVN0b3JlO1xuICAgIH0sXG4gICkge31cblxuICAvKipcbiAgICogYGNvbm5lY3Rpb25zYCBhdWRpZW5jZeuKlCDshLjshZggSUTsl5Ag65OgIOuFuOuTnCBJROuhnCBzdG9yZSDsobDtmowg7JeG7J20IOudvOyasO2Mhe2VnOuLpC5cbiAgICog6re4IOuwluydmCBhdWRpZW5jZeuKlCBzdG9yZS5yZXNvbHZlUm91dGXrpbwg7Zi47Lac7ZWY66mwLCDrj5nquLAgdGhyb3frj4QgcmVqZWN0aW9u7Jy866GcIOuwlOq+vOuLpC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVSZW1vdGVOb2RlSWRzKGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoYXVkaWVuY2UudHlwZSA9PT0gXCJjb25uZWN0aW9uc1wiKSB7XG4gICAgICBjb25zdCBub2RlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBmb3IgKGNvbnN0IGNvbm5lY3Rpb25JZCBvZiBhdWRpZW5jZS5jb25uZWN0aW9uSWRzKSB7XG4gICAgICAgIGNvbnN0IG5vZGVJZCA9IHBhcnNlV2ViU29ja2V0U2Vzc2lvbk5vZGVJZChjb25uZWN0aW9uSWQpO1xuICAgICAgICBpZiAobm9kZUlkICE9PSB1bmRlZmluZWQgJiYgbm9kZUlkICE9PSB0aGlzLm9wdGlvbnMubm9kZUlkKSB7XG4gICAgICAgICAgbm9kZUlkcy5hZGQobm9kZUlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFsuLi5ub2RlSWRzXTtcbiAgICB9XG5cbiAgICBjb25zdCBwbGFuID0gYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PlxuICAgICAgdGhpcy5vcHRpb25zLnByZXNlbmNlU3RvcmUucmVzb2x2ZVJvdXRlKGF1ZGllbmNlLCB0aGlzLm9wdGlvbnMubm9kZUlkKSxcbiAgICApO1xuICAgIHJldHVybiBbLi4ubmV3IFNldChwbGFuLnJlbW90ZU5vZGVJZHMpXS5maWx0ZXIoKG5vZGVJZCkgPT4gbm9kZUlkICE9PSB0aGlzLm9wdGlvbnMubm9kZUlkKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztDQUU2RCxtQkFBQTtDQUtoRCw0QkFBYixNQUF1QztFQUVsQjtFQURuQixZQUNFLFNBSUE7R0FKaUIsS0FBQSxVQUFBO0VBSWhCOzs7OztFQU1ILE1BQU0scUJBQXFCLFVBQWdEO0dBQ3pFLElBQUksU0FBUyxTQUFTLGVBQWU7SUFDbkMsTUFBTSwwQkFBVSxJQUFJLElBQVk7SUFDaEMsS0FBSyxNQUFNLGdCQUFnQixTQUFTLGVBQWU7S0FDakQsTUFBTSxTQUFTLDRCQUE0QixZQUFZO0tBQ3ZELElBQUksV0FBVyxVQUFhLFdBQVcsS0FBSyxRQUFRLFFBQ2xELFFBQVEsSUFBSSxNQUFNO0lBRXRCO0lBQ0EsT0FBTyxDQUFDLEdBQUcsT0FBTztHQUNwQjtHQUVBLE1BQU0sT0FBTyxNQUFNLFFBQVEsUUFBUSxDQUFDLENBQUMsV0FDbkMsS0FBSyxRQUFRLGNBQWMsYUFBYSxVQUFVLEtBQUssUUFBUSxNQUFNLENBQ3ZFO0dBQ0EsT0FBTyxDQUFDLEdBQUcsSUFBSSxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLFdBQVcsV0FBVyxLQUFLLFFBQVEsTUFBTTtFQUMzRjtDQUNGIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
|
|
2
|
+
// src/stream/ws-audience.ts
|
|
3
3
|
var WebSocketAudience;
|
|
4
4
|
var init_ws_audience = __esmMin((() => {
|
|
5
5
|
WebSocketAudience = {
|
|
@@ -38,7 +38,6 @@ var init_ws_audience = __esmMin((() => {
|
|
|
38
38
|
}
|
|
39
39
|
};
|
|
40
40
|
}));
|
|
41
|
-
//#endregion
|
|
42
41
|
init_ws_audience();
|
|
43
42
|
export { WebSocketAudience, init_ws_audience };
|
|
44
43
|
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { type WebSocketAudience } from "./ws-audience";
|
|
2
|
+
import { type MaybePromise } from "./ws-core";
|
|
3
|
+
/**
|
|
4
|
+
* 노드 간 publish envelope. 원본 data 대신 발행 노드가 route별로 한 번 검증·인코딩한 frame을 싣는다.
|
|
5
|
+
* 수신 노드는 자기 메모리로 audience를 해석하고, 각 연결의 route frame을 재검증 없이 그대로 보낸다.
|
|
6
|
+
*/
|
|
2
7
|
export type WebSocketClusterEnvelope = {
|
|
3
8
|
id: string;
|
|
4
9
|
sourceNodeId: string;
|
|
5
|
-
targetNodeIds
|
|
6
|
-
namespace?: string;
|
|
10
|
+
targetNodeIds: string[];
|
|
7
11
|
audience: WebSocketAudience;
|
|
8
12
|
event: string;
|
|
9
|
-
|
|
13
|
+
frames: Record<string, string>;
|
|
10
14
|
emittedAt: number;
|
|
11
15
|
};
|
|
12
16
|
export type WebSocketClusterEnvelopeHandler = (envelope: WebSocketClusterEnvelope) => void | Promise<void>;
|
|
13
17
|
export interface WebSocketClusterBus {
|
|
18
|
+
readonly nodeId?: string;
|
|
14
19
|
publish(envelope: WebSocketClusterEnvelope): void | Promise<void>;
|
|
15
|
-
subscribe(handler: WebSocketClusterEnvelopeHandler): () => void
|
|
20
|
+
subscribe(handler: WebSocketClusterEnvelopeHandler): MaybePromise<() => void>;
|
|
16
21
|
shutdown(): void | Promise<void>;
|
|
17
22
|
}
|
|
18
23
|
export declare class NoopWebSocketClusterBus implements WebSocketClusterBus {
|
|
@@ -1 +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;
|
|
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;AACvD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,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;IAElC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElE,SAAS,CAAC,OAAO,EAAE,+BAA+B,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC;IAC9E,QAAQ,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI,CAAG;IAErD,SAAS,CAAC,QAAQ,EAAE,+BAA+B,GAAG,MAAM,IAAI,CAE/D;IAED,QAAQ,IAAI,IAAI,CAAG;CACpB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
|
-
|
|
2
|
+
// src/stream/ws-cluster-bus.ts
|
|
3
3
|
var NoopWebSocketClusterBus;
|
|
4
4
|
var init_ws_cluster_bus = __esmMin((() => {
|
|
5
5
|
NoopWebSocketClusterBus = class {
|
|
@@ -10,8 +10,7 @@ var init_ws_cluster_bus = __esmMin((() => {
|
|
|
10
10
|
shutdown() {}
|
|
11
11
|
};
|
|
12
12
|
}));
|
|
13
|
-
//#endregion
|
|
14
13
|
init_ws_cluster_bus();
|
|
15
14
|
export { NoopWebSocketClusterBus, init_ws_cluster_bus };
|
|
16
15
|
|
|
17
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtY2x1c3Rlci1idXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy1jbHVzdGVyLWJ1cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIFdlYlNvY2tldEF1ZGllbmNlIH0gZnJvbSBcIi4vd3MtYXVkaWVuY2VcIjtcbmltcG9ydCB7IHR5cGUgTWF5YmVQcm9taXNlIH0gZnJvbSBcIi4vd3MtY29yZVwiO1xuXG4vKipcbiAqIOuFuOuTnCDqsIQgcHVibGlzaCBlbnZlbG9wZS4g7JuQ67O4IGRhdGEg64yA7IugIOuwnO2WiSDrhbjrk5zqsIAgcm91dGXrs4TroZwg7ZWcIOuyiCDqsoDspp3Ct+yduOy9lOuUqe2VnCBmcmFtZeydhCDsi6PripTri6QuXG4gKiDsiJjsi6Ag64W465Oc64qUIOyekOq4sCDrqZTrqqjrpqzroZwgYXVkaWVuY2Xrpbwg7ZW07ISd7ZWY6rOgLCDqsIEg7Jew6rKw7J2YIHJvdXRlIGZyYW1l7J2EIOyerOqygOymnSDsl4bsnbQg6re464yA66GcIOuztOuCuOuLpC5cbiAqL1xuZXhwb3J0IHR5cGUgV2ViU29ja2V0Q2x1c3RlckVudmVsb3BlID0ge1xuICBpZDogc3RyaW5nO1xuICBzb3VyY2VOb2RlSWQ6IHN0cmluZztcbiAgdGFyZ2V0Tm9kZUlkczogc3RyaW5nW107XG4gIGF1ZGllbmNlOiBXZWJTb2NrZXRBdWRpZW5jZTtcbiAgZXZlbnQ6IHN0cmluZztcbiAgLy8gcm91dGVLZXkg4oaSIOyduOy9lOuUqeuQnCBmcmFtZS4g7J2067Kk7Yq466W8IOyEoOyWuO2VmOyngCDslYrslZjqsbDrgpgg6rKA7Kad7JeQIOyLpO2MqO2VnCByb3V0ZeuKlCDruaDsp4Tri6RcbiAgZnJhbWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBlbWl0dGVkQXQ6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZUhhbmRsZXIgPSAoXG4gIGVudmVsb3BlOiBXZWJTb2NrZXRDbHVzdGVyRW52ZWxvcGUsXG4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldENsdXN0ZXJCdXMge1xuICAvLyDshKTsoJXtlZjrqbQgcnVudGltZSBub2RlSWTsmYAg6rCZ7JWE7JW8IO2VnOuLpC4g64uk66W066m0IHJ1bnRpbWUg7IOd7ISx7J20IOyLpO2MqO2VnOuLpFxuICByZWFkb25seSBub2RlSWQ/OiBzdHJpbmc7XG4gIHB1Ymxpc2goZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAvLyDqtazrj4Ug7JmE66OM66W8IHByb21pc2XroZwg7JWM66a0IOyImCDsnojri6QuIOuwmO2ZmO2VnCDtlbTsoJwg7ZWo7IiY64qUIHJ1bnRpbWUgc2h1dGRvd27sl5DshJwg7ZWcIOuyiCDtmLjstpzrkJzri6RcbiAgc3Vic2NyaWJlKGhhbmRsZXI6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZUhhbmRsZXIpOiBNYXliZVByb21pc2U8KCkgPT4gdm9pZD47XG4gIHNodXRkb3duKCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgTm9vcFdlYlNvY2tldENsdXN0ZXJCdXMgaW1wbGVtZW50cyBXZWJTb2NrZXRDbHVzdGVyQnVzIHtcbiAgcHVibGlzaChfZW52ZWxvcGU6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZSk6IHZvaWQge31cblxuICBzdWJzY3JpYmUoX2hhbmRsZXI6IFdlYlNvY2tldENsdXN0ZXJFbnZlbG9wZUhhbmRsZXIpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gKCkgPT4ge307XG4gIH1cblxuICBzaHV0ZG93bigpOiB2b2lkIHt9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Q0ErQmEsMEJBQWIsTUFBb0U7RUFDbEUsUUFBUSxXQUEyQyxDQUFDO0VBRXBELFVBQVUsVUFBdUQ7R0FDL0QsYUFBYSxDQUFDO0VBQ2hCO0VBRUEsV0FBaUIsQ0FBQztDQUNwQiJ9
|
package/dist/stream/ws-core.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { type z } from "zod";
|
|
1
2
|
export type WebSocketUserId = number | string;
|
|
2
3
|
export type WebSocketRoomId = string;
|
|
4
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
3
5
|
export interface ManagedWebSocketConnection {
|
|
4
6
|
id: string;
|
|
5
7
|
namespace: string;
|
|
@@ -8,6 +10,14 @@ export interface ManagedWebSocketConnection {
|
|
|
8
10
|
publishUntyped<Data>(event: string, data: Data): void;
|
|
9
11
|
close(code?: number, reason?: string): void;
|
|
10
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* registry가 소유하는 로컬 연결. 인코딩된 frame을 그대로 보내는 경로와 route 식별자를 가진다.
|
|
15
|
+
*/
|
|
16
|
+
export interface WebSocketFrameConnection extends ManagedWebSocketConnection {
|
|
17
|
+
readonly routeKey?: string;
|
|
18
|
+
readonly outEvents: z.ZodObject;
|
|
19
|
+
sendFrame(event: string, frame: string): void;
|
|
20
|
+
}
|
|
11
21
|
export type WebSocketRegistryStats = {
|
|
12
22
|
totalConnections: number;
|
|
13
23
|
totalRooms: number;
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"ws-core.d.ts","sourceRoot":"","sources":["../../src/stream/ws-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,MAAM,CAAC;AAC9C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC;AACrC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAE7C,MAAM,WAAW,0BAA0B;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAEhB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,0BAA0B;IAE1E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC;IAChC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C;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"}
|
|
@@ -1,32 +1,58 @@
|
|
|
1
|
+
import { type z } from "zod";
|
|
1
2
|
import { type WebSocketAudience } from "./ws-audience";
|
|
2
3
|
import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
|
|
3
4
|
import { type WebSocketClusterBus } from "./ws-cluster-bus";
|
|
4
5
|
import { type WebSocketLocalConnectionStore } from "./ws-local-connection-store";
|
|
5
6
|
import { type WebSocketTelemetryController } from "./ws-telemetry";
|
|
7
|
+
export type WebSocketRouteDefinition = {
|
|
8
|
+
routeKey: string;
|
|
9
|
+
outEvents: z.ZodObject;
|
|
10
|
+
};
|
|
6
11
|
export declare class WebSocketDeliveryEngine {
|
|
7
12
|
private readonly options;
|
|
8
13
|
private readonly pendingFanOutJobs;
|
|
9
14
|
private fanOutFlushScheduled;
|
|
10
|
-
private readonly
|
|
15
|
+
private readonly routes;
|
|
16
|
+
private publishQueue;
|
|
17
|
+
private readonly subscription;
|
|
18
|
+
private stopped;
|
|
11
19
|
private readonly telemetry;
|
|
12
20
|
private readonly unregisterMetricSource;
|
|
13
21
|
constructor(options: {
|
|
14
22
|
nodeId: string;
|
|
15
23
|
localConnections: WebSocketLocalConnectionStore;
|
|
24
|
+
resolveLocalSessionIds: (audience: WebSocketAudience) => string[];
|
|
16
25
|
audienceResolver: WebSocketAudienceResolver;
|
|
17
26
|
clusterBus: WebSocketClusterBus;
|
|
18
27
|
telemetryController?: WebSocketTelemetryController;
|
|
19
28
|
});
|
|
20
|
-
|
|
21
|
-
|
|
29
|
+
registerRoute(routeKey: string, outEvents: z.ZodObject): void;
|
|
30
|
+
replaceRoutes(routes: WebSocketRouteDefinition[]): void;
|
|
31
|
+
/**
|
|
32
|
+
* 발행 노드에서 route별로 한 번 검증·인코딩하고, 로컬 fan-out은 즉시 큐에 넣는다.
|
|
33
|
+
* 원격 라우팅과 cluster publish는 노드 단위 직렬 큐에서 처리한다. 반환한 promise는 reject하지 않는다.
|
|
34
|
+
*/
|
|
35
|
+
publishToAudience<Data>(audience: WebSocketAudience, event: string, data: Data): Promise<void>;
|
|
36
|
+
drainPublishes(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* 구독을 해제하고 cluster bus를 종료한다. 구독이 deadline까지 끝나지 않으면 늦게 끝날 때 해제한다.
|
|
39
|
+
*/
|
|
40
|
+
shutdown(deadline: Promise<void>): Promise<void>;
|
|
22
41
|
getTelemetrySnapshot(): {
|
|
23
42
|
pendingFanOutJobs: number;
|
|
24
43
|
pendingFanOutTargets: number;
|
|
25
44
|
};
|
|
45
|
+
private subscribe;
|
|
46
|
+
private safeUnsubscribe;
|
|
47
|
+
private resolveRemoteNodeIds;
|
|
48
|
+
private publishRemote;
|
|
26
49
|
private handleClusterEnvelope;
|
|
50
|
+
private emitPublishRejected;
|
|
51
|
+
private emitRouteFailed;
|
|
52
|
+
private emitFanOutResolved;
|
|
27
53
|
private enqueueFanOut;
|
|
28
54
|
private scheduleFanOutFlush;
|
|
29
55
|
private flushFanOutJobs;
|
|
30
|
-
private
|
|
56
|
+
private safeSend;
|
|
31
57
|
}
|
|
32
58
|
//# sourceMappingURL=ws-delivery.d.ts.map
|