blendsdk 5.33.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/README.md +125 -0
- package/dist/cmdline/cmdline.d.ts +144 -0
- package/dist/cmdline/cmdline.d.ts.map +1 -0
- package/dist/cmdline/cmdline.js +683 -0
- package/dist/cmdline/cmdline.js.map +1 -0
- package/dist/cmdline/errors.d.ts +105 -0
- package/dist/cmdline/errors.d.ts.map +1 -0
- package/dist/cmdline/errors.js +153 -0
- package/dist/cmdline/errors.js.map +1 -0
- package/dist/cmdline/index.d.ts +5 -0
- package/dist/cmdline/index.d.ts.map +1 -0
- package/dist/cmdline/index.js +5 -0
- package/dist/cmdline/index.js.map +1 -0
- package/dist/cmdline/types.d.ts +260 -0
- package/dist/cmdline/types.d.ts.map +1 -0
- package/dist/cmdline/types.js +9 -0
- package/dist/cmdline/types.js.map +1 -0
- package/dist/cmdline/validators.d.ts +28 -0
- package/dist/cmdline/validators.d.ts.map +1 -0
- package/dist/cmdline/validators.js +211 -0
- package/dist/cmdline/validators.js.map +1 -0
- package/dist/codegen/database/index.d.ts +3 -0
- package/dist/codegen/database/index.d.ts.map +1 -0
- package/dist/codegen/database/index.js +3 -0
- package/dist/codegen/database/index.js.map +1 -0
- package/dist/codegen/database/introspect/index.d.ts +3 -0
- package/dist/codegen/database/introspect/index.d.ts.map +1 -0
- package/dist/codegen/database/introspect/index.js +3 -0
- package/dist/codegen/database/introspect/index.js.map +1 -0
- package/dist/codegen/database/introspect/introspect-query.d.ts +2 -0
- package/dist/codegen/database/introspect/introspect-query.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect-query.js +416 -0
- package/dist/codegen/database/introspect/introspect-query.js.map +1 -0
- package/dist/codegen/database/introspect/introspect-types.d.ts +45 -0
- package/dist/codegen/database/introspect/introspect-types.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect-types.js +2 -0
- package/dist/codegen/database/introspect/introspect-types.js.map +1 -0
- package/dist/codegen/database/introspect/introspect.d.ts +21 -0
- package/dist/codegen/database/introspect/introspect.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect.js +223 -0
- package/dist/codegen/database/introspect/introspect.js.map +1 -0
- package/dist/codegen/database/schema/check-constraint.d.ts +8 -0
- package/dist/codegen/database/schema/check-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/check-constraint.js +12 -0
- package/dist/codegen/database/schema/check-constraint.js.map +1 -0
- package/dist/codegen/database/schema/column-schema.d.ts +7 -0
- package/dist/codegen/database/schema/column-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/column-schema.js +9 -0
- package/dist/codegen/database/schema/column-schema.js.map +1 -0
- package/dist/codegen/database/schema/constraint-base.d.ts +13 -0
- package/dist/codegen/database/schema/constraint-base.d.ts.map +1 -0
- package/dist/codegen/database/schema/constraint-base.js +32 -0
- package/dist/codegen/database/schema/constraint-base.js.map +1 -0
- package/dist/codegen/database/schema/database-schema.d.ts +19 -0
- package/dist/codegen/database/schema/database-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/database-schema.js +48 -0
- package/dist/codegen/database/schema/database-schema.js.map +1 -0
- package/dist/codegen/database/schema/dataobject-schema.d.ts +9 -0
- package/dist/codegen/database/schema/dataobject-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/dataobject-schema.js +18 -0
- package/dist/codegen/database/schema/dataobject-schema.js.map +1 -0
- package/dist/codegen/database/schema/fkey-constraints.d.ts +21 -0
- package/dist/codegen/database/schema/fkey-constraints.d.ts.map +1 -0
- package/dist/codegen/database/schema/fkey-constraints.js +58 -0
- package/dist/codegen/database/schema/fkey-constraints.js.map +1 -0
- package/dist/codegen/database/schema/index-constraint.d.ts +34 -0
- package/dist/codegen/database/schema/index-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/index-constraint.js +79 -0
- package/dist/codegen/database/schema/index-constraint.js.map +1 -0
- package/dist/codegen/database/schema/index.d.ts +5 -0
- package/dist/codegen/database/schema/index.d.ts.map +1 -0
- package/dist/codegen/database/schema/index.js +5 -0
- package/dist/codegen/database/schema/index.js.map +1 -0
- package/dist/codegen/database/schema/primarykey-constraint.d.ts +4 -0
- package/dist/codegen/database/schema/primarykey-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/primarykey-constraint.js +4 -0
- package/dist/codegen/database/schema/primarykey-constraint.js.map +1 -0
- package/dist/codegen/database/schema/relation-schema.d.ts +16 -0
- package/dist/codegen/database/schema/relation-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/relation-schema.js +32 -0
- package/dist/codegen/database/schema/relation-schema.js.map +1 -0
- package/dist/codegen/database/schema/table-column-schema.d.ts +59 -0
- package/dist/codegen/database/schema/table-column-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/table-column-schema.js +137 -0
- package/dist/codegen/database/schema/table-column-schema.js.map +1 -0
- package/dist/codegen/database/schema/table-schema.d.ts +48 -0
- package/dist/codegen/database/schema/table-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/table-schema.js +219 -0
- package/dist/codegen/database/schema/table-schema.js.map +1 -0
- package/dist/codegen/database/schema/types.d.ts +13 -0
- package/dist/codegen/database/schema/types.d.ts.map +1 -0
- package/dist/codegen/database/schema/types.js +175 -0
- package/dist/codegen/database/schema/types.js.map +1 -0
- package/dist/codegen/database/schema/unique-constraint.d.ts +4 -0
- package/dist/codegen/database/schema/unique-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/unique-constraint.js +4 -0
- package/dist/codegen/database/schema/unique-constraint.js.map +1 -0
- package/dist/codegen/database/schema/view-schema.d.ts +14 -0
- package/dist/codegen/database/schema/view-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/view-schema.js +32 -0
- package/dist/codegen/database/schema/view-schema.js.map +1 -0
- package/dist/codegen/generator/ctype-generator.d.ts +5 -0
- package/dist/codegen/generator/ctype-generator.d.ts.map +1 -0
- package/dist/codegen/generator/ctype-generator.js +26 -0
- package/dist/codegen/generator/ctype-generator.js.map +1 -0
- package/dist/codegen/generator/generator.d.ts +17 -0
- package/dist/codegen/generator/generator.d.ts.map +1 -0
- package/dist/codegen/generator/generator.js +57 -0
- package/dist/codegen/generator/generator.js.map +1 -0
- package/dist/codegen/generator/index.d.ts +8 -0
- package/dist/codegen/generator/index.d.ts.map +1 -0
- package/dist/codegen/generator/index.js +8 -0
- package/dist/codegen/generator/index.js.map +1 -0
- package/dist/codegen/generator/openapi-generator.d.ts +239 -0
- package/dist/codegen/generator/openapi-generator.d.ts.map +1 -0
- package/dist/codegen/generator/openapi-generator.js +434 -0
- package/dist/codegen/generator/openapi-generator.js.map +1 -0
- package/dist/codegen/generator/openapi-types.d.ts +263 -0
- package/dist/codegen/generator/openapi-types.d.ts.map +1 -0
- package/dist/codegen/generator/openapi-types.js +11 -0
- package/dist/codegen/generator/openapi-types.js.map +1 -0
- package/dist/codegen/generator/postgres-schema-generator.d.ts +48 -0
- package/dist/codegen/generator/postgres-schema-generator.d.ts.map +1 -0
- package/dist/codegen/generator/postgres-schema-generator.js +339 -0
- package/dist/codegen/generator/postgres-schema-generator.js.map +1 -0
- package/dist/codegen/generator/type-generator.d.ts +113 -0
- package/dist/codegen/generator/type-generator.d.ts.map +1 -0
- package/dist/codegen/generator/type-generator.js +249 -0
- package/dist/codegen/generator/type-generator.js.map +1 -0
- package/dist/codegen/generator/zod-generator.d.ts +15 -0
- package/dist/codegen/generator/zod-generator.d.ts.map +1 -0
- package/dist/codegen/generator/zod-generator.js +86 -0
- package/dist/codegen/generator/zod-generator.js.map +1 -0
- package/dist/codegen/generator/zod-to-openapi.d.ts +69 -0
- package/dist/codegen/generator/zod-to-openapi.d.ts.map +1 -0
- package/dist/codegen/generator/zod-to-openapi.js +480 -0
- package/dist/codegen/generator/zod-to-openapi.js.map +1 -0
- package/dist/codegen/index.d.ts +4 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +4 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/schema/any-schema.d.ts +6 -0
- package/dist/codegen/schema/any-schema.d.ts.map +1 -0
- package/dist/codegen/schema/any-schema.js +12 -0
- package/dist/codegen/schema/any-schema.js.map +1 -0
- package/dist/codegen/schema/boolean-schema.d.ts +6 -0
- package/dist/codegen/schema/boolean-schema.d.ts.map +1 -0
- package/dist/codegen/schema/boolean-schema.js +12 -0
- package/dist/codegen/schema/boolean-schema.js.map +1 -0
- package/dist/codegen/schema/date-schema.d.ts +6 -0
- package/dist/codegen/schema/date-schema.d.ts.map +1 -0
- package/dist/codegen/schema/date-schema.js +12 -0
- package/dist/codegen/schema/date-schema.js.map +1 -0
- package/dist/codegen/schema/index.d.ts +10 -0
- package/dist/codegen/schema/index.d.ts.map +1 -0
- package/dist/codegen/schema/index.js +10 -0
- package/dist/codegen/schema/index.js.map +1 -0
- package/dist/codegen/schema/object-schema.d.ts +10 -0
- package/dist/codegen/schema/object-schema.d.ts.map +1 -0
- package/dist/codegen/schema/object-schema.js +21 -0
- package/dist/codegen/schema/object-schema.js.map +1 -0
- package/dist/codegen/schema/primitive-schema.d.ts +20 -0
- package/dist/codegen/schema/primitive-schema.d.ts.map +1 -0
- package/dist/codegen/schema/primitive-schema.js +48 -0
- package/dist/codegen/schema/primitive-schema.js.map +1 -0
- package/dist/codegen/schema/ref-schema.d.ts +6 -0
- package/dist/codegen/schema/ref-schema.d.ts.map +1 -0
- package/dist/codegen/schema/ref-schema.js +11 -0
- package/dist/codegen/schema/ref-schema.js.map +1 -0
- package/dist/codegen/schema/schema-container.d.ts +14 -0
- package/dist/codegen/schema/schema-container.d.ts.map +1 -0
- package/dist/codegen/schema/schema-container.js +38 -0
- package/dist/codegen/schema/schema-container.js.map +1 -0
- package/dist/codegen/schema/schema-object.d.ts +42 -0
- package/dist/codegen/schema/schema-object.d.ts.map +1 -0
- package/dist/codegen/schema/schema-object.js +90 -0
- package/dist/codegen/schema/schema-object.js.map +1 -0
- package/dist/codegen/schema/schema-scope.d.ts +23 -0
- package/dist/codegen/schema/schema-scope.d.ts.map +1 -0
- package/dist/codegen/schema/schema-scope.js +67 -0
- package/dist/codegen/schema/schema-scope.js.map +1 -0
- package/dist/codegen/schema/utils.d.ts +17 -0
- package/dist/codegen/schema/utils.d.ts.map +1 -0
- package/dist/codegen/schema/utils.js +47 -0
- package/dist/codegen/schema/utils.js.map +1 -0
- package/dist/dbcore/crud-statement.d.ts +67 -0
- package/dist/dbcore/crud-statement.d.ts.map +1 -0
- package/dist/dbcore/crud-statement.js +75 -0
- package/dist/dbcore/crud-statement.js.map +1 -0
- package/dist/dbcore/database.d.ts +272 -0
- package/dist/dbcore/database.d.ts.map +1 -0
- package/dist/dbcore/database.js +53 -0
- package/dist/dbcore/database.js.map +1 -0
- package/dist/dbcore/dataservice-base.d.ts +18 -0
- package/dist/dbcore/dataservice-base.d.ts.map +1 -0
- package/dist/dbcore/dataservice-base.js +19 -0
- package/dist/dbcore/dataservice-base.js.map +1 -0
- package/dist/dbcore/delete-statement.d.ts +29 -0
- package/dist/dbcore/delete-statement.d.ts.map +1 -0
- package/dist/dbcore/delete-statement.js +30 -0
- package/dist/dbcore/delete-statement.js.map +1 -0
- package/dist/dbcore/filterable-statement.d.ts +126 -0
- package/dist/dbcore/filterable-statement.d.ts.map +1 -0
- package/dist/dbcore/filterable-statement.js +178 -0
- package/dist/dbcore/filterable-statement.js.map +1 -0
- package/dist/dbcore/from-statement.d.ts +120 -0
- package/dist/dbcore/from-statement.d.ts.map +1 -0
- package/dist/dbcore/from-statement.js +150 -0
- package/dist/dbcore/from-statement.js.map +1 -0
- package/dist/dbcore/index.d.ts +21 -0
- package/dist/dbcore/index.d.ts.map +1 -0
- package/dist/dbcore/index.js +21 -0
- package/dist/dbcore/index.js.map +1 -0
- package/dist/dbcore/insert-statement.d.ts +48 -0
- package/dist/dbcore/insert-statement.d.ts.map +1 -0
- package/dist/dbcore/insert-statement.js +52 -0
- package/dist/dbcore/insert-statement.js.map +1 -0
- package/dist/dbcore/query-dataservice.d.ts +144 -0
- package/dist/dbcore/query-dataservice.d.ts.map +1 -0
- package/dist/dbcore/query-dataservice.js +144 -0
- package/dist/dbcore/query-dataservice.js.map +1 -0
- package/dist/dbcore/statement.d.ts +133 -0
- package/dist/dbcore/statement.d.ts.map +1 -0
- package/dist/dbcore/statement.js +138 -0
- package/dist/dbcore/statement.js.map +1 -0
- package/dist/dbcore/update-statement.d.ts +48 -0
- package/dist/dbcore/update-statement.d.ts.map +1 -0
- package/dist/dbcore/update-statement.js +52 -0
- package/dist/dbcore/update-statement.js.map +1 -0
- package/dist/expression/builders/comparison-builder.d.ts +47 -0
- package/dist/expression/builders/comparison-builder.d.ts.map +1 -0
- package/dist/expression/builders/comparison-builder.js +197 -0
- package/dist/expression/builders/comparison-builder.js.map +1 -0
- package/dist/expression/builders/query-builder.d.ts +80 -0
- package/dist/expression/builders/query-builder.d.ts.map +1 -0
- package/dist/expression/builders/query-builder.js +229 -0
- package/dist/expression/builders/query-builder.js.map +1 -0
- package/dist/expression/compiler/postgresql-compiler.d.ts +56 -0
- package/dist/expression/compiler/postgresql-compiler.d.ts.map +1 -0
- package/dist/expression/compiler/postgresql-compiler.js +217 -0
- package/dist/expression/compiler/postgresql-compiler.js.map +1 -0
- package/dist/expression/core/ast-node.d.ts +47 -0
- package/dist/expression/core/ast-node.d.ts.map +1 -0
- package/dist/expression/core/ast-node.js +154 -0
- package/dist/expression/core/ast-node.js.map +1 -0
- package/dist/expression/core/parameter-manager.d.ts +84 -0
- package/dist/expression/core/parameter-manager.d.ts.map +1 -0
- package/dist/expression/core/parameter-manager.js +164 -0
- package/dist/expression/core/parameter-manager.js.map +1 -0
- package/dist/expression/core/query-builder-interfaces.d.ts +188 -0
- package/dist/expression/core/query-builder-interfaces.d.ts.map +1 -0
- package/dist/expression/core/query-builder-interfaces.js +6 -0
- package/dist/expression/core/query-builder-interfaces.js.map +1 -0
- package/dist/expression/core/types.d.ts +239 -0
- package/dist/expression/core/types.d.ts.map +1 -0
- package/dist/expression/core/types.js +121 -0
- package/dist/expression/core/types.js.map +1 -0
- package/dist/expression/index.d.ts +11 -0
- package/dist/expression/index.d.ts.map +1 -0
- package/dist/expression/index.js +11 -0
- package/dist/expression/index.js.map +1 -0
- package/dist/i18n/content-file-source.d.ts +109 -0
- package/dist/i18n/content-file-source.d.ts.map +1 -0
- package/dist/i18n/content-file-source.js +218 -0
- package/dist/i18n/content-file-source.js.map +1 -0
- package/dist/i18n/index.d.ts +19 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +21 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/json-file-source.d.ts +96 -0
- package/dist/i18n/json-file-source.d.ts.map +1 -0
- package/dist/i18n/json-file-source.js +258 -0
- package/dist/i18n/json-file-source.js.map +1 -0
- package/dist/i18n/merge-catalogs.d.ts +20 -0
- package/dist/i18n/merge-catalogs.d.ts.map +1 -0
- package/dist/i18n/merge-catalogs.js +34 -0
- package/dist/i18n/merge-catalogs.js.map +1 -0
- package/dist/i18n/node.d.ts +20 -0
- package/dist/i18n/node.d.ts.map +1 -0
- package/dist/i18n/node.js +19 -0
- package/dist/i18n/node.js.map +1 -0
- package/dist/i18n/translation-source.d.ts +35 -0
- package/dist/i18n/translation-source.d.ts.map +1 -0
- package/dist/i18n/translation-source.js +2 -0
- package/dist/i18n/translation-source.js.map +1 -0
- package/dist/i18n/translator.d.ts +162 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/i18n/translator.js +259 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/i18n/types.d.ts +80 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/postgresql/database.d.ts +204 -0
- package/dist/postgresql/database.d.ts.map +1 -0
- package/dist/postgresql/database.js +321 -0
- package/dist/postgresql/database.js.map +1 -0
- package/dist/postgresql/delete-statement.d.ts +36 -0
- package/dist/postgresql/delete-statement.d.ts.map +1 -0
- package/dist/postgresql/delete-statement.js +54 -0
- package/dist/postgresql/delete-statement.js.map +1 -0
- package/dist/postgresql/index.d.ts +12 -0
- package/dist/postgresql/index.d.ts.map +1 -0
- package/dist/postgresql/index.js +12 -0
- package/dist/postgresql/index.js.map +1 -0
- package/dist/postgresql/insert-statement.d.ts +34 -0
- package/dist/postgresql/insert-statement.d.ts.map +1 -0
- package/dist/postgresql/insert-statement.js +48 -0
- package/dist/postgresql/insert-statement.js.map +1 -0
- package/dist/postgresql/update-statement.d.ts +38 -0
- package/dist/postgresql/update-statement.d.ts.map +1 -0
- package/dist/postgresql/update-statement.js +75 -0
- package/dist/postgresql/update-statement.js.map +1 -0
- package/dist/stdlib/formatString.d.ts +52 -0
- package/dist/stdlib/formatString.d.ts.map +1 -0
- package/dist/stdlib/formatString.js +118 -0
- package/dist/stdlib/formatString.js.map +1 -0
- package/dist/stdlib/index.d.ts +8 -0
- package/dist/stdlib/index.d.ts.map +1 -0
- package/dist/stdlib/index.js +8 -0
- package/dist/stdlib/index.js.map +1 -0
- package/dist/stdlib/isBoolean.d.ts +15 -0
- package/dist/stdlib/isBoolean.d.ts.map +1 -0
- package/dist/stdlib/isBoolean.js +17 -0
- package/dist/stdlib/isBoolean.js.map +1 -0
- package/dist/stdlib/isNullOrUndef.d.ts +24 -0
- package/dist/stdlib/isNullOrUndef.d.ts.map +1 -0
- package/dist/stdlib/isNullOrUndef.js +28 -0
- package/dist/stdlib/isNullOrUndef.js.map +1 -0
- package/dist/stdlib/isNumeric.d.ts +20 -0
- package/dist/stdlib/isNumeric.d.ts.map +1 -0
- package/dist/stdlib/isNumeric.js +39 -0
- package/dist/stdlib/isNumeric.js.map +1 -0
- package/dist/stdlib/isString.d.ts +15 -0
- package/dist/stdlib/isString.d.ts.map +1 -0
- package/dist/stdlib/isString.js +17 -0
- package/dist/stdlib/isString.js.map +1 -0
- package/dist/stdlib/isTemplateString.d.ts +18 -0
- package/dist/stdlib/isTemplateString.d.ts.map +1 -0
- package/dist/stdlib/isTemplateString.js +38 -0
- package/dist/stdlib/isTemplateString.js.map +1 -0
- package/dist/stdlib/wrapInArray.d.ts +14 -0
- package/dist/stdlib/wrapInArray.d.ts.map +1 -0
- package/dist/stdlib/wrapInArray.js +17 -0
- package/dist/stdlib/wrapInArray.js.map +1 -0
- package/dist/webafx/application/application-settings.d.ts +129 -0
- package/dist/webafx/application/application-settings.d.ts.map +1 -0
- package/dist/webafx/application/application-settings.js +162 -0
- package/dist/webafx/application/application-settings.js.map +1 -0
- package/dist/webafx/application/base-controller.d.ts +128 -0
- package/dist/webafx/application/base-controller.d.ts.map +1 -0
- package/dist/webafx/application/base-controller.js +122 -0
- package/dist/webafx/application/base-controller.js.map +1 -0
- package/dist/webafx/application/console-logger.d.ts +81 -0
- package/dist/webafx/application/console-logger.d.ts.map +1 -0
- package/dist/webafx/application/console-logger.js +111 -0
- package/dist/webafx/application/console-logger.js.map +1 -0
- package/dist/webafx/application/controller-registry.d.ts +34 -0
- package/dist/webafx/application/controller-registry.d.ts.map +1 -0
- package/dist/webafx/application/controller-registry.js +32 -0
- package/dist/webafx/application/controller-registry.js.map +1 -0
- package/dist/webafx/application/error-handler-middleware.d.ts +22 -0
- package/dist/webafx/application/error-handler-middleware.d.ts.map +1 -0
- package/dist/webafx/application/error-handler-middleware.js +70 -0
- package/dist/webafx/application/error-handler-middleware.js.map +1 -0
- package/dist/webafx/application/index.d.ts +13 -0
- package/dist/webafx/application/index.d.ts.map +1 -0
- package/dist/webafx/application/index.js +13 -0
- package/dist/webafx/application/index.js.map +1 -0
- package/dist/webafx/application/logger.d.ts +2 -0
- package/dist/webafx/application/logger.d.ts.map +1 -0
- package/dist/webafx/application/logger.js +2 -0
- package/dist/webafx/application/logger.js.map +1 -0
- package/dist/webafx/application/plugin.d.ts +73 -0
- package/dist/webafx/application/plugin.d.ts.map +1 -0
- package/dist/webafx/application/plugin.js +90 -0
- package/dist/webafx/application/plugin.js.map +1 -0
- package/dist/webafx/application/rate-limiter.d.ts +35 -0
- package/dist/webafx/application/rate-limiter.d.ts.map +1 -0
- package/dist/webafx/application/rate-limiter.js +74 -0
- package/dist/webafx/application/rate-limiter.js.map +1 -0
- package/dist/webafx/application/request-context.d.ts +62 -0
- package/dist/webafx/application/request-context.d.ts.map +1 -0
- package/dist/webafx/application/request-context.js +54 -0
- package/dist/webafx/application/request-context.js.map +1 -0
- package/dist/webafx/application/request-id-middleware.d.ts +30 -0
- package/dist/webafx/application/request-id-middleware.d.ts.map +1 -0
- package/dist/webafx/application/request-id-middleware.js +57 -0
- package/dist/webafx/application/request-id-middleware.js.map +1 -0
- package/dist/webafx/application/route-builder.d.ts +231 -0
- package/dist/webafx/application/route-builder.d.ts.map +1 -0
- package/dist/webafx/application/route-builder.js +182 -0
- package/dist/webafx/application/route-builder.js.map +1 -0
- package/dist/webafx/application/service-container.d.ts +144 -0
- package/dist/webafx/application/service-container.d.ts.map +1 -0
- package/dist/webafx/application/service-container.js +192 -0
- package/dist/webafx/application/service-container.js.map +1 -0
- package/dist/webafx/application/services.d.ts +27 -0
- package/dist/webafx/application/services.d.ts.map +1 -0
- package/dist/webafx/application/services.js +33 -0
- package/dist/webafx/application/services.js.map +1 -0
- package/dist/webafx/application/structured-logger.d.ts +99 -0
- package/dist/webafx/application/structured-logger.d.ts.map +1 -0
- package/dist/webafx/application/structured-logger.js +132 -0
- package/dist/webafx/application/structured-logger.js.map +1 -0
- package/dist/webafx/application/type.d.ts +29 -0
- package/dist/webafx/application/type.d.ts.map +1 -0
- package/dist/webafx/application/type.js +2 -0
- package/dist/webafx/application/type.js.map +1 -0
- package/dist/webafx/application/web-application.d.ts +257 -0
- package/dist/webafx/application/web-application.d.ts.map +1 -0
- package/dist/webafx/application/web-application.js +611 -0
- package/dist/webafx/application/web-application.js.map +1 -0
- package/dist/webafx/errors/api-error.d.ts +21 -0
- package/dist/webafx/errors/api-error.d.ts.map +1 -0
- package/dist/webafx/errors/api-error.js +38 -0
- package/dist/webafx/errors/api-error.js.map +1 -0
- package/dist/webafx/errors/http-errors.d.ts +56 -0
- package/dist/webafx/errors/http-errors.d.ts.map +1 -0
- package/dist/webafx/errors/http-errors.js +74 -0
- package/dist/webafx/errors/http-errors.js.map +1 -0
- package/dist/webafx/errors/index.d.ts +4 -0
- package/dist/webafx/errors/index.d.ts.map +1 -0
- package/dist/webafx/errors/index.js +4 -0
- package/dist/webafx/errors/index.js.map +1 -0
- package/dist/webafx/errors/types.d.ts +42 -0
- package/dist/webafx/errors/types.d.ts.map +1 -0
- package/dist/webafx/errors/types.js +2 -0
- package/dist/webafx/errors/types.js.map +1 -0
- package/dist/webafx/index.d.ts +3 -0
- package/dist/webafx/index.d.ts.map +1 -0
- package/dist/webafx/index.js +3 -0
- package/dist/webafx/index.js.map +1 -0
- package/dist/webafx-auth/abstract-auth-provider.d.ts +178 -0
- package/dist/webafx-auth/abstract-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/abstract-auth-provider.js +240 -0
- package/dist/webafx-auth/abstract-auth-provider.js.map +1 -0
- package/dist/webafx-auth/index.d.ts +27 -0
- package/dist/webafx-auth/index.d.ts.map +1 -0
- package/dist/webafx-auth/index.js +32 -0
- package/dist/webafx-auth/index.js.map +1 -0
- package/dist/webafx-auth/jwt-auth-provider.d.ts +100 -0
- package/dist/webafx-auth/jwt-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/jwt-auth-provider.js +154 -0
- package/dist/webafx-auth/jwt-auth-provider.js.map +1 -0
- package/dist/webafx-auth/memory-auth-provider.d.ts +100 -0
- package/dist/webafx-auth/memory-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/memory-auth-provider.js +122 -0
- package/dist/webafx-auth/memory-auth-provider.js.map +1 -0
- package/dist/webafx-auth/types.d.ts +333 -0
- package/dist/webafx-auth/types.d.ts.map +1 -0
- package/dist/webafx-auth/types.js +24 -0
- package/dist/webafx-auth/types.js.map +1 -0
- package/dist/webafx-cache/abstract-cache-provider.d.ts +185 -0
- package/dist/webafx-cache/abstract-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/abstract-cache-provider.js +133 -0
- package/dist/webafx-cache/abstract-cache-provider.js.map +1 -0
- package/dist/webafx-cache/abstract-pubsub-provider.d.ts +170 -0
- package/dist/webafx-cache/abstract-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/abstract-pubsub-provider.js +132 -0
- package/dist/webafx-cache/abstract-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/cache-plugin.d.ts +114 -0
- package/dist/webafx-cache/cache-plugin.d.ts.map +1 -0
- package/dist/webafx-cache/cache-plugin.js +176 -0
- package/dist/webafx-cache/cache-plugin.js.map +1 -0
- package/dist/webafx-cache/index.d.ts +33 -0
- package/dist/webafx-cache/index.d.ts.map +1 -0
- package/dist/webafx-cache/index.js +44 -0
- package/dist/webafx-cache/index.js.map +1 -0
- package/dist/webafx-cache/memory-cache-provider.d.ts +99 -0
- package/dist/webafx-cache/memory-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/memory-cache-provider.js +251 -0
- package/dist/webafx-cache/memory-cache-provider.js.map +1 -0
- package/dist/webafx-cache/memory-pubsub-provider.d.ts +124 -0
- package/dist/webafx-cache/memory-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/memory-pubsub-provider.js +195 -0
- package/dist/webafx-cache/memory-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/pubsub-plugin.d.ts +128 -0
- package/dist/webafx-cache/pubsub-plugin.d.ts.map +1 -0
- package/dist/webafx-cache/pubsub-plugin.js +182 -0
- package/dist/webafx-cache/pubsub-plugin.js.map +1 -0
- package/dist/webafx-cache/redis-cache-provider.d.ts +81 -0
- package/dist/webafx-cache/redis-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/redis-cache-provider.js +209 -0
- package/dist/webafx-cache/redis-cache-provider.js.map +1 -0
- package/dist/webafx-cache/redis-pubsub-provider.d.ts +164 -0
- package/dist/webafx-cache/redis-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/redis-pubsub-provider.js +329 -0
- package/dist/webafx-cache/redis-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/types.d.ts +206 -0
- package/dist/webafx-cache/types.d.ts.map +1 -0
- package/dist/webafx-cache/types.js +27 -0
- package/dist/webafx-cache/types.js.map +1 -0
- package/dist/webafx-i18n/i18n-plugin.d.ts +29 -0
- package/dist/webafx-i18n/i18n-plugin.d.ts.map +1 -0
- package/dist/webafx-i18n/i18n-plugin.js +145 -0
- package/dist/webafx-i18n/i18n-plugin.js.map +1 -0
- package/dist/webafx-i18n/index.d.ts +12 -0
- package/dist/webafx-i18n/index.d.ts.map +1 -0
- package/dist/webafx-i18n/index.js +12 -0
- package/dist/webafx-i18n/index.js.map +1 -0
- package/dist/webafx-i18n/locale-resolver.d.ts +33 -0
- package/dist/webafx-i18n/locale-resolver.d.ts.map +1 -0
- package/dist/webafx-i18n/locale-resolver.js +67 -0
- package/dist/webafx-i18n/locale-resolver.js.map +1 -0
- package/dist/webafx-i18n/postgresql-source.d.ts +101 -0
- package/dist/webafx-i18n/postgresql-source.d.ts.map +1 -0
- package/dist/webafx-i18n/postgresql-source.js +101 -0
- package/dist/webafx-i18n/postgresql-source.js.map +1 -0
- package/dist/webafx-i18n/types.d.ts +70 -0
- package/dist/webafx-i18n/types.d.ts.map +1 -0
- package/dist/webafx-i18n/types.js +2 -0
- package/dist/webafx-i18n/types.js.map +1 -0
- package/dist/webafx-mailer/abstract-mail-provider.d.ts +55 -0
- package/dist/webafx-mailer/abstract-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/abstract-mail-provider.js +37 -0
- package/dist/webafx-mailer/abstract-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/index.d.ts +24 -0
- package/dist/webafx-mailer/index.d.ts.map +1 -0
- package/dist/webafx-mailer/index.js +34 -0
- package/dist/webafx-mailer/index.js.map +1 -0
- package/dist/webafx-mailer/mail-plugin.d.ts +98 -0
- package/dist/webafx-mailer/mail-plugin.d.ts.map +1 -0
- package/dist/webafx-mailer/mail-plugin.js +155 -0
- package/dist/webafx-mailer/mail-plugin.js.map +1 -0
- package/dist/webafx-mailer/memory-mail-provider.d.ts +85 -0
- package/dist/webafx-mailer/memory-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/memory-mail-provider.js +111 -0
- package/dist/webafx-mailer/memory-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/smtp-mail-provider.d.ts +65 -0
- package/dist/webafx-mailer/smtp-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/smtp-mail-provider.js +113 -0
- package/dist/webafx-mailer/smtp-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/types.d.ts +136 -0
- package/dist/webafx-mailer/types.d.ts.map +1 -0
- package/dist/webafx-mailer/types.js +13 -0
- package/dist/webafx-mailer/types.js.map +1 -0
- package/package.json +159 -0
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory cache provider with TTL support.
|
|
3
|
+
*
|
|
4
|
+
* Zero external dependencies — suitable for development, testing,
|
|
5
|
+
* and single-instance applications. Mimics Redis behavior:
|
|
6
|
+
* - TTL in seconds (stored as expiration timestamps)
|
|
7
|
+
* - Returns -1 for no expiry, -2 for missing key (ttl method)
|
|
8
|
+
* - Pattern matching with * wildcard
|
|
9
|
+
* - Periodic cleanup of expired entries
|
|
10
|
+
*
|
|
11
|
+
* Values are JSON-serialized/deserialized to match Redis behavior,
|
|
12
|
+
* ensuring what goes in is what comes out with no reference sharing.
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { CacheProvider } from "./abstract-cache-provider.js";
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
// Default Constants
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
/** Default cleanup interval: 60 seconds */
|
|
21
|
+
const DEFAULT_CLEANUP_INTERVAL_MS = 60_000;
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// MemoryCacheProvider
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
/**
|
|
26
|
+
* In-memory cache provider with TTL support.
|
|
27
|
+
*
|
|
28
|
+
* Uses a `Map<string, MemoryCacheEntry>` for storage with JSON serialization
|
|
29
|
+
* to match Redis behavior. Expired entries are lazily evicted on access and
|
|
30
|
+
* periodically cleaned up via a configurable interval timer.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const cache = new MemoryCacheProvider({
|
|
35
|
+
* rootKey: 'TestApp',
|
|
36
|
+
* defaultTTL: 60,
|
|
37
|
+
* cleanupIntervalMs: 5000,
|
|
38
|
+
* });
|
|
39
|
+
*
|
|
40
|
+
* await cache.set('key', { data: true });
|
|
41
|
+
* const value = await cache.get<{ data: boolean }>('key');
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export class MemoryCacheProvider extends CacheProvider {
|
|
45
|
+
/** Internal storage map: prefixed key → cache entry */
|
|
46
|
+
store;
|
|
47
|
+
/** Handle for the periodic cleanup interval (undefined if stopped) */
|
|
48
|
+
cleanupInterval;
|
|
49
|
+
/** Cleanup interval in milliseconds */
|
|
50
|
+
cleanupIntervalMs;
|
|
51
|
+
/**
|
|
52
|
+
* Create a new in-memory cache provider.
|
|
53
|
+
*
|
|
54
|
+
* @param config - Memory cache configuration with rootKey and optional cleanup interval
|
|
55
|
+
*/
|
|
56
|
+
constructor(config) {
|
|
57
|
+
super(config);
|
|
58
|
+
this.store = new Map();
|
|
59
|
+
this.cleanupIntervalMs = config.cleanupIntervalMs ?? DEFAULT_CLEANUP_INTERVAL_MS;
|
|
60
|
+
// Start periodic cleanup of expired entries to prevent memory leaks
|
|
61
|
+
this.startCleanup();
|
|
62
|
+
}
|
|
63
|
+
// -----------------------------------------------------------------------
|
|
64
|
+
// Core Operations
|
|
65
|
+
// -----------------------------------------------------------------------
|
|
66
|
+
/** @inheritDoc */
|
|
67
|
+
async set(key, value, ttlSeconds) {
|
|
68
|
+
const fullKey = this.buildKey(key);
|
|
69
|
+
const serialized = JSON.stringify(value);
|
|
70
|
+
const effectiveTTL = this.resolveTTL(ttlSeconds);
|
|
71
|
+
const entry = {
|
|
72
|
+
value: serialized,
|
|
73
|
+
// Convert TTL in seconds to an absolute expiration timestamp in ms
|
|
74
|
+
expiresAt: effectiveTTL !== undefined ? Date.now() + effectiveTTL * 1000 : undefined,
|
|
75
|
+
};
|
|
76
|
+
this.store.set(fullKey, entry);
|
|
77
|
+
}
|
|
78
|
+
/** @inheritDoc */
|
|
79
|
+
async get(key) {
|
|
80
|
+
const fullKey = this.buildKey(key);
|
|
81
|
+
const entry = this.store.get(fullKey);
|
|
82
|
+
if (!entry) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
// Lazy eviction: check if the entry has expired
|
|
86
|
+
if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {
|
|
87
|
+
this.store.delete(fullKey);
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
// Deserialize — treat parse failures as cache miss (matches Redis provider)
|
|
91
|
+
try {
|
|
92
|
+
return JSON.parse(entry.value);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/** @inheritDoc */
|
|
99
|
+
async delete(key) {
|
|
100
|
+
const fullKey = this.buildKey(key);
|
|
101
|
+
return this.store.delete(fullKey);
|
|
102
|
+
}
|
|
103
|
+
/** @inheritDoc */
|
|
104
|
+
async exists(key) {
|
|
105
|
+
const fullKey = this.buildKey(key);
|
|
106
|
+
const entry = this.store.get(fullKey);
|
|
107
|
+
if (!entry) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
// Lazy eviction: check if the entry has expired
|
|
111
|
+
if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {
|
|
112
|
+
this.store.delete(fullKey);
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
/** @inheritDoc */
|
|
118
|
+
async expire(key, ttlSeconds) {
|
|
119
|
+
const fullKey = this.buildKey(key);
|
|
120
|
+
const entry = this.store.get(fullKey);
|
|
121
|
+
if (!entry) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
// Cannot update TTL on an already-expired entry
|
|
125
|
+
if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {
|
|
126
|
+
this.store.delete(fullKey);
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
// Update the expiration timestamp
|
|
130
|
+
entry.expiresAt = Date.now() + ttlSeconds * 1000;
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
/** @inheritDoc */
|
|
134
|
+
async ttl(key) {
|
|
135
|
+
const fullKey = this.buildKey(key);
|
|
136
|
+
const entry = this.store.get(fullKey);
|
|
137
|
+
// Key doesn't exist
|
|
138
|
+
if (!entry) {
|
|
139
|
+
return -2;
|
|
140
|
+
}
|
|
141
|
+
// Lazy eviction: check if the entry has expired
|
|
142
|
+
if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {
|
|
143
|
+
this.store.delete(fullKey);
|
|
144
|
+
return -2;
|
|
145
|
+
}
|
|
146
|
+
// No expiry set — key persists indefinitely
|
|
147
|
+
if (entry.expiresAt === undefined) {
|
|
148
|
+
return -1;
|
|
149
|
+
}
|
|
150
|
+
// Calculate remaining TTL in seconds (round up to match Redis behavior)
|
|
151
|
+
const remaining = Math.ceil((entry.expiresAt - Date.now()) / 1000);
|
|
152
|
+
return remaining > 0 ? remaining : -2;
|
|
153
|
+
}
|
|
154
|
+
// -----------------------------------------------------------------------
|
|
155
|
+
// Pattern Operations
|
|
156
|
+
// -----------------------------------------------------------------------
|
|
157
|
+
/** @inheritDoc */
|
|
158
|
+
async deletePattern(pattern) {
|
|
159
|
+
const fullPattern = this.buildPattern(pattern);
|
|
160
|
+
const regex = this.patternToRegex(fullPattern);
|
|
161
|
+
let deleted = 0;
|
|
162
|
+
// Collect keys first to avoid mutating the map during iteration
|
|
163
|
+
const keysToDelete = [];
|
|
164
|
+
for (const key of this.store.keys()) {
|
|
165
|
+
if (regex.test(key)) {
|
|
166
|
+
keysToDelete.push(key);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
for (const key of keysToDelete) {
|
|
170
|
+
this.store.delete(key);
|
|
171
|
+
deleted++;
|
|
172
|
+
}
|
|
173
|
+
return deleted;
|
|
174
|
+
}
|
|
175
|
+
/** @inheritDoc */
|
|
176
|
+
async clear() {
|
|
177
|
+
// Only delete keys under this rootKey namespace (not other namespaces)
|
|
178
|
+
const prefix = this.buildKey("");
|
|
179
|
+
// Collect keys first to avoid mutating the map during iteration
|
|
180
|
+
const keysToDelete = [];
|
|
181
|
+
for (const key of this.store.keys()) {
|
|
182
|
+
if (key.startsWith(prefix)) {
|
|
183
|
+
keysToDelete.push(key);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
for (const key of keysToDelete) {
|
|
187
|
+
this.store.delete(key);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
// -----------------------------------------------------------------------
|
|
191
|
+
// Lifecycle
|
|
192
|
+
// -----------------------------------------------------------------------
|
|
193
|
+
/** @inheritDoc */
|
|
194
|
+
async health() {
|
|
195
|
+
// In-memory cache is always healthy as long as the process is running
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
/** @inheritDoc */
|
|
199
|
+
async shutdown() {
|
|
200
|
+
// Stop the cleanup interval to prevent further timer callbacks
|
|
201
|
+
if (this.cleanupInterval !== undefined) {
|
|
202
|
+
clearInterval(this.cleanupInterval);
|
|
203
|
+
this.cleanupInterval = undefined;
|
|
204
|
+
}
|
|
205
|
+
// Clear all entries from the store
|
|
206
|
+
this.store.clear();
|
|
207
|
+
}
|
|
208
|
+
// -----------------------------------------------------------------------
|
|
209
|
+
// Internal Helpers
|
|
210
|
+
// -----------------------------------------------------------------------
|
|
211
|
+
/**
|
|
212
|
+
* Convert a glob-style pattern (with * wildcards) to a RegExp.
|
|
213
|
+
*
|
|
214
|
+
* Escapes all regex special characters except *, which becomes .* to
|
|
215
|
+
* match any sequence of characters (mimicking Redis SCAN MATCH behavior).
|
|
216
|
+
*
|
|
217
|
+
* @param pattern - Glob pattern (e.g., 'MyApp:user:*')
|
|
218
|
+
* @returns RegExp that matches the pattern
|
|
219
|
+
*/
|
|
220
|
+
patternToRegex(pattern) {
|
|
221
|
+
const escaped = pattern
|
|
222
|
+
.replace(/[.+?^${}()|[\]\\]/g, "\\$&") // Escape regex specials
|
|
223
|
+
.replace(/\*/g, ".*"); // Convert * wildcard to .*
|
|
224
|
+
return new RegExp(`^${escaped}$`);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Start periodic cleanup of expired entries.
|
|
228
|
+
*
|
|
229
|
+
* Prevents unbounded memory growth from expired-but-not-accessed entries.
|
|
230
|
+
* The interval timer is unref'd so it doesn't prevent Node.js from exiting.
|
|
231
|
+
*/
|
|
232
|
+
startCleanup() {
|
|
233
|
+
// Only start if interval is positive (0 or negative disables cleanup)
|
|
234
|
+
if (this.cleanupIntervalMs <= 0) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.cleanupInterval = setInterval(() => {
|
|
238
|
+
const now = Date.now();
|
|
239
|
+
for (const [key, entry] of this.store.entries()) {
|
|
240
|
+
if (entry.expiresAt !== undefined && now > entry.expiresAt) {
|
|
241
|
+
this.store.delete(key);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}, this.cleanupIntervalMs);
|
|
245
|
+
// Unref so the interval doesn't prevent the Node.js process from exiting
|
|
246
|
+
if (this.cleanupInterval.unref) {
|
|
247
|
+
this.cleanupInterval.unref();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=memory-cache-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-cache-provider.js","sourceRoot":"","sources":["../src/memory-cache-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory pub/sub provider for development and testing.
|
|
3
|
+
*
|
|
4
|
+
* Uses in-process Maps and EventEmitter-style delivery. No network connections
|
|
5
|
+
* or external dependencies — perfect for unit tests and local development.
|
|
6
|
+
*
|
|
7
|
+
* Key behaviors:
|
|
8
|
+
* - JSON round-trip on publish (matches Redis serialization behavior)
|
|
9
|
+
* - Glob pattern matching via regex conversion (supports *, ?)
|
|
10
|
+
* - Synchronous delivery within the same event loop tick
|
|
11
|
+
* - Handler errors isolated via safeInvoke (log + continue)
|
|
12
|
+
* - Health always returns true (no external dependencies)
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { PubSubProvider } from "./abstract-pubsub-provider.js";
|
|
17
|
+
import type { MemoryPubSubConfig, MessageHandler } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* In-memory pub/sub provider for development and testing.
|
|
20
|
+
*
|
|
21
|
+
* Delivers messages synchronously within the same process.
|
|
22
|
+
* No external connections required — always healthy.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const pubsub = new MemoryPubSubProvider({ channelPrefix: 'Test' });
|
|
27
|
+
* await pubsub.subscribe<string>('greet', (msg) => console.log(msg.data));
|
|
28
|
+
* await pubsub.publish('greet', 'Hello!');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class MemoryPubSubProvider extends PubSubProvider {
|
|
32
|
+
/** Exact channel handlers: Map<userChannel, Set<MessageHandler>> */
|
|
33
|
+
protected handlers: Map<string, Set<MessageHandler>>;
|
|
34
|
+
/** Pattern handlers: Map<userPattern, Set<MessageHandler>> */
|
|
35
|
+
protected patternHandlers: Map<string, Set<MessageHandler>>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a new in-memory pub/sub provider.
|
|
38
|
+
*
|
|
39
|
+
* @param config - Optional configuration with channelPrefix and serviceName
|
|
40
|
+
*/
|
|
41
|
+
constructor(config?: MemoryPubSubConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Publish a message to a channel.
|
|
44
|
+
*
|
|
45
|
+
* Performs a JSON round-trip to match Redis behavior:
|
|
46
|
+
* - Ensures data is JSON-serializable (throws if not)
|
|
47
|
+
* - Handlers receive a new object (no shared references)
|
|
48
|
+
*
|
|
49
|
+
* @param channel - Channel name (prefix applied automatically)
|
|
50
|
+
* @param data - Message payload (will be JSON-serialized)
|
|
51
|
+
* @returns Number of handlers that received the message
|
|
52
|
+
*/
|
|
53
|
+
publish<T>(channel: string, data: T): Promise<number>;
|
|
54
|
+
/**
|
|
55
|
+
* Subscribe to an exact channel.
|
|
56
|
+
*
|
|
57
|
+
* Multiple handlers can be registered for the same channel.
|
|
58
|
+
* Duplicate handlers are deduplicated by the underlying Set.
|
|
59
|
+
*
|
|
60
|
+
* @param channel - Exact channel name
|
|
61
|
+
* @param handler - Handler function for incoming messages
|
|
62
|
+
*/
|
|
63
|
+
subscribe<T = unknown>(channel: string, handler: MessageHandler<T>): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Unsubscribe from an exact channel.
|
|
66
|
+
* Removes all handlers for the specified channel.
|
|
67
|
+
*
|
|
68
|
+
* @param channel - Channel name to unsubscribe from
|
|
69
|
+
*/
|
|
70
|
+
unsubscribe(channel: string): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Subscribe to a channel pattern with glob wildcards.
|
|
73
|
+
*
|
|
74
|
+
* Supports Redis-style glob patterns:
|
|
75
|
+
* - `*` matches any sequence of characters
|
|
76
|
+
* - `?` matches exactly one character
|
|
77
|
+
*
|
|
78
|
+
* @param pattern - Glob pattern (e.g., 'order:*')
|
|
79
|
+
* @param handler - Handler function for matching messages
|
|
80
|
+
*/
|
|
81
|
+
psubscribe<T = unknown>(pattern: string, handler: MessageHandler<T>): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Unsubscribe from a channel pattern.
|
|
84
|
+
* Removes all handlers for the specified pattern.
|
|
85
|
+
*
|
|
86
|
+
* @param pattern - Pattern to unsubscribe from
|
|
87
|
+
*/
|
|
88
|
+
punsubscribe(pattern: string): Promise<void>;
|
|
89
|
+
/**
|
|
90
|
+
* Get currently active subscriptions.
|
|
91
|
+
*
|
|
92
|
+
* @returns Object with exact `channels` and glob `patterns` arrays
|
|
93
|
+
*/
|
|
94
|
+
activeSubscriptions(): {
|
|
95
|
+
channels: string[];
|
|
96
|
+
patterns: string[];
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Health check — always returns true for in-memory provider.
|
|
100
|
+
* There are no external connections to verify.
|
|
101
|
+
*/
|
|
102
|
+
health(): Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Shutdown — clears all handlers.
|
|
105
|
+
* No connections to close for in-memory provider.
|
|
106
|
+
*/
|
|
107
|
+
shutdown(): Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Match a channel name against a glob pattern.
|
|
110
|
+
*
|
|
111
|
+
* Converts glob syntax to a regular expression:
|
|
112
|
+
* - `*` → `.*` (match any sequence of characters)
|
|
113
|
+
* - `?` → `.` (match exactly one character)
|
|
114
|
+
*
|
|
115
|
+
* All other regex-special characters are escaped to prevent
|
|
116
|
+
* accidental regex injection from channel or pattern names.
|
|
117
|
+
*
|
|
118
|
+
* @param channel - The channel name to test
|
|
119
|
+
* @param pattern - The glob pattern to match against
|
|
120
|
+
* @returns true if the channel matches the pattern
|
|
121
|
+
*/
|
|
122
|
+
protected matchGlob(channel: string, pattern: string): boolean;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=memory-pubsub-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-pubsub-provider.d.ts","sourceRoot":"","sources":["../src/memory-pubsub-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAEpF;;;;;;;;;;;;GAYG;AACH,qBAAa,oBAAqB,SAAQ,cAAc;IACpD,oEAAoE;IACpE,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAErD,8DAA8D;IAC9D,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;IAE5D;;;;OAIG;gBACS,MAAM,CAAC,EAAE,kBAAkB;IAUvC;;;;;;;;;;OAUG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC3D;;;;;;;;OAQG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxF;;;;;OAKG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD;;;;;;;;;OASG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzF;;;;;OAKG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD;;;;OAIG;IACH,mBAAmB,IAAI;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;IAWjE;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;CASjE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory pub/sub provider for development and testing.
|
|
3
|
+
*
|
|
4
|
+
* Uses in-process Maps and EventEmitter-style delivery. No network connections
|
|
5
|
+
* or external dependencies — perfect for unit tests and local development.
|
|
6
|
+
*
|
|
7
|
+
* Key behaviors:
|
|
8
|
+
* - JSON round-trip on publish (matches Redis serialization behavior)
|
|
9
|
+
* - Glob pattern matching via regex conversion (supports *, ?)
|
|
10
|
+
* - Synchronous delivery within the same event loop tick
|
|
11
|
+
* - Handler errors isolated via safeInvoke (log + continue)
|
|
12
|
+
* - Health always returns true (no external dependencies)
|
|
13
|
+
*
|
|
14
|
+
* @packageDocumentation
|
|
15
|
+
*/
|
|
16
|
+
import { PubSubProvider } from "./abstract-pubsub-provider.js";
|
|
17
|
+
/**
|
|
18
|
+
* In-memory pub/sub provider for development and testing.
|
|
19
|
+
*
|
|
20
|
+
* Delivers messages synchronously within the same process.
|
|
21
|
+
* No external connections required — always healthy.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const pubsub = new MemoryPubSubProvider({ channelPrefix: 'Test' });
|
|
26
|
+
* await pubsub.subscribe<string>('greet', (msg) => console.log(msg.data));
|
|
27
|
+
* await pubsub.publish('greet', 'Hello!');
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class MemoryPubSubProvider extends PubSubProvider {
|
|
31
|
+
/** Exact channel handlers: Map<userChannel, Set<MessageHandler>> */
|
|
32
|
+
handlers;
|
|
33
|
+
/** Pattern handlers: Map<userPattern, Set<MessageHandler>> */
|
|
34
|
+
patternHandlers;
|
|
35
|
+
/**
|
|
36
|
+
* Create a new in-memory pub/sub provider.
|
|
37
|
+
*
|
|
38
|
+
* @param config - Optional configuration with channelPrefix and serviceName
|
|
39
|
+
*/
|
|
40
|
+
constructor(config) {
|
|
41
|
+
super(config ?? {});
|
|
42
|
+
this.handlers = new Map();
|
|
43
|
+
this.patternHandlers = new Map();
|
|
44
|
+
}
|
|
45
|
+
// -------------------------------------------------------------------
|
|
46
|
+
// Core Operations
|
|
47
|
+
// -------------------------------------------------------------------
|
|
48
|
+
/**
|
|
49
|
+
* Publish a message to a channel.
|
|
50
|
+
*
|
|
51
|
+
* Performs a JSON round-trip to match Redis behavior:
|
|
52
|
+
* - Ensures data is JSON-serializable (throws if not)
|
|
53
|
+
* - Handlers receive a new object (no shared references)
|
|
54
|
+
*
|
|
55
|
+
* @param channel - Channel name (prefix applied automatically)
|
|
56
|
+
* @param data - Message payload (will be JSON-serialized)
|
|
57
|
+
* @returns Number of handlers that received the message
|
|
58
|
+
*/
|
|
59
|
+
async publish(channel, data) {
|
|
60
|
+
// JSON round-trip to match Redis behavior — ensures serializable data
|
|
61
|
+
// and gives handlers a fresh copy (no shared references)
|
|
62
|
+
const serialized = JSON.stringify(data);
|
|
63
|
+
const deserialized = JSON.parse(serialized);
|
|
64
|
+
let receiverCount = 0;
|
|
65
|
+
// Deliver to exact channel handlers
|
|
66
|
+
const channelHandlers = this.handlers.get(channel);
|
|
67
|
+
if (channelHandlers) {
|
|
68
|
+
for (const handler of channelHandlers) {
|
|
69
|
+
const envelope = { channel, data: deserialized };
|
|
70
|
+
void this.safeInvoke(handler, envelope);
|
|
71
|
+
receiverCount++;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Deliver to matching pattern handlers
|
|
75
|
+
for (const [pattern, patternHandlerSet] of this.patternHandlers) {
|
|
76
|
+
if (this.matchGlob(channel, pattern)) {
|
|
77
|
+
for (const handler of patternHandlerSet) {
|
|
78
|
+
const envelope = {
|
|
79
|
+
channel,
|
|
80
|
+
data: deserialized,
|
|
81
|
+
pattern,
|
|
82
|
+
};
|
|
83
|
+
void this.safeInvoke(handler, envelope);
|
|
84
|
+
receiverCount++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return receiverCount;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Subscribe to an exact channel.
|
|
92
|
+
*
|
|
93
|
+
* Multiple handlers can be registered for the same channel.
|
|
94
|
+
* Duplicate handlers are deduplicated by the underlying Set.
|
|
95
|
+
*
|
|
96
|
+
* @param channel - Exact channel name
|
|
97
|
+
* @param handler - Handler function for incoming messages
|
|
98
|
+
*/
|
|
99
|
+
async subscribe(channel, handler) {
|
|
100
|
+
if (!this.handlers.has(channel)) {
|
|
101
|
+
this.handlers.set(channel, new Set());
|
|
102
|
+
}
|
|
103
|
+
this.handlers.get(channel).add(handler);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Unsubscribe from an exact channel.
|
|
107
|
+
* Removes all handlers for the specified channel.
|
|
108
|
+
*
|
|
109
|
+
* @param channel - Channel name to unsubscribe from
|
|
110
|
+
*/
|
|
111
|
+
async unsubscribe(channel) {
|
|
112
|
+
this.handlers.delete(channel);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Subscribe to a channel pattern with glob wildcards.
|
|
116
|
+
*
|
|
117
|
+
* Supports Redis-style glob patterns:
|
|
118
|
+
* - `*` matches any sequence of characters
|
|
119
|
+
* - `?` matches exactly one character
|
|
120
|
+
*
|
|
121
|
+
* @param pattern - Glob pattern (e.g., 'order:*')
|
|
122
|
+
* @param handler - Handler function for matching messages
|
|
123
|
+
*/
|
|
124
|
+
async psubscribe(pattern, handler) {
|
|
125
|
+
if (!this.patternHandlers.has(pattern)) {
|
|
126
|
+
this.patternHandlers.set(pattern, new Set());
|
|
127
|
+
}
|
|
128
|
+
this.patternHandlers.get(pattern).add(handler);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Unsubscribe from a channel pattern.
|
|
132
|
+
* Removes all handlers for the specified pattern.
|
|
133
|
+
*
|
|
134
|
+
* @param pattern - Pattern to unsubscribe from
|
|
135
|
+
*/
|
|
136
|
+
async punsubscribe(pattern) {
|
|
137
|
+
this.patternHandlers.delete(pattern);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get currently active subscriptions.
|
|
141
|
+
*
|
|
142
|
+
* @returns Object with exact `channels` and glob `patterns` arrays
|
|
143
|
+
*/
|
|
144
|
+
activeSubscriptions() {
|
|
145
|
+
return {
|
|
146
|
+
channels: Array.from(this.handlers.keys()),
|
|
147
|
+
patterns: Array.from(this.patternHandlers.keys()),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// -------------------------------------------------------------------
|
|
151
|
+
// Lifecycle
|
|
152
|
+
// -------------------------------------------------------------------
|
|
153
|
+
/**
|
|
154
|
+
* Health check — always returns true for in-memory provider.
|
|
155
|
+
* There are no external connections to verify.
|
|
156
|
+
*/
|
|
157
|
+
async health() {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Shutdown — clears all handlers.
|
|
162
|
+
* No connections to close for in-memory provider.
|
|
163
|
+
*/
|
|
164
|
+
async shutdown() {
|
|
165
|
+
this.handlers.clear();
|
|
166
|
+
this.patternHandlers.clear();
|
|
167
|
+
}
|
|
168
|
+
// -------------------------------------------------------------------
|
|
169
|
+
// Internal: Glob Matching
|
|
170
|
+
// -------------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* Match a channel name against a glob pattern.
|
|
173
|
+
*
|
|
174
|
+
* Converts glob syntax to a regular expression:
|
|
175
|
+
* - `*` → `.*` (match any sequence of characters)
|
|
176
|
+
* - `?` → `.` (match exactly one character)
|
|
177
|
+
*
|
|
178
|
+
* All other regex-special characters are escaped to prevent
|
|
179
|
+
* accidental regex injection from channel or pattern names.
|
|
180
|
+
*
|
|
181
|
+
* @param channel - The channel name to test
|
|
182
|
+
* @param pattern - The glob pattern to match against
|
|
183
|
+
* @returns true if the channel matches the pattern
|
|
184
|
+
*/
|
|
185
|
+
matchGlob(channel, pattern) {
|
|
186
|
+
// Escape regex special chars, then convert glob wildcards to regex equivalents
|
|
187
|
+
const regexStr = pattern
|
|
188
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&") // Escape regex specials (not * or ?)
|
|
189
|
+
.replace(/\*/g, ".*") // * → .* (any sequence)
|
|
190
|
+
.replace(/\?/g, "."); // ? → . (single char)
|
|
191
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
192
|
+
return regex.test(channel);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=memory-pubsub-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-pubsub-provider.js","sourceRoot":"","sources":["../src/memory-pubsub-provider.ts"],"names":[],"mappings":"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"}
|