sonamu 0.10.11 → 0.10.13
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/agents/agent.d.ts +1 -1
- package/dist/ai/agents/agent.d.ts.map +1 -1
- package/dist/ai/agents/agent.js +5 -6
- package/dist/ai/agents/types.d.ts +1 -1
- package/dist/ai/agents/types.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +18 -18
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +17 -15
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +3 -2
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/options.js +16 -16
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/provider.js +9 -9
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/utils.js +1 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +17 -17
- package/dist/api/code-converters.d.ts +4 -2
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +100 -19
- package/dist/api/config.d.ts +16 -1
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +28 -21
- package/dist/api/context.d.ts +2 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +18 -11
- package/dist/api/http-validator.d.ts +36 -0
- package/dist/api/http-validator.d.ts.map +1 -0
- package/dist/api/http-validator.js +72 -0
- package/dist/api/index.js +6 -4
- package/dist/api/sonamu.d.ts +59 -20
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +250 -106
- package/dist/api/websocket-helpers.d.ts +7 -5
- package/dist/api/websocket-helpers.d.ts.map +1 -1
- package/dist/api/websocket-helpers.js +6 -6
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +1 -1
- package/dist/auth/audit-log/client-ip.d.ts +1 -1
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -1
- package/dist/auth/audit-log/client-ip.js +4 -2
- package/dist/auth/audit-log/events.d.ts +5 -1
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +1 -1
- package/dist/auth/audit-log/plugin.d.ts +0 -8
- package/dist/auth/audit-log/plugin.d.ts.map +1 -1
- package/dist/auth/audit-log/plugin.js +48 -52
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +16 -12
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +1 -1
- package/dist/auth/better-auth-request.d.ts.map +1 -1
- package/dist/auth/better-auth-request.js +6 -5
- package/dist/auth/knex-adapter.js +1 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts +13 -1
- package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -1
- package/dist/auth/plugins/entity-definitions/index.js +1 -1
- package/dist/auth/plugins/wrappers/admin.d.ts +1 -1
- package/dist/bin/build-config.d.ts +25 -0
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +105 -2
- package/dist/bin/cli.js +133 -29
- package/dist/bin/compiler-policy.d.ts +3 -0
- package/dist/bin/compiler-policy.d.ts.map +1 -0
- package/dist/bin/compiler-policy.js +24 -0
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +5 -3
- package/dist/bin/test-command.d.ts +22 -1
- package/dist/bin/test-command.d.ts.map +1 -1
- package/dist/bin/test-command.js +18 -10
- package/dist/bin/ts-loader-registration.d.ts +7 -1
- package/dist/bin/ts-loader-registration.d.ts.map +1 -1
- package/dist/bin/ts-loader-registration.js +13 -4
- package/dist/cache/decorator.d.ts.map +1 -1
- package/dist/cache/decorator.js +11 -4
- package/dist/compress/compress.d.ts.map +1 -1
- package/dist/compress/compress.js +1 -1
- package/dist/cone/cone-generator.d.ts +14 -1
- package/dist/cone/cone-generator.d.ts.map +1 -1
- package/dist/cone/cone-generator.js +13 -9
- package/dist/database/_batch_update.js +1 -1
- package/dist/database/base-model.d.ts +22 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +26 -16
- package/dist/database/base-model.types.d.ts +15 -3
- package/dist/database/base-model.types.d.ts.map +1 -1
- package/dist/database/db.d.ts +12 -2
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +10 -7
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +17 -14
- package/dist/database/puri.d.ts +11 -9
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +93 -79
- package/dist/database/puri.types.d.ts +21 -21
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +1 -1
- package/dist/database/upsert-builder.d.ts +12 -10
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +20 -12
- package/dist/dict/sd.d.ts.map +1 -1
- package/dist/dict/sd.js +1 -1
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +1 -1
- package/dist/dict/utils.d.ts.map +1 -1
- package/dist/dict/utils.js +7 -2
- package/dist/entity/entity-manager.d.ts +13 -4
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +19 -11
- package/dist/entity/entity-template-cone.d.ts +73 -5
- package/dist/entity/entity-template-cone.d.ts.map +1 -1
- package/dist/entity/entity-template-cone.js +4 -2
- package/dist/entity/entity.d.ts +6 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +30 -28
- package/dist/env.d.ts +3 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +7 -2
- package/dist/exceptions/so-exceptions.d.ts +24 -20
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +4 -2
- package/dist/filter/utils.d.ts +7 -2
- package/dist/filter/utils.d.ts.map +1 -1
- package/dist/filter/utils.js +8 -6
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/logger/configure.d.ts.map +1 -1
- package/dist/logger/configure.js +10 -10
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +50 -46
- package/dist/migration/index-where-predicate.d.ts.map +1 -1
- package/dist/migration/index-where-predicate.js +22 -8
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +1 -1
- package/dist/migration/migrator.d.ts +61 -36
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +276 -167
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +51 -36
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +1 -1
- package/dist/migration/types.d.ts +54 -0
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +2 -2
- package/dist/naite/naite.d.ts +74 -15
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +5 -19
- package/dist/runtime-type.d.ts +6 -0
- package/dist/runtime-type.d.ts.map +1 -0
- package/dist/runtime-type.js +26 -0
- package/dist/ssr/hmr-opt-out.d.ts +26 -0
- package/dist/ssr/hmr-opt-out.d.ts.map +1 -0
- package/dist/ssr/hmr-opt-out.js +59 -0
- package/dist/ssr/renderer.d.ts.map +1 -1
- package/dist/ssr/renderer.js +4 -1
- package/dist/storage/base-file.js +14 -14
- package/dist/storage/buffered-file.d.ts +2 -2
- package/dist/storage/buffered-file.d.ts.map +1 -1
- package/dist/storage/buffered-file.js +12 -12
- package/dist/storage/s3-driver.d.ts.map +1 -1
- package/dist/storage/s3-driver.js +1 -1
- package/dist/storage/uploaded-file.d.ts +2 -2
- package/dist/storage/uploaded-file.d.ts.map +1 -1
- package/dist/storage/uploaded-file.js +8 -8
- package/dist/stream/sse.js +11 -11
- package/dist/stream/ws-core.d.ts +1 -1
- package/dist/stream/ws-core.d.ts.map +1 -1
- package/dist/stream/ws-delivery.d.ts +1 -1
- package/dist/stream/ws-delivery.d.ts.map +1 -1
- package/dist/stream/ws-delivery.js +6 -4
- package/dist/stream/ws-local-connection-store.d.ts.map +1 -1
- package/dist/stream/ws-local-connection-store.js +4 -2
- package/dist/stream/ws-presence-store.js +1 -1
- package/dist/stream/ws-registry.d.ts +4 -4
- package/dist/stream/ws-registry.d.ts.map +1 -1
- package/dist/stream/ws-registry.js +4 -2
- package/dist/stream/ws-telemetry.d.ts +16 -12
- package/dist/stream/ws-telemetry.d.ts.map +1 -1
- package/dist/stream/ws-telemetry.js +22 -18
- package/dist/stream/ws.d.ts +18 -12
- package/dist/stream/ws.d.ts.map +1 -1
- package/dist/stream/ws.js +26 -22
- package/dist/syncer/api-parser.js +1 -1
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +7 -8
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +13 -14
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +5 -6
- package/dist/syncer/file-copy.d.ts +5 -0
- package/dist/syncer/file-copy.d.ts.map +1 -0
- package/dist/syncer/file-copy.js +36 -0
- package/dist/syncer/file-patterns.d.ts +1 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +5 -2
- package/dist/syncer/file-tracking.d.ts.map +1 -1
- package/dist/syncer/file-tracking.js +5 -4
- package/dist/syncer/filesystem-dependencies.d.ts +15 -0
- package/dist/syncer/filesystem-dependencies.d.ts.map +1 -0
- package/dist/syncer/filesystem-dependencies.js +53 -0
- package/dist/syncer/module-loader.d.ts +1 -1
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +6 -4
- package/dist/syncer/syncer-actions.d.ts +4 -0
- package/dist/syncer/syncer-actions.d.ts.map +1 -1
- package/dist/syncer/syncer-actions.js +34 -17
- package/dist/syncer/syncer.d.ts +17 -6
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +71 -29
- package/dist/syncer/watcher.d.ts.map +1 -1
- package/dist/syncer/watcher.js +3 -3
- package/dist/tasks/decorator.d.ts +6 -6
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +4 -4
- package/dist/tasks/step-wrapper.d.ts +6 -4
- package/dist/tasks/step-wrapper.d.ts.map +1 -1
- package/dist/tasks/step-wrapper.js +5 -5
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +13 -7
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +2 -2
- package/dist/template/helpers.d.ts +8 -6
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +1 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +4 -4
- package/dist/template/implementations/generated_http.template.d.ts +7 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +21 -21
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +6 -3
- package/dist/template/implementations/http_validators.template.d.ts +18 -0
- package/dist/template/implementations/http_validators.template.d.ts.map +1 -0
- package/dist/template/implementations/http_validators.template.js +127 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +1 -1
- package/dist/template/implementations/queries.template.js +1 -1
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +79 -39
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +6 -4
- package/dist/template/implementations/view_form.template.d.ts +6 -1
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +23 -15
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +11 -6
- package/dist/template/template-manager.d.ts.map +1 -1
- package/dist/template/template-manager.js +9 -7
- package/dist/template/template-types.d.ts +12 -5
- package/dist/template/template-types.d.ts.map +1 -1
- package/dist/template/template-types.js +1 -1
- package/dist/template/template.d.ts +2 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +6 -4
- package/dist/template/zod-converter.d.ts +0 -19
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +100 -84
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +2 -1
- package/dist/testing/bootstrap.d.ts.map +1 -1
- package/dist/testing/bootstrap.js +9 -6
- package/dist/testing/data-explorer.d.ts +32 -7
- package/dist/testing/data-explorer.d.ts.map +1 -1
- package/dist/testing/data-explorer.js +77 -31
- package/dist/testing/dev-test-routes.d.ts +8 -1
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +125 -108
- package/dist/testing/dev-vitest-manager.d.ts +54 -8
- package/dist/testing/dev-vitest-manager.d.ts.map +1 -1
- package/dist/testing/dev-vitest-manager.js +24 -9
- package/dist/testing/faker-mappings.d.ts +412 -1
- package/dist/testing/faker-mappings.d.ts.map +1 -1
- package/dist/testing/faker-mappings.js +1 -1
- package/dist/testing/filesystem.d.ts +2 -0
- package/dist/testing/filesystem.d.ts.map +1 -0
- package/dist/testing/filesystem.js +7 -0
- package/dist/testing/fixture-generator.d.ts +25 -8
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +132 -73
- package/dist/testing/fixture-loader.d.ts +3 -1
- package/dist/testing/fixture-loader.d.ts.map +1 -1
- package/dist/testing/fixture-loader.js +1 -20
- package/dist/testing/fixture-manager.d.ts +8 -7
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +91 -59
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +5 -2
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +6 -3
- package/dist/types/types.d.ts +101 -99
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +234 -225
- package/dist/ui/ai-api.d.ts.map +1 -1
- package/dist/ui/ai-api.js +1 -1
- package/dist/ui/ai-client.d.ts.map +1 -1
- package/dist/ui/ai-client.js +28 -18
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +146 -210
- package/dist/ui/async-route.d.ts +3 -0
- package/dist/ui/async-route.d.ts.map +1 -0
- package/dist/ui/async-route.js +12 -0
- package/dist/ui/cdd-service.d.ts +9 -7
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +7 -5
- package/dist/ui/migrations-api.d.ts +3 -0
- package/dist/ui/migrations-api.d.ts.map +1 -0
- package/dist/ui/migrations-api.js +215 -0
- package/dist/ui-web/assets/index-D3QNH-Dv.css +1 -0
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js +7 -5
- package/dist/utils/fs-utils.d.ts +3 -3
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +6 -6
- package/dist/utils/model.d.ts +3 -5
- package/dist/utils/model.d.ts.map +1 -1
- package/dist/utils/model.js +1 -1
- package/dist/utils/object-utils.d.ts +1 -1
- package/dist/utils/object-utils.d.ts.map +1 -1
- package/dist/utils/object-utils.js +17 -16
- package/dist/utils/process-utils.d.ts.map +1 -1
- package/dist/utils/process-utils.js +4 -2
- package/dist/utils/runtime-value.d.ts +13 -0
- package/dist/utils/runtime-value.d.ts.map +1 -0
- package/dist/utils/runtime-value.js +40 -0
- package/dist/utils/sql-parser.d.ts +8 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +6 -3
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +10 -8
- package/dist/utils/utils.d.ts +2 -2
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +11 -8
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +7 -4
- package/dist/vector/chunking.d.ts.map +1 -1
- package/dist/vector/chunking.js +1 -1
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +1 -1
- package/dist/vector/types.d.ts +3 -2
- package/dist/vector/types.d.ts.map +1 -1
- package/package.json +11 -7
- package/src/ai/agents/agent.ts +5 -5
- package/src/ai/agents/types.ts +1 -1
- package/src/ai/providers/rtzr/__tests__/model.test.ts +2 -2
- package/src/ai/providers/rtzr/error.ts +5 -3
- package/src/ai/providers/rtzr/model.ts +3 -2
- package/src/ai/providers/rtzr/options.ts +10 -5
- package/src/ai/providers/rtzr/provider.ts +10 -10
- package/src/ai/providers/rtzr/utils.ts +3 -1
- package/src/api/__tests__/config.test.ts +11 -21
- package/src/api/__tests__/sonamu.http-validator.test.ts +512 -0
- package/src/api/__tests__/sonamu.websocket.test.ts +51 -41
- package/src/api/__tests__/zod-compiler-policy.test.ts +95 -0
- package/src/api/caster.ts +6 -8
- package/src/api/code-converters.ts +136 -36
- package/src/api/config.ts +62 -4
- package/src/api/context.ts +3 -3
- package/src/api/decorators.ts +28 -17
- package/src/api/http-validator.ts +149 -0
- package/src/api/sonamu.ts +459 -152
- package/src/api/websocket-helpers.ts +24 -17
- package/src/auth/audit-log/builders.ts +3 -2
- package/src/auth/audit-log/client-ip.ts +4 -2
- package/src/auth/audit-log/events.ts +15 -1
- package/src/auth/audit-log/plugin.ts +129 -200
- package/src/auth/audit-log-ingestor.ts +19 -15
- package/src/auth/auth-generator.ts +10 -5
- package/src/auth/better-auth-request.ts +4 -3
- package/src/auth/knex-adapter.ts +8 -2
- package/src/auth/plugins/entity-definitions/index.ts +6 -5
- package/src/bin/__tests__/http-validator-benchmark.test.ts +94 -0
- package/src/bin/__tests__/test-command.test.ts +9 -15
- package/src/bin/__tests__/ts-loader-register.test.ts +15 -17
- package/src/bin/__tests__/zod-compiler-build.test.ts +307 -0
- package/src/bin/build-config.ts +167 -0
- package/src/bin/cli.ts +155 -38
- package/src/bin/compiler-policy.ts +35 -0
- package/src/bin/fixture.ts +14 -3
- package/src/bin/test-command.ts +74 -29
- package/src/bin/ts-loader-registration.ts +22 -4
- package/src/cache/decorator.ts +10 -3
- package/src/compress/compress.ts +17 -4
- package/src/cone/cone-generator.ts +34 -6
- package/src/database/__tests__/db.test.ts +1 -0
- package/src/database/__tests__/puri.test.ts +16 -15
- package/src/database/__tests__/transaction-scope.test.ts +5 -0
- package/src/database/_batch_update.ts +1 -0
- package/src/database/base-model.ts +81 -50
- package/src/database/base-model.types.ts +6 -6
- package/src/database/db.ts +29 -19
- package/src/database/knex.ts +30 -17
- package/src/database/puri-subset.test-d.ts +17 -0
- package/src/database/puri.ts +181 -143
- package/src/database/puri.types.test-d.ts +31 -1
- package/src/database/puri.types.ts +23 -21
- package/src/database/upsert-builder.ts +75 -53
- package/src/dict/sd.ts +15 -5
- package/src/dict/sonamu-dictionary.ts +6 -6
- package/src/dict/utils.ts +9 -1
- package/src/entity/entity-manager.ts +26 -9
- package/src/entity/entity-template-cone.ts +5 -10
- package/src/entity/entity.ts +50 -34
- package/src/env.ts +7 -3
- package/src/exceptions/error-handler.ts +17 -2
- package/src/exceptions/so-exceptions.ts +26 -20
- package/src/filter/utils.ts +21 -11
- package/src/index.ts +3 -0
- package/src/logger/configure.ts +26 -18
- package/src/migration/__tests__/migrator.test.ts +50 -57
- package/src/migration/code-generation.ts +132 -104
- package/src/migration/index-where-predicate.ts +51 -24
- package/src/migration/migration-set.ts +11 -5
- package/src/migration/migrator.ts +392 -244
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- package/src/migration/types.ts +57 -0
- package/src/naite/naite-reporter.ts +1 -1
- package/src/naite/naite.ts +97 -24
- package/src/runtime-type.ts +34 -0
- package/src/ssr/hmr-opt-out.ts +78 -0
- package/src/ssr/renderer.ts +6 -0
- package/src/storage/base-file.ts +13 -13
- package/src/storage/buffered-file.ts +11 -11
- package/src/storage/s3-driver.ts +4 -1
- package/src/storage/uploaded-file.ts +8 -8
- package/src/stream/__tests__/ws-contracts.test.ts +4 -2
- package/src/stream/__tests__/ws-telemetry.test.ts +1 -1
- package/src/stream/__tests__/ws.test.ts +30 -6
- package/src/stream/sse.ts +12 -11
- package/src/stream/ws-core.ts +1 -1
- package/src/stream/ws-delivery.ts +16 -7
- package/src/stream/ws-local-connection-store.ts +2 -3
- package/src/stream/ws-presence-store.ts +6 -1
- package/src/stream/ws-registry.ts +16 -7
- package/src/stream/ws-telemetry.ts +66 -43
- package/src/stream/ws.ts +73 -39
- package/src/syncer/__tests__/api-parser.websocket-type-ref.test.ts +3 -2
- package/src/syncer/__tests__/http-validator-registry.test.ts +137 -0
- package/src/syncer/api-parser.ts +67 -27
- package/src/syncer/checksum.ts +17 -11
- package/src/syncer/code-generator.ts +25 -17
- package/src/syncer/entity-operations.ts +3 -5
- package/src/syncer/file-copy.ts +46 -0
- package/src/syncer/file-patterns.ts +11 -8
- package/src/syncer/file-tracking.ts +3 -4
- package/src/syncer/filesystem-dependencies.ts +73 -0
- package/src/syncer/module-loader.ts +8 -4
- package/src/syncer/syncer-actions.ts +56 -18
- package/src/syncer/syncer.ts +116 -43
- package/src/syncer/watcher.ts +8 -4
- package/src/tasks/decorator.ts +20 -12
- package/src/tasks/step-wrapper.ts +19 -9
- package/src/tasks/workflow-manager.ts +15 -9
- package/src/template/__tests__/http_validators.template.test.ts +160 -0
- package/src/template/__tests__/services.template.mutation.test.ts +24 -23
- package/src/template/__tests__/services.template.websocket.test.ts +21 -25
- package/src/template/entity-converter.ts +5 -2
- package/src/template/helpers.ts +8 -9
- package/src/template/implementations/generated.template.ts +5 -4
- package/src/template/implementations/generated_http.template.ts +61 -15
- package/src/template/implementations/generated_sso.template.ts +15 -4
- package/src/template/implementations/http_validators.template.ts +175 -0
- package/src/template/implementations/model.template.ts +3 -1
- package/src/template/implementations/sd.template.ts +81 -41
- package/src/template/implementations/services.template.ts +2 -2
- package/src/template/implementations/view_form.template.ts +56 -39
- package/src/template/implementations/view_list.template.ts +31 -23
- package/src/template/template-manager.ts +15 -13
- package/src/template/template-types.ts +13 -5
- package/src/template/template.ts +4 -3
- package/src/template/zod-converter.ts +206 -91
- package/src/testing/__tests__/dev-test-routes.test.ts +85 -25
- package/src/testing/__tests__/dev-vitest-manager.test.ts +15 -15
- package/src/testing/_relation-graph.ts +4 -1
- package/src/testing/bootstrap.ts +12 -5
- package/src/testing/data-explorer.ts +102 -53
- package/src/testing/dev-test-routes.ts +87 -50
- package/src/testing/dev-vitest-manager.ts +88 -32
- package/src/testing/faker-mappings.ts +2 -2
- package/src/testing/filesystem.ts +1 -0
- package/src/testing/fixture-generator.ts +191 -131
- package/src/testing/fixture-loader.ts +5 -1
- package/src/testing/fixture-manager.ts +129 -90
- package/src/testing/global-setup.ts +7 -3
- package/src/testing/index.ts +5 -0
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +9 -3
- package/src/types/types.ts +184 -158
- package/src/ui/ai-api.ts +9 -7
- package/src/ui/ai-client.ts +61 -56
- package/src/ui/api.ts +726 -770
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +381 -0
- package/src/utils/formatter.ts +7 -3
- package/src/utils/fs-utils.ts +5 -5
- package/src/utils/model.ts +4 -5
- package/src/utils/object-utils.ts +32 -22
- package/src/utils/process-utils.ts +4 -1
- package/src/utils/runtime-value.ts +43 -0
- package/src/utils/sql-parser.ts +13 -6
- package/src/utils/type-utils.ts +9 -7
- package/src/utils/utils.ts +19 -21
- package/src/utils/zod-error.ts +4 -2
- package/src/vector/chunking.ts +6 -1
- package/src/vector/embedding.ts +2 -1
- package/src/vector/types.ts +4 -2
- package/tsdown.api.config.ts +5 -2
- package/dist/ui-web/assets/index-CJf8uJYf.js +0 -176
- package/dist/ui-web/assets/index-GMMIVGja.css +0 -1
package/src/storage/base-file.ts
CHANGED
|
@@ -17,46 +17,46 @@ export abstract class BaseFile {
|
|
|
17
17
|
url?: string;
|
|
18
18
|
signedUrl?: string;
|
|
19
19
|
}) {
|
|
20
|
-
this
|
|
21
|
-
this
|
|
22
|
-
this
|
|
23
|
-
this
|
|
24
|
-
this
|
|
20
|
+
this["_filename"] = params.filename;
|
|
21
|
+
this["_mimetype"] = params.mimetype;
|
|
22
|
+
this["_size"] = params.size;
|
|
23
|
+
this["_url"] = params.url;
|
|
24
|
+
this["_signedUrl"] = params.signedUrl;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/** 원본 파일명 */
|
|
28
28
|
get filename(): string {
|
|
29
|
-
return this
|
|
29
|
+
return this["_filename"];
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** MIME 타입 */
|
|
33
33
|
get mimetype(): string {
|
|
34
|
-
return this
|
|
34
|
+
return this["_mimetype"];
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/** 파일 크기 (bytes) */
|
|
38
38
|
get size(): number {
|
|
39
|
-
return this
|
|
39
|
+
return this["_size"];
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/** 확장자 (점 제외) */
|
|
43
43
|
get extname(): string | false {
|
|
44
|
-
return mime.extension(this
|
|
44
|
+
return mime.extension(this["_mimetype"]);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/** 저장된 URL (Unsigned) */
|
|
48
48
|
get url(): string {
|
|
49
|
-
if (this
|
|
49
|
+
if (this["_url"] === undefined) {
|
|
50
50
|
throw new Error("url이 설정되지 않았습니다.");
|
|
51
51
|
}
|
|
52
|
-
return this
|
|
52
|
+
return this["_url"];
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
/** 저장된 URL (Signed) */
|
|
56
56
|
get signedUrl(): string {
|
|
57
|
-
if (this
|
|
57
|
+
if (this["_signedUrl"] === undefined) {
|
|
58
58
|
throw new Error("signedUrl이 설정되지 않았습니다.");
|
|
59
59
|
}
|
|
60
|
-
return this
|
|
60
|
+
return this["_signedUrl"];
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -10,8 +10,8 @@ import { type DriverKey } from "./drivers";
|
|
|
10
10
|
* 메모리에 로드된 상태로, md5 계산이나 이미지 처리 등 유연한 작업이 가능합니다.
|
|
11
11
|
*/
|
|
12
12
|
export class BufferedFile extends BaseFile {
|
|
13
|
-
private
|
|
14
|
-
private
|
|
13
|
+
private fileValue: MultipartFile;
|
|
14
|
+
private bufferValue: Buffer;
|
|
15
15
|
|
|
16
16
|
constructor(file: MultipartFile, buffer: Buffer) {
|
|
17
17
|
super({
|
|
@@ -19,18 +19,18 @@ export class BufferedFile extends BaseFile {
|
|
|
19
19
|
mimetype: file.mimetype,
|
|
20
20
|
size: buffer.length,
|
|
21
21
|
});
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
22
|
+
this.fileValue = file;
|
|
23
|
+
this.bufferValue = buffer;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/** 파일 Buffer */
|
|
27
27
|
get buffer(): Buffer {
|
|
28
|
-
return this.
|
|
28
|
+
return this.bufferValue;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/** MD5 해시 계산 */
|
|
32
32
|
async md5(): Promise<string> {
|
|
33
|
-
return createHash("md5").update(this.
|
|
33
|
+
return createHash("md5").update(this.bufferValue).digest("hex");
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
/**
|
|
@@ -44,19 +44,19 @@ export class BufferedFile extends BaseFile {
|
|
|
44
44
|
const { Sonamu } = await import("../api/sonamu");
|
|
45
45
|
const disk = Sonamu.storage.use(diskName);
|
|
46
46
|
|
|
47
|
-
await disk.put(key, new Uint8Array(this.
|
|
47
|
+
await disk.put(key, new Uint8Array(this.bufferValue), {
|
|
48
48
|
contentType: this.mimetype,
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
this
|
|
52
|
-
this
|
|
51
|
+
this["_url"] = await disk.getUrl(key);
|
|
52
|
+
this["_signedUrl"] = await disk.getSignedUrl(key);
|
|
53
53
|
|
|
54
54
|
// signed url은 만료 시간이 있기 때문에, unsigned url을 반환합니다.
|
|
55
|
-
return this
|
|
55
|
+
return this["_url"];
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
/** 원본 MultipartFile 접근 */
|
|
59
59
|
get raw(): MultipartFile {
|
|
60
|
-
return this.
|
|
60
|
+
return this.fileValue;
|
|
61
61
|
}
|
|
62
62
|
}
|
package/src/storage/s3-driver.ts
CHANGED
|
@@ -62,7 +62,10 @@ export class SonamuS3Driver extends S3Driver {
|
|
|
62
62
|
|
|
63
63
|
// ACL 지원 시에만 설정
|
|
64
64
|
if (this.sonamuSupportsACL) {
|
|
65
|
-
uploadParams.ACL =
|
|
65
|
+
uploadParams.ACL =
|
|
66
|
+
/* SAFETY: 호출 경계의 선행 검증과 소유 타입 계약이 이 값의 타입을 보장한다. */ (
|
|
67
|
+
visibility === "public" ? "public-read" : "private"
|
|
68
|
+
) as ObjectCannedACL;
|
|
66
69
|
}
|
|
67
70
|
|
|
68
71
|
const upload = new Upload({
|
|
@@ -6,8 +6,8 @@ import { type DriverKey } from "./drivers";
|
|
|
6
6
|
* 이미 저장소에 스트리밍 완료된 상태로, url/key 등 메타데이터만 접근 가능합니다.
|
|
7
7
|
*/
|
|
8
8
|
export class UploadedFile extends BaseFile {
|
|
9
|
-
private
|
|
10
|
-
private
|
|
9
|
+
private keyValue: string;
|
|
10
|
+
private diskNameValue: DriverKey;
|
|
11
11
|
|
|
12
12
|
constructor(params: {
|
|
13
13
|
filename: string;
|
|
@@ -25,18 +25,18 @@ export class UploadedFile extends BaseFile {
|
|
|
25
25
|
url: params.url,
|
|
26
26
|
signedUrl: params.signedUrl,
|
|
27
27
|
});
|
|
28
|
-
this.
|
|
29
|
-
this.
|
|
28
|
+
this.keyValue = params.key;
|
|
29
|
+
this.diskNameValue = params.diskName;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/** 저장소 내 키 */
|
|
33
33
|
get key(): string {
|
|
34
|
-
return this.
|
|
34
|
+
return this.keyValue;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/** 저장된 디스크 이름 */
|
|
38
38
|
get diskName(): DriverKey {
|
|
39
|
-
return this.
|
|
39
|
+
return this.diskNameValue;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
|
@@ -45,9 +45,9 @@ export class UploadedFile extends BaseFile {
|
|
|
45
45
|
*/
|
|
46
46
|
async download(): Promise<Buffer> {
|
|
47
47
|
const { Sonamu } = await import("../api/sonamu");
|
|
48
|
-
const disk = Sonamu.storage.use(this.
|
|
48
|
+
const disk = Sonamu.storage.use(this.diskNameValue);
|
|
49
49
|
|
|
50
|
-
const uint8Array = await disk.get(this.
|
|
50
|
+
const uint8Array = await disk.get(this.keyValue);
|
|
51
51
|
return Buffer.from(uint8Array);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
@@ -13,6 +13,8 @@ import { WebSocketDeliveryEngine } from "../ws-delivery";
|
|
|
13
13
|
import { WebSocketLocalConnectionStore } from "../ws-local-connection-store";
|
|
14
14
|
import { InMemoryWebSocketPresenceStore } from "../ws-presence-store";
|
|
15
15
|
|
|
16
|
+
type PublishedData = Parameters<ManagedWebSocketConnection["publishUntyped"]>[1];
|
|
17
|
+
|
|
16
18
|
async function waitForAsyncQueue(rounds: number = 3): Promise<void> {
|
|
17
19
|
for (let index = 0; index < rounds; index += 1) {
|
|
18
20
|
await new Promise<void>((resolve) => {
|
|
@@ -48,7 +50,7 @@ class ContractClusterBus implements WebSocketClusterBus {
|
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
class ContractConnection implements ManagedWebSocketConnection {
|
|
51
|
-
readonly sent: Array<{ event: string; data:
|
|
53
|
+
readonly sent: Array<{ event: string; data: PublishedData }> = [];
|
|
52
54
|
closed = false;
|
|
53
55
|
|
|
54
56
|
constructor(
|
|
@@ -56,7 +58,7 @@ class ContractConnection implements ManagedWebSocketConnection {
|
|
|
56
58
|
readonly namespace: string,
|
|
57
59
|
) {}
|
|
58
60
|
|
|
59
|
-
publishUntyped(event: string, data:
|
|
61
|
+
publishUntyped<Data>(event: string, data: Data): void {
|
|
60
62
|
this.sent.push({ event, data });
|
|
61
63
|
}
|
|
62
64
|
|
|
@@ -562,7 +562,7 @@ describe("metric source", () => {
|
|
|
562
562
|
};
|
|
563
563
|
|
|
564
564
|
const unsubscribe = controller.registerMetricSource(source);
|
|
565
|
-
expect(
|
|
565
|
+
expect(unsubscribe).toBeInstanceOf(Function);
|
|
566
566
|
|
|
567
567
|
const snapshotBefore = controller.getMetricsSnapshot();
|
|
568
568
|
expect(snapshotBefore.activeConnections).toBe(7);
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { EventEmitter } from "node:events";
|
|
2
2
|
|
|
3
3
|
import { describe, expect, it, vi } from "vitest";
|
|
4
|
-
import { type WebSocket } from "ws";
|
|
5
4
|
import { z } from "zod";
|
|
6
5
|
|
|
7
|
-
import { createWebSocketRuntime } from "../ws";
|
|
6
|
+
import { createWebSocketRuntime, type WebSocketTransport } from "../ws";
|
|
8
7
|
import { WebSocketAudience } from "../ws-audience";
|
|
9
8
|
import {
|
|
10
9
|
type WebSocketClusterBus,
|
|
@@ -48,8 +47,33 @@ class FakeWebSocket extends EventEmitter {
|
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
function asWebSocket(socket: FakeWebSocket):
|
|
52
|
-
return
|
|
50
|
+
function asWebSocket(socket: FakeWebSocket): WebSocketTransport {
|
|
51
|
+
return {
|
|
52
|
+
get bufferedAmount() {
|
|
53
|
+
return socket.bufferedAmount;
|
|
54
|
+
},
|
|
55
|
+
get readyState() {
|
|
56
|
+
return socket.readyState;
|
|
57
|
+
},
|
|
58
|
+
close(code, reason) {
|
|
59
|
+
socket.close(code, reason?.toString());
|
|
60
|
+
},
|
|
61
|
+
off(...args) {
|
|
62
|
+
socket.off(...args);
|
|
63
|
+
},
|
|
64
|
+
on(...args) {
|
|
65
|
+
socket.on(...args);
|
|
66
|
+
},
|
|
67
|
+
ping() {
|
|
68
|
+
socket.ping();
|
|
69
|
+
},
|
|
70
|
+
send(data) {
|
|
71
|
+
socket.send(data.toString());
|
|
72
|
+
},
|
|
73
|
+
terminate() {
|
|
74
|
+
socket.terminate();
|
|
75
|
+
},
|
|
76
|
+
};
|
|
53
77
|
}
|
|
54
78
|
|
|
55
79
|
class FakeClusterBus implements WebSocketClusterBus {
|
|
@@ -665,8 +689,8 @@ describe("WebSocketRuntime", () => {
|
|
|
665
689
|
namespace: "chat",
|
|
666
690
|
});
|
|
667
691
|
|
|
668
|
-
let unhandled:
|
|
669
|
-
const handleUnhandledRejection = (reason:
|
|
692
|
+
let unhandled: Error | null = null;
|
|
693
|
+
const handleUnhandledRejection = (reason: Error) => {
|
|
670
694
|
unhandled = reason;
|
|
671
695
|
};
|
|
672
696
|
process.once("unhandledRejection", handleUnhandledRejection);
|
package/src/stream/sse.ts
CHANGED
|
@@ -29,26 +29,26 @@ export interface SSEConnection<T extends z.ZodObject> {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
|
|
32
|
-
private
|
|
33
|
-
private
|
|
32
|
+
private closedState = false;
|
|
33
|
+
private closeCallbacks: Array<() => void> = [];
|
|
34
34
|
|
|
35
35
|
private readonly markClosed = () => {
|
|
36
|
-
this.
|
|
36
|
+
this.closedState = true;
|
|
37
37
|
this.fireCloseCallbacks();
|
|
38
38
|
};
|
|
39
39
|
|
|
40
40
|
get closed(): boolean {
|
|
41
|
-
return this.
|
|
41
|
+
return this.closedState;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
onClose(callback: () => void): void {
|
|
45
|
-
this.
|
|
45
|
+
this.closeCallbacks.push(callback);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// 콜백을 한 번만 실행하고 배열을 비워 중복 호출을 방지
|
|
49
49
|
private fireCloseCallbacks(): void {
|
|
50
|
-
const callbacks = this.
|
|
51
|
-
this.
|
|
50
|
+
const callbacks = this.closeCallbacks;
|
|
51
|
+
this.closeCallbacks = [];
|
|
52
52
|
for (const cb of callbacks) {
|
|
53
53
|
cb();
|
|
54
54
|
}
|
|
@@ -63,22 +63,23 @@ class SSEConnectionImpl<T extends z.ZodObject> implements SSEConnection<T> {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
publish<K extends keyof z.infer<T>>(event: K, data: z.infer<T>[K]): void {
|
|
66
|
-
if (this.
|
|
66
|
+
if (this.closedState) {
|
|
67
67
|
return;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
this.reply.sse({
|
|
71
|
-
event:
|
|
71
|
+
event:
|
|
72
|
+
/* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ event as string,
|
|
72
73
|
data: JSON.stringify(data),
|
|
73
74
|
});
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
async end(): Promise<void> {
|
|
77
|
-
if (this.
|
|
78
|
+
if (this.closedState) {
|
|
78
79
|
return;
|
|
79
80
|
}
|
|
80
81
|
|
|
81
|
-
this.
|
|
82
|
+
this.closedState = true;
|
|
82
83
|
this.socket.off("close", this.markClosed);
|
|
83
84
|
this.socket.off("error", this.markClosed);
|
|
84
85
|
this.fireCloseCallbacks();
|
package/src/stream/ws-core.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface ManagedWebSocketConnection {
|
|
|
7
7
|
closed: boolean;
|
|
8
8
|
// setUserId/clearUserId 호출로 갱신됨. telemetry emit 사이트에서 hot path lookup을 피하기 위해 connection에 캐싱한다
|
|
9
9
|
readonly userId?: string;
|
|
10
|
-
publishUntyped(event: string, data:
|
|
10
|
+
publishUntyped<Data>(event: string, data: Data): void;
|
|
11
11
|
close(code?: number, reason?: string): void;
|
|
12
12
|
}
|
|
13
13
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
|
|
3
|
+
import { runtimeTypeOf } from "../runtime-type";
|
|
3
4
|
import { type WebSocketAudience } from "./ws-audience";
|
|
4
5
|
import { type WebSocketAudienceResolver } from "./ws-audience-resolver";
|
|
5
6
|
import { type WebSocketClusterBus, type WebSocketClusterEnvelope } from "./ws-cluster-bus";
|
|
@@ -43,7 +44,7 @@ export class WebSocketDeliveryEngine {
|
|
|
43
44
|
});
|
|
44
45
|
}
|
|
45
46
|
|
|
46
|
-
publishToAudience(audience: WebSocketAudience, event: string, data:
|
|
47
|
+
publishToAudience<Data>(audience: WebSocketAudience, event: string, data: Data): void {
|
|
47
48
|
const routingPlan = this.options.audienceResolver.resolve(audience);
|
|
48
49
|
const localTargets = this.options.localConnections.getConnections(routingPlan.localSessionIds);
|
|
49
50
|
|
|
@@ -99,7 +100,7 @@ export class WebSocketDeliveryEngine {
|
|
|
99
100
|
},
|
|
100
101
|
});
|
|
101
102
|
})
|
|
102
|
-
.catch((
|
|
103
|
+
.catch((cause: unknown) => {
|
|
103
104
|
const durationMs = performance.now() - publishStartedAt;
|
|
104
105
|
this.telemetry.emit({
|
|
105
106
|
name: "ws.cluster.envelope.failed",
|
|
@@ -112,7 +113,7 @@ export class WebSocketDeliveryEngine {
|
|
|
112
113
|
durationMs,
|
|
113
114
|
status: "error",
|
|
114
115
|
attributes: { event },
|
|
115
|
-
errorType:
|
|
116
|
+
errorType: cause instanceof Error ? cause.name : runtimeTypeOf(cause),
|
|
116
117
|
});
|
|
117
118
|
});
|
|
118
119
|
}
|
|
@@ -123,7 +124,7 @@ export class WebSocketDeliveryEngine {
|
|
|
123
124
|
await this.options.clusterBus.shutdown();
|
|
124
125
|
}
|
|
125
126
|
|
|
126
|
-
getTelemetrySnapshot()
|
|
127
|
+
getTelemetrySnapshot() {
|
|
127
128
|
let pendingFanOutTargets = 0;
|
|
128
129
|
|
|
129
130
|
for (const job of this.pendingFanOutJobs) {
|
|
@@ -183,7 +184,11 @@ export class WebSocketDeliveryEngine {
|
|
|
183
184
|
});
|
|
184
185
|
}
|
|
185
186
|
|
|
186
|
-
private enqueueFanOut(
|
|
187
|
+
private enqueueFanOut<Data>(
|
|
188
|
+
targets: ManagedWebSocketConnection[],
|
|
189
|
+
event: string,
|
|
190
|
+
data: Data,
|
|
191
|
+
): void {
|
|
187
192
|
if (targets.length === 0) {
|
|
188
193
|
return;
|
|
189
194
|
}
|
|
@@ -236,7 +241,7 @@ export class WebSocketDeliveryEngine {
|
|
|
236
241
|
}
|
|
237
242
|
} catch (error) {
|
|
238
243
|
status = "error";
|
|
239
|
-
errorType = error instanceof Error ? error.name :
|
|
244
|
+
errorType = error instanceof Error ? error.name : runtimeTypeOf(error);
|
|
240
245
|
throw error;
|
|
241
246
|
} finally {
|
|
242
247
|
const durationMs = performance.now() - startedAt;
|
|
@@ -260,7 +265,11 @@ export class WebSocketDeliveryEngine {
|
|
|
260
265
|
}
|
|
261
266
|
}
|
|
262
267
|
|
|
263
|
-
private safePublish(
|
|
268
|
+
private safePublish<Data>(
|
|
269
|
+
connection: ManagedWebSocketConnection,
|
|
270
|
+
event: string,
|
|
271
|
+
data: Data,
|
|
272
|
+
): void {
|
|
264
273
|
try {
|
|
265
274
|
if (!connection.closed) {
|
|
266
275
|
connection.publishUntyped(event, data);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isFunctionValue } from "../utils/runtime-value";
|
|
1
2
|
import { type ManagedWebSocketConnection } from "./ws-core";
|
|
2
3
|
import {
|
|
3
4
|
type WebSocketTelemetryConnectionSnapshot,
|
|
@@ -71,7 +72,5 @@ export class WebSocketLocalConnectionStore {
|
|
|
71
72
|
function isTelemetryInspectableConnection(
|
|
72
73
|
connection: ManagedWebSocketConnection,
|
|
73
74
|
): connection is ManagedWebSocketConnection & TelemetryInspectableConnection {
|
|
74
|
-
return (
|
|
75
|
-
"getTelemetrySnapshot" in connection && typeof connection.getTelemetrySnapshot === "function"
|
|
76
|
-
);
|
|
75
|
+
return "getTelemetrySnapshot" in connection && isFunctionValue(connection.getTelemetrySnapshot);
|
|
77
76
|
}
|
|
@@ -317,7 +317,12 @@ function getBindingKey(namespace: string, id: string): string {
|
|
|
317
317
|
return `${namespace}::${id}`;
|
|
318
318
|
}
|
|
319
319
|
|
|
320
|
-
|
|
320
|
+
interface PresenceBinding {
|
|
321
|
+
namespace: string;
|
|
322
|
+
id: string;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
function parseBindingKey(key: string): PresenceBinding {
|
|
321
326
|
const [namespace, ...rest] = key.split("::");
|
|
322
327
|
return {
|
|
323
328
|
namespace,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isFunctionValue } from "../utils/runtime-value";
|
|
1
2
|
import { WebSocketAudience, type WebSocketAudience as WebSocketAudienceSpec } from "./ws-audience";
|
|
2
3
|
import { WebSocketAudienceResolver } from "./ws-audience-resolver";
|
|
3
4
|
import { NoopWebSocketClusterBus, type WebSocketClusterBus } from "./ws-cluster-bus";
|
|
@@ -253,19 +254,29 @@ export class WebSocketRegistry {
|
|
|
253
254
|
});
|
|
254
255
|
}
|
|
255
256
|
|
|
256
|
-
broadcast(event: string, data:
|
|
257
|
+
broadcast<Data>(event: string, data: Data, namespace?: string): void {
|
|
257
258
|
this.publishToAudience(WebSocketAudience.all(namespace), event, data);
|
|
258
259
|
}
|
|
259
260
|
|
|
260
|
-
publishToRoom(
|
|
261
|
+
publishToRoom<Data>(
|
|
262
|
+
roomId: WebSocketRoomId,
|
|
263
|
+
event: string,
|
|
264
|
+
data: Data,
|
|
265
|
+
namespace?: string,
|
|
266
|
+
): void {
|
|
261
267
|
this.publishToAudience(WebSocketAudience.room(roomId, namespace), event, data);
|
|
262
268
|
}
|
|
263
269
|
|
|
264
|
-
publishToUser(
|
|
270
|
+
publishToUser<Data>(
|
|
271
|
+
userId: WebSocketUserId,
|
|
272
|
+
event: string,
|
|
273
|
+
data: Data,
|
|
274
|
+
namespace?: string,
|
|
275
|
+
): void {
|
|
265
276
|
this.publishToAudience(WebSocketAudience.user(userId, namespace), event, data);
|
|
266
277
|
}
|
|
267
278
|
|
|
268
|
-
publishToAudience(audience: WebSocketAudienceSpec, event: string, data:
|
|
279
|
+
publishToAudience<Data>(audience: WebSocketAudienceSpec, event: string, data: Data): void {
|
|
269
280
|
this.deliveryEngine.publishToAudience(audience, event, data);
|
|
270
281
|
}
|
|
271
282
|
|
|
@@ -313,7 +324,5 @@ function formatUserId(userId: WebSocketUserId | undefined): string | undefined {
|
|
|
313
324
|
function isTelemetryContextProvider(
|
|
314
325
|
connection: ManagedWebSocketConnection,
|
|
315
326
|
): connection is ManagedWebSocketConnection & TelemetryContextProvider {
|
|
316
|
-
return (
|
|
317
|
-
"getTelemetryContext" in connection && typeof connection.getTelemetryContext === "function"
|
|
318
|
-
);
|
|
327
|
+
return "getTelemetryContext" in connection && isFunctionValue(connection.getTelemetryContext);
|
|
319
328
|
}
|