sonamu 0.10.12 → 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 +131 -27
- 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 +12 -6
- 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 +3 -2
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +27 -21
- 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/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 +135 -128
- 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.map +1 -1
- package/dist/ui/migrations-api.js +17 -15
- package/dist/ui-web/assets/index-DV1AAq6W.js +178 -0
- package/dist/ui-web/index.html +1 -1
- 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 +5 -3
- 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 +153 -36
- 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 +68 -41
- package/src/migration/postgresql-schema-reader.ts +52 -47
- package/src/migration/slack-confirm.ts +17 -15
- 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 +727 -616
- package/src/ui/async-route.ts +4 -0
- package/src/ui/cdd-service.ts +35 -12
- package/src/ui/migrations-api.ts +63 -51
- 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-C0m1pk6K.js +0 -177
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
|
}
|
|
@@ -1,6 +1,23 @@
|
|
|
1
|
+
import { runtimeTypeOf } from "../runtime-type";
|
|
2
|
+
import { isFunctionValue, isObjectValue } from "../utils/runtime-value";
|
|
1
3
|
import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore } from "./ws-telemetry-memory";
|
|
2
4
|
import { generateSpanId, generateTraceId, parseTraceParent } from "./ws-telemetry-trace";
|
|
3
5
|
|
|
6
|
+
export type WebSocketTelemetryValue =
|
|
7
|
+
| null
|
|
8
|
+
| undefined
|
|
9
|
+
| bigint
|
|
10
|
+
| boolean
|
|
11
|
+
| number
|
|
12
|
+
| string
|
|
13
|
+
| Date
|
|
14
|
+
| WebSocketTelemetryValue[]
|
|
15
|
+
| WebSocketTelemetryAttributes;
|
|
16
|
+
|
|
17
|
+
export interface WebSocketTelemetryAttributes {
|
|
18
|
+
[key: string]: WebSocketTelemetryValue;
|
|
19
|
+
}
|
|
20
|
+
|
|
4
21
|
// -- Record types (unchanged) --
|
|
5
22
|
|
|
6
23
|
export type WebSocketTelemetryRecordBase = {
|
|
@@ -24,7 +41,7 @@ export type WebSocketTelemetryEventRecord = WebSocketTelemetryRecordBase & {
|
|
|
24
41
|
name: string;
|
|
25
42
|
level: "debug" | "info" | "warn" | "error";
|
|
26
43
|
attributes?: Record<string, string | number | boolean>;
|
|
27
|
-
detail?:
|
|
44
|
+
detail?: WebSocketTelemetryAttributes;
|
|
28
45
|
payloadPreview?: string;
|
|
29
46
|
};
|
|
30
47
|
|
|
@@ -49,12 +66,12 @@ export type WebSocketTelemetrySpanRecord = WebSocketTelemetryRecordBase & {
|
|
|
49
66
|
events?: Array<{
|
|
50
67
|
name: string;
|
|
51
68
|
timestamp: number;
|
|
52
|
-
attributes?:
|
|
69
|
+
attributes?: WebSocketTelemetryAttributes;
|
|
53
70
|
}>;
|
|
54
71
|
links?: Array<{
|
|
55
72
|
traceId: string;
|
|
56
73
|
spanId: string;
|
|
57
|
-
attributes?:
|
|
74
|
+
attributes?: WebSocketTelemetryAttributes;
|
|
58
75
|
}>;
|
|
59
76
|
};
|
|
60
77
|
|
|
@@ -72,8 +89,8 @@ export type WebSocketTelemetryEventInput = {
|
|
|
72
89
|
connectionId?: string;
|
|
73
90
|
userId?: string;
|
|
74
91
|
attributes?: Record<string, string | number | boolean>;
|
|
75
|
-
detail?:
|
|
76
|
-
payload?:
|
|
92
|
+
detail?: WebSocketTelemetryAttributes;
|
|
93
|
+
payload?: WebSocketTelemetryValue;
|
|
77
94
|
traceId?: string;
|
|
78
95
|
spanId?: string;
|
|
79
96
|
parentSpanId?: string;
|
|
@@ -113,12 +130,12 @@ export type WebSocketSpanInput = {
|
|
|
113
130
|
events?: Array<{
|
|
114
131
|
name: string;
|
|
115
132
|
timestamp: number;
|
|
116
|
-
attributes?:
|
|
133
|
+
attributes?: WebSocketTelemetryAttributes;
|
|
117
134
|
}>;
|
|
118
135
|
links?: Array<{
|
|
119
136
|
traceId: string;
|
|
120
137
|
spanId: string;
|
|
121
|
-
attributes?:
|
|
138
|
+
attributes?: WebSocketTelemetryAttributes;
|
|
122
139
|
}>;
|
|
123
140
|
};
|
|
124
141
|
|
|
@@ -434,7 +451,7 @@ function isSensitiveKey(key: string): boolean {
|
|
|
434
451
|
return SENSITIVE_KEY_PATTERNS.some((pattern) => normalized.includes(pattern));
|
|
435
452
|
}
|
|
436
453
|
|
|
437
|
-
function redactValue(value:
|
|
454
|
+
function redactValue(value: WebSocketTelemetryValue, key?: string): WebSocketTelemetryValue {
|
|
438
455
|
if (key !== undefined && isSensitiveKey(key)) {
|
|
439
456
|
return REDACTED_VALUE;
|
|
440
457
|
}
|
|
@@ -447,8 +464,8 @@ function redactValue(value: unknown, key?: string): unknown {
|
|
|
447
464
|
return value;
|
|
448
465
|
}
|
|
449
466
|
|
|
450
|
-
if (value &&
|
|
451
|
-
const redacted:
|
|
467
|
+
if (value && isObjectValue(value)) {
|
|
468
|
+
const redacted: WebSocketTelemetryAttributes = {};
|
|
452
469
|
for (const [childKey, childValue] of Object.entries(value)) {
|
|
453
470
|
redacted[childKey] = redactValue(childValue, childKey);
|
|
454
471
|
}
|
|
@@ -464,6 +481,7 @@ function redactValue(value: unknown, key?: string): unknown {
|
|
|
464
481
|
*/
|
|
465
482
|
function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketTelemetryRecord {
|
|
466
483
|
if (record.type === "event") {
|
|
484
|
+
// SAFETY: redactor는 이벤트 레코드의 키 구조를 유지하고 값만 마스킹한다.
|
|
467
485
|
return {
|
|
468
486
|
...record,
|
|
469
487
|
attributes: record.attributes
|
|
@@ -477,6 +495,7 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
|
|
|
477
495
|
}
|
|
478
496
|
|
|
479
497
|
if (record.type === "metric") {
|
|
498
|
+
// SAFETY: redactor는 메트릭 레코드의 키 구조를 유지하고 값만 마스킹한다.
|
|
480
499
|
return {
|
|
481
500
|
...record,
|
|
482
501
|
tags: record.tags
|
|
@@ -486,6 +505,7 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
|
|
|
486
505
|
};
|
|
487
506
|
}
|
|
488
507
|
|
|
508
|
+
// SAFETY: redactor는 span과 하위 이벤트·링크의 키 구조를 유지하고 값만 마스킹한다.
|
|
489
509
|
return {
|
|
490
510
|
...record,
|
|
491
511
|
attributes: record.attributes
|
|
@@ -494,19 +514,19 @@ function defaultSensitiveKeyRedact(record: WebSocketTelemetryRecord): WebSocketT
|
|
|
494
514
|
events: record.events?.map((event) => ({
|
|
495
515
|
...event,
|
|
496
516
|
attributes: event.attributes
|
|
497
|
-
? (redactValue(event.attributes) as
|
|
517
|
+
? (redactValue(event.attributes) as WebSocketTelemetryAttributes)
|
|
498
518
|
: undefined,
|
|
499
519
|
})),
|
|
500
520
|
links: record.links?.map((link) => ({
|
|
501
521
|
...link,
|
|
502
522
|
attributes: link.attributes
|
|
503
|
-
? (redactValue(link.attributes) as
|
|
523
|
+
? (redactValue(link.attributes) as WebSocketTelemetryAttributes)
|
|
504
524
|
: undefined,
|
|
505
525
|
})),
|
|
506
526
|
};
|
|
507
527
|
}
|
|
508
528
|
|
|
509
|
-
function truncatePayloadPreview(payload:
|
|
529
|
+
function truncatePayloadPreview(payload: WebSocketTelemetryValue, maxBytes: number): string {
|
|
510
530
|
try {
|
|
511
531
|
const serialized = JSON.stringify(redactValue(payload));
|
|
512
532
|
if (Buffer.byteLength(serialized, "utf-8") <= maxBytes) {
|
|
@@ -536,8 +556,8 @@ function truncateUtf8String(value: string, maxBytes: number): string {
|
|
|
536
556
|
return result + suffix;
|
|
537
557
|
}
|
|
538
558
|
|
|
539
|
-
export function isPromiseLike(value:
|
|
540
|
-
return
|
|
559
|
+
export function isPromiseLike<Value>(value: Value): value is Value & Promise<void> {
|
|
560
|
+
return isObjectValue(value) && value !== null && "then" in value && "catch" in value;
|
|
541
561
|
}
|
|
542
562
|
|
|
543
563
|
// -- TokenBucket (unchanged) --
|
|
@@ -679,7 +699,7 @@ type ResolvedSpanPipelineOptions = {
|
|
|
679
699
|
type InternalEventReporter = (
|
|
680
700
|
name: string,
|
|
681
701
|
level: WebSocketTelemetryEventRecord["level"],
|
|
682
|
-
detail?:
|
|
702
|
+
detail?: WebSocketTelemetryAttributes,
|
|
683
703
|
) => void;
|
|
684
704
|
|
|
685
705
|
// -- TelemetryPipeline (abstract) --
|
|
@@ -695,7 +715,7 @@ abstract class TelemetryPipeline<
|
|
|
695
715
|
> {
|
|
696
716
|
abstract readonly signal: "event" | "metric" | "span";
|
|
697
717
|
protected readonly sinks: TSink[];
|
|
698
|
-
protected readonly
|
|
718
|
+
protected readonly telemetryStore: TStore;
|
|
699
719
|
protected readonly tokenBucket: TokenBucket;
|
|
700
720
|
protected readonly maxInFlightEmits: number;
|
|
701
721
|
protected readonly runtimeMetadata: RuntimeMetadata;
|
|
@@ -717,7 +737,7 @@ abstract class TelemetryPipeline<
|
|
|
717
737
|
runtimeMetadata: RuntimeMetadata,
|
|
718
738
|
) {
|
|
719
739
|
this.sinks = sinks;
|
|
720
|
-
this.
|
|
740
|
+
this.telemetryStore = store;
|
|
721
741
|
this.tokenBucket = new TokenBucket(maxRecordsPerSecond, maxRecordsPerSecond);
|
|
722
742
|
this.maxInFlightEmits = maxInFlightEmits;
|
|
723
743
|
this.sharedRedactor = sharedRedactor;
|
|
@@ -726,7 +746,7 @@ abstract class TelemetryPipeline<
|
|
|
726
746
|
}
|
|
727
747
|
|
|
728
748
|
get store(): TStore {
|
|
729
|
-
return this.
|
|
749
|
+
return this.telemetryStore;
|
|
730
750
|
}
|
|
731
751
|
|
|
732
752
|
setInternalEventReporter(reporter: InternalEventReporter): void {
|
|
@@ -772,7 +792,8 @@ abstract class TelemetryPipeline<
|
|
|
772
792
|
this.droppedCount += 1;
|
|
773
793
|
return;
|
|
774
794
|
}
|
|
775
|
-
prepared =
|
|
795
|
+
prepared =
|
|
796
|
+
/* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ afterDefault as TRecord;
|
|
776
797
|
} catch {
|
|
777
798
|
this.droppedCount += 1;
|
|
778
799
|
return;
|
|
@@ -860,7 +881,7 @@ abstract class TelemetryPipeline<
|
|
|
860
881
|
}
|
|
861
882
|
|
|
862
883
|
// result.type === record.type === TRecord["type"]이므로 narrowed TRecord로 안전하게 좁힐 수 있다.
|
|
863
|
-
return result as TRecord;
|
|
884
|
+
return /* SAFETY: 등록된 WebSocket 이벤트 스키마가 이 값의 타입을 보장한다. */ result as TRecord;
|
|
864
885
|
}
|
|
865
886
|
|
|
866
887
|
protected dispatchToSinks(record: TRecord, selfObserveFailures = true): void {
|
|
@@ -885,9 +906,9 @@ abstract class TelemetryPipeline<
|
|
|
885
906
|
() => {
|
|
886
907
|
this.decrementInFlightEmit(sink);
|
|
887
908
|
},
|
|
888
|
-
(
|
|
909
|
+
(cause: unknown) => {
|
|
889
910
|
this.decrementInFlightEmit(sink);
|
|
890
|
-
this.observeSinkFailure("emit",
|
|
911
|
+
this.observeSinkFailure("emit", cause, selfObserveFailures);
|
|
891
912
|
},
|
|
892
913
|
);
|
|
893
914
|
}
|
|
@@ -906,9 +927,9 @@ abstract class TelemetryPipeline<
|
|
|
906
927
|
this.inFlightEmits.set(sink, current - 1);
|
|
907
928
|
}
|
|
908
929
|
|
|
909
|
-
private observeSinkFailure(
|
|
930
|
+
private observeSinkFailure<Value>(
|
|
910
931
|
phase: "emit" | "shutdown",
|
|
911
|
-
error:
|
|
932
|
+
error: Value,
|
|
912
933
|
selfObserveFailure: boolean,
|
|
913
934
|
): void {
|
|
914
935
|
this.sinkFailureCount += 1;
|
|
@@ -916,14 +937,14 @@ abstract class TelemetryPipeline<
|
|
|
916
937
|
this.dispatchInternalEvent("ws.telemetry.sink.failed", "warn", {
|
|
917
938
|
phase,
|
|
918
939
|
signal: this.signal,
|
|
919
|
-
errorType: error instanceof Error ? error.name :
|
|
940
|
+
errorType: error instanceof Error ? error.name : runtimeTypeOf(error),
|
|
920
941
|
});
|
|
921
942
|
}
|
|
922
943
|
|
|
923
944
|
protected dispatchInternalEvent(
|
|
924
945
|
name: string,
|
|
925
946
|
level: WebSocketTelemetryEventRecord["level"],
|
|
926
|
-
detail?:
|
|
947
|
+
detail?: WebSocketTelemetryAttributes,
|
|
927
948
|
): void {
|
|
928
949
|
if (this.internalEventReporter === undefined) return;
|
|
929
950
|
try {
|
|
@@ -953,8 +974,8 @@ abstract class TelemetryPipeline<
|
|
|
953
974
|
let timeout: ReturnType<typeof setTimeout> | null = null;
|
|
954
975
|
const shutdownPromise = result.then(
|
|
955
976
|
() => "completed" as const,
|
|
956
|
-
(
|
|
957
|
-
throw
|
|
977
|
+
(cause: unknown) => {
|
|
978
|
+
throw cause;
|
|
958
979
|
},
|
|
959
980
|
);
|
|
960
981
|
const timeoutPromise = new Promise<"timeout">((resolve) => {
|
|
@@ -1056,7 +1077,7 @@ class EventPipeline extends TelemetryPipeline<
|
|
|
1056
1077
|
dispatchInternalDiagnosticEvent(
|
|
1057
1078
|
name: string,
|
|
1058
1079
|
level: WebSocketTelemetryEventRecord["level"],
|
|
1059
|
-
detail?:
|
|
1080
|
+
detail?: WebSocketTelemetryAttributes,
|
|
1060
1081
|
): void {
|
|
1061
1082
|
const record: WebSocketTelemetryEventRecord = {
|
|
1062
1083
|
type: "event",
|
|
@@ -1172,7 +1193,7 @@ class MetricPipeline extends TelemetryPipeline<
|
|
|
1172
1193
|
|
|
1173
1194
|
if (
|
|
1174
1195
|
this.collectionInterval &&
|
|
1175
|
-
|
|
1196
|
+
isObjectValue(this.collectionInterval) &&
|
|
1176
1197
|
"unref" in this.collectionInterval
|
|
1177
1198
|
) {
|
|
1178
1199
|
this.collectionInterval.unref();
|
|
@@ -1595,28 +1616,30 @@ function buildController(
|
|
|
1595
1616
|
// 신호별 redactor / beforeRecord 해석.
|
|
1596
1617
|
// null이면 sharedRedactor를 undefined로 덮어써 step 2 자체를 skip한다.
|
|
1597
1618
|
const eventsSharedRedactor = eventsOpt.redactor === null ? undefined : defaults.redactor;
|
|
1598
|
-
const eventsSignalRedactor =
|
|
1599
|
-
typeof eventsOpt.redactor === "function" ? eventsOpt.redactor : undefined;
|
|
1619
|
+
const eventsSignalRedactor = isFunctionValue(eventsOpt.redactor) ? eventsOpt.redactor : undefined;
|
|
1600
1620
|
const eventsSharedBeforeRecord =
|
|
1601
1621
|
eventsOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
|
|
1602
|
-
const eventsSignalBeforeRecord =
|
|
1603
|
-
|
|
1622
|
+
const eventsSignalBeforeRecord = isFunctionValue(eventsOpt.beforeRecord)
|
|
1623
|
+
? eventsOpt.beforeRecord
|
|
1624
|
+
: undefined;
|
|
1604
1625
|
|
|
1605
1626
|
const metricsSharedRedactor = metricsOpt.redactor === null ? undefined : defaults.redactor;
|
|
1606
|
-
const metricsSignalRedactor =
|
|
1607
|
-
|
|
1627
|
+
const metricsSignalRedactor = isFunctionValue(metricsOpt.redactor)
|
|
1628
|
+
? metricsOpt.redactor
|
|
1629
|
+
: undefined;
|
|
1608
1630
|
const metricsSharedBeforeRecord =
|
|
1609
1631
|
metricsOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
|
|
1610
|
-
const metricsSignalBeforeRecord =
|
|
1611
|
-
|
|
1632
|
+
const metricsSignalBeforeRecord = isFunctionValue(metricsOpt.beforeRecord)
|
|
1633
|
+
? metricsOpt.beforeRecord
|
|
1634
|
+
: undefined;
|
|
1612
1635
|
|
|
1613
1636
|
const spansSharedRedactor = spansOpt.redactor === null ? undefined : defaults.redactor;
|
|
1614
|
-
const spansSignalRedactor =
|
|
1615
|
-
typeof spansOpt.redactor === "function" ? spansOpt.redactor : undefined;
|
|
1637
|
+
const spansSignalRedactor = isFunctionValue(spansOpt.redactor) ? spansOpt.redactor : undefined;
|
|
1616
1638
|
const spansSharedBeforeRecord =
|
|
1617
1639
|
spansOpt.beforeRecord === null ? undefined : defaults.beforeRecord;
|
|
1618
|
-
const spansSignalBeforeRecord =
|
|
1619
|
-
|
|
1640
|
+
const spansSignalBeforeRecord = isFunctionValue(spansOpt.beforeRecord)
|
|
1641
|
+
? spansOpt.beforeRecord
|
|
1642
|
+
: undefined;
|
|
1620
1643
|
|
|
1621
1644
|
// events
|
|
1622
1645
|
const eventSinks: WebSocketTelemetryEventSink[] = eventsOpt.sinks ? [...eventsOpt.sinks] : [];
|