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,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebAFX plugin integration for pub/sub providers.
|
|
3
|
+
*
|
|
4
|
+
* Provides convenience factory functions that wire a PubSubProvider instance
|
|
5
|
+
* into a WebAFX application as a singleton service with health check,
|
|
6
|
+
* graceful shutdown, and optional declarative subscription support.
|
|
7
|
+
*
|
|
8
|
+
* This is the ONLY pub/sub file that imports from @blendsdk/webafx,
|
|
9
|
+
* which is why webafx is a peer dependency (not a hard dependency).
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import type { PluginDefinition } from "../webafx/index.js";
|
|
14
|
+
import { PubSubProvider } from "./abstract-pubsub-provider.js";
|
|
15
|
+
import type { RedisPubSubConfig, MemoryPubSubConfig, PubSubFactoryConfig, SubscriptionDefinition } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Options for pub/sub plugin creation.
|
|
18
|
+
*
|
|
19
|
+
* Allows overriding the plugin priority and registering declarative
|
|
20
|
+
* subscriptions that are set up at plugin installation time.
|
|
21
|
+
*/
|
|
22
|
+
export interface PubSubPluginOptions {
|
|
23
|
+
/** Plugin installation priority. Default: 30 */
|
|
24
|
+
priority?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Declarative subscriptions to register at plugin install time.
|
|
27
|
+
*
|
|
28
|
+
* Each entry specifies either a `channel` (exact) or `pattern` (glob)
|
|
29
|
+
* with a handler function. Subscriptions are registered in order
|
|
30
|
+
* during the plugin factory execution.
|
|
31
|
+
*/
|
|
32
|
+
subscriptions?: SubscriptionDefinition[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a WebAFX PluginDefinition from any PubSubProvider instance.
|
|
36
|
+
*
|
|
37
|
+
* Core function that wires a pub/sub provider into WebAFX:
|
|
38
|
+
* 1. Registers the provider as a singleton service in the service container
|
|
39
|
+
* 2. Registers any declarative subscriptions from options
|
|
40
|
+
* 3. Hooks the provider's health() into the /health endpoint
|
|
41
|
+
* 4. Hooks the provider's shutdown() into graceful shutdown
|
|
42
|
+
*
|
|
43
|
+
* The service name is read from `provider.serviceName` (defaults to 'pubsub').
|
|
44
|
+
*
|
|
45
|
+
* @param provider - Any PubSubProvider instance (Redis, Memory, or custom)
|
|
46
|
+
* @param options - Optional overrides for priority and declarative subscriptions
|
|
47
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const pubsub = new RedisPubSubProvider({ host: 'localhost' });
|
|
52
|
+
* app.use(createPubSubPlugin(pubsub));
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function createPubSubPlugin(provider: PubSubProvider, options?: PubSubPluginOptions): PluginDefinition;
|
|
56
|
+
/**
|
|
57
|
+
* Create a WebAFX pub/sub plugin with a Redis backend. One-liner registration.
|
|
58
|
+
*
|
|
59
|
+
* Creates a RedisPubSubProvider internally and returns a PluginDefinition.
|
|
60
|
+
* The user never needs to instantiate the provider manually.
|
|
61
|
+
*
|
|
62
|
+
* @param config - Redis pub/sub configuration (host, port, channelPrefix, etc.)
|
|
63
|
+
* @param options - Optional plugin options (priority, subscriptions)
|
|
64
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* app.use(redisPubSubPlugin({
|
|
69
|
+
* host: 'localhost',
|
|
70
|
+
* port: 6379,
|
|
71
|
+
* channelPrefix: 'MyApp',
|
|
72
|
+
* }));
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @example With declarative subscriptions
|
|
76
|
+
* ```typescript
|
|
77
|
+
* app.use(redisPubSubPlugin(
|
|
78
|
+
* { host: 'localhost', channelPrefix: 'MyApp' },
|
|
79
|
+
* {
|
|
80
|
+
* subscriptions: [
|
|
81
|
+
* { channel: 'order:created', handler: handleNewOrder },
|
|
82
|
+
* { pattern: 'audit:*', handler: handleAuditEvent },
|
|
83
|
+
* ]
|
|
84
|
+
* }
|
|
85
|
+
* ));
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function redisPubSubPlugin(config: RedisPubSubConfig, options?: PubSubPluginOptions): PluginDefinition;
|
|
89
|
+
/**
|
|
90
|
+
* Create a WebAFX pub/sub plugin with an In-Memory backend. One-liner registration.
|
|
91
|
+
*
|
|
92
|
+
* Creates a MemoryPubSubProvider internally and returns a PluginDefinition.
|
|
93
|
+
* Ideal for development, testing, and single-instance applications.
|
|
94
|
+
*
|
|
95
|
+
* @param config - Optional memory pub/sub configuration (channelPrefix, serviceName)
|
|
96
|
+
* @param options - Optional plugin options (priority, subscriptions)
|
|
97
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* app.use(memoryPubSubPlugin());
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare function memoryPubSubPlugin(config?: MemoryPubSubConfig, options?: PubSubPluginOptions): PluginDefinition;
|
|
105
|
+
/**
|
|
106
|
+
* Create a PubSubProvider based on configuration type.
|
|
107
|
+
*
|
|
108
|
+
* Factory function for environment-based backend switching.
|
|
109
|
+
* Returns the appropriate provider based on `config.type`.
|
|
110
|
+
* Use with `createPubSubPlugin()` to register in WebAFX.
|
|
111
|
+
*
|
|
112
|
+
* @param config - Pub/sub factory configuration with type discriminator
|
|
113
|
+
* @returns A PubSubProvider instance (Redis or Memory)
|
|
114
|
+
* @throws Error if config.type is not 'redis' or 'memory'
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* const pubsub = createPubSub({
|
|
119
|
+
* type: process.env.NODE_ENV === 'production' ? 'redis' : 'memory',
|
|
120
|
+
* host: process.env.REDIS_HOST,
|
|
121
|
+
* port: Number(process.env.REDIS_PORT),
|
|
122
|
+
* channelPrefix: 'MyApp',
|
|
123
|
+
* });
|
|
124
|
+
* app.use(createPubSubPlugin(pubsub));
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export declare function createPubSub(config: PubSubFactoryConfig): PubSubProvider;
|
|
128
|
+
//# sourceMappingURL=pubsub-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub-plugin.d.ts","sourceRoot":"","sources":["../src/pubsub-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAG/D,OAAO,KAAK,EACR,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACzB,MAAM,YAAY,CAAC;AAapB;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;CAC5C;AAMD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAC9B,QAAQ,EAAE,cAAc,EACxB,OAAO,CAAC,EAAE,mBAAmB,GAC9B,gBAAgB,CA0ClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,mBAAmB,GAC9B,gBAAgB,CAGlB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,CAAC,EAAE,kBAAkB,EAC3B,OAAO,CAAC,EAAE,mBAAmB,GAC9B,gBAAgB,CAGlB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CA0BxE"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebAFX plugin integration for pub/sub providers.
|
|
3
|
+
*
|
|
4
|
+
* Provides convenience factory functions that wire a PubSubProvider instance
|
|
5
|
+
* into a WebAFX application as a singleton service with health check,
|
|
6
|
+
* graceful shutdown, and optional declarative subscription support.
|
|
7
|
+
*
|
|
8
|
+
* This is the ONLY pub/sub file that imports from @blendsdk/webafx,
|
|
9
|
+
* which is why webafx is a peer dependency (not a hard dependency).
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { RedisPubSubProvider } from "./redis-pubsub-provider.js";
|
|
14
|
+
import { MemoryPubSubProvider } from "./memory-pubsub-provider.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Default Constants
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/** Default plugin priority — same as cache (30), independent plugins */
|
|
19
|
+
const DEFAULT_PUBSUB_PLUGIN_PRIORITY = 30;
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Plugin Factory Functions
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/**
|
|
24
|
+
* Create a WebAFX PluginDefinition from any PubSubProvider instance.
|
|
25
|
+
*
|
|
26
|
+
* Core function that wires a pub/sub provider into WebAFX:
|
|
27
|
+
* 1. Registers the provider as a singleton service in the service container
|
|
28
|
+
* 2. Registers any declarative subscriptions from options
|
|
29
|
+
* 3. Hooks the provider's health() into the /health endpoint
|
|
30
|
+
* 4. Hooks the provider's shutdown() into graceful shutdown
|
|
31
|
+
*
|
|
32
|
+
* The service name is read from `provider.serviceName` (defaults to 'pubsub').
|
|
33
|
+
*
|
|
34
|
+
* @param provider - Any PubSubProvider instance (Redis, Memory, or custom)
|
|
35
|
+
* @param options - Optional overrides for priority and declarative subscriptions
|
|
36
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const pubsub = new RedisPubSubProvider({ host: 'localhost' });
|
|
41
|
+
* app.use(createPubSubPlugin(pubsub));
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function createPubSubPlugin(provider, options) {
|
|
45
|
+
return {
|
|
46
|
+
name: provider.serviceName,
|
|
47
|
+
priority: options?.priority ?? DEFAULT_PUBSUB_PLUGIN_PRIORITY,
|
|
48
|
+
factory: async ({ app, logger }) => {
|
|
49
|
+
// Register the pub/sub provider as an application-wide singleton service.
|
|
50
|
+
// The factory ignores container/settings since the provider is pre-created.
|
|
51
|
+
app.registerService({
|
|
52
|
+
name: provider.serviceName,
|
|
53
|
+
type: "singleton",
|
|
54
|
+
factory: () => provider,
|
|
55
|
+
dispose: async () => {
|
|
56
|
+
await provider.shutdown();
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
// Register declarative subscriptions (if provided in options)
|
|
60
|
+
if (options?.subscriptions) {
|
|
61
|
+
for (const sub of options.subscriptions) {
|
|
62
|
+
if (sub.channel) {
|
|
63
|
+
await provider.subscribe(sub.channel, sub.handler);
|
|
64
|
+
await logger.info(`PubSub: subscribed to channel "${sub.channel}"`);
|
|
65
|
+
}
|
|
66
|
+
else if (sub.pattern) {
|
|
67
|
+
await provider.psubscribe(sub.pattern, sub.handler);
|
|
68
|
+
await logger.info(`PubSub: subscribed to pattern "${sub.pattern}"`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
await logger.info(`PubSub plugin "${provider.serviceName}" initialized ` +
|
|
73
|
+
`(${provider.constructor.name})`);
|
|
74
|
+
// Return Plugin hooks for health monitoring and graceful shutdown
|
|
75
|
+
return {
|
|
76
|
+
health: () => provider.health(),
|
|
77
|
+
shutdown: () => provider.shutdown(),
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Create a WebAFX pub/sub plugin with a Redis backend. One-liner registration.
|
|
84
|
+
*
|
|
85
|
+
* Creates a RedisPubSubProvider internally and returns a PluginDefinition.
|
|
86
|
+
* The user never needs to instantiate the provider manually.
|
|
87
|
+
*
|
|
88
|
+
* @param config - Redis pub/sub configuration (host, port, channelPrefix, etc.)
|
|
89
|
+
* @param options - Optional plugin options (priority, subscriptions)
|
|
90
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* app.use(redisPubSubPlugin({
|
|
95
|
+
* host: 'localhost',
|
|
96
|
+
* port: 6379,
|
|
97
|
+
* channelPrefix: 'MyApp',
|
|
98
|
+
* }));
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* @example With declarative subscriptions
|
|
102
|
+
* ```typescript
|
|
103
|
+
* app.use(redisPubSubPlugin(
|
|
104
|
+
* { host: 'localhost', channelPrefix: 'MyApp' },
|
|
105
|
+
* {
|
|
106
|
+
* subscriptions: [
|
|
107
|
+
* { channel: 'order:created', handler: handleNewOrder },
|
|
108
|
+
* { pattern: 'audit:*', handler: handleAuditEvent },
|
|
109
|
+
* ]
|
|
110
|
+
* }
|
|
111
|
+
* ));
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export function redisPubSubPlugin(config, options) {
|
|
115
|
+
const provider = new RedisPubSubProvider(config);
|
|
116
|
+
return createPubSubPlugin(provider, options);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a WebAFX pub/sub plugin with an In-Memory backend. One-liner registration.
|
|
120
|
+
*
|
|
121
|
+
* Creates a MemoryPubSubProvider internally and returns a PluginDefinition.
|
|
122
|
+
* Ideal for development, testing, and single-instance applications.
|
|
123
|
+
*
|
|
124
|
+
* @param config - Optional memory pub/sub configuration (channelPrefix, serviceName)
|
|
125
|
+
* @param options - Optional plugin options (priority, subscriptions)
|
|
126
|
+
* @returns A WebAFX PluginDefinition ready to pass to app.use()
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* app.use(memoryPubSubPlugin());
|
|
131
|
+
* ```
|
|
132
|
+
*/
|
|
133
|
+
export function memoryPubSubPlugin(config, options) {
|
|
134
|
+
const provider = new MemoryPubSubProvider(config);
|
|
135
|
+
return createPubSubPlugin(provider, options);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Create a PubSubProvider based on configuration type.
|
|
139
|
+
*
|
|
140
|
+
* Factory function for environment-based backend switching.
|
|
141
|
+
* Returns the appropriate provider based on `config.type`.
|
|
142
|
+
* Use with `createPubSubPlugin()` to register in WebAFX.
|
|
143
|
+
*
|
|
144
|
+
* @param config - Pub/sub factory configuration with type discriminator
|
|
145
|
+
* @returns A PubSubProvider instance (Redis or Memory)
|
|
146
|
+
* @throws Error if config.type is not 'redis' or 'memory'
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* const pubsub = createPubSub({
|
|
151
|
+
* type: process.env.NODE_ENV === 'production' ? 'redis' : 'memory',
|
|
152
|
+
* host: process.env.REDIS_HOST,
|
|
153
|
+
* port: Number(process.env.REDIS_PORT),
|
|
154
|
+
* channelPrefix: 'MyApp',
|
|
155
|
+
* });
|
|
156
|
+
* app.use(createPubSubPlugin(pubsub));
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
export function createPubSub(config) {
|
|
160
|
+
switch (config.type) {
|
|
161
|
+
case "redis":
|
|
162
|
+
return new RedisPubSubProvider({
|
|
163
|
+
channelPrefix: config.channelPrefix,
|
|
164
|
+
serviceName: config.serviceName,
|
|
165
|
+
host: config.host,
|
|
166
|
+
port: config.port,
|
|
167
|
+
password: config.password,
|
|
168
|
+
db: config.db,
|
|
169
|
+
url: config.url,
|
|
170
|
+
});
|
|
171
|
+
case "memory":
|
|
172
|
+
return new MemoryPubSubProvider({
|
|
173
|
+
channelPrefix: config.channelPrefix,
|
|
174
|
+
serviceName: config.serviceName,
|
|
175
|
+
});
|
|
176
|
+
default:
|
|
177
|
+
// Exhaustive check — provides a clear runtime error for invalid types
|
|
178
|
+
const unknownType = config.type;
|
|
179
|
+
throw new Error(`Unknown pub/sub type: "${unknownType}". Supported types: "redis", "memory".`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=pubsub-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pubsub-plugin.js","sourceRoot":"","sources":["../src/pubsub-plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis-backed cache provider using ioredis.
|
|
3
|
+
*
|
|
4
|
+
* Production-grade implementation with:
|
|
5
|
+
* - Native TTL support via Redis EXPIRE/EX
|
|
6
|
+
* - SCAN-based pattern deletion (safe for production, never uses KEYS)
|
|
7
|
+
* - Automatic JSON serialization/deserialization
|
|
8
|
+
* - Connection health monitoring via PING
|
|
9
|
+
* - Graceful shutdown via quit()
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { Redis } from "ioredis";
|
|
14
|
+
import { CacheProvider } from "./abstract-cache-provider.js";
|
|
15
|
+
import type { RedisCacheConfig } from "./types.js";
|
|
16
|
+
/**
|
|
17
|
+
* Redis-backed cache provider using ioredis.
|
|
18
|
+
*
|
|
19
|
+
* Connects to a Redis instance via URL or host/port configuration.
|
|
20
|
+
* All cache operations map directly to Redis commands for optimal performance.
|
|
21
|
+
* Pattern-based operations use SCAN (not KEYS) to avoid blocking the server.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const cache = new RedisCacheProvider({
|
|
26
|
+
* rootKey: 'MyApp',
|
|
27
|
+
* host: 'localhost',
|
|
28
|
+
* port: 6379,
|
|
29
|
+
* defaultTTL: 300,
|
|
30
|
+
* });
|
|
31
|
+
*
|
|
32
|
+
* await cache.set('user:123', { name: 'Alice' }, 600);
|
|
33
|
+
* const user = await cache.get<User>('user:123');
|
|
34
|
+
* await cache.shutdown();
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class RedisCacheProvider extends CacheProvider {
|
|
38
|
+
/** The ioredis client instance */
|
|
39
|
+
protected client: Redis;
|
|
40
|
+
/**
|
|
41
|
+
* Create a new Redis cache provider.
|
|
42
|
+
*
|
|
43
|
+
* If `url` is provided in config, it takes precedence over individual
|
|
44
|
+
* host/port/password/db settings. The ioredis client is created immediately
|
|
45
|
+
* and begins connecting in the background.
|
|
46
|
+
*
|
|
47
|
+
* @param config - Redis cache configuration with connection details
|
|
48
|
+
*/
|
|
49
|
+
constructor(config: RedisCacheConfig);
|
|
50
|
+
/** @inheritDoc */
|
|
51
|
+
set<T>(key: string, value: T, ttlSeconds?: number): Promise<void>;
|
|
52
|
+
/** @inheritDoc */
|
|
53
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
54
|
+
/** @inheritDoc */
|
|
55
|
+
delete(key: string): Promise<boolean>;
|
|
56
|
+
/** @inheritDoc */
|
|
57
|
+
exists(key: string): Promise<boolean>;
|
|
58
|
+
/** @inheritDoc */
|
|
59
|
+
expire(key: string, ttlSeconds: number): Promise<boolean>;
|
|
60
|
+
/** @inheritDoc */
|
|
61
|
+
ttl(key: string): Promise<number>;
|
|
62
|
+
/** @inheritDoc */
|
|
63
|
+
deletePattern(pattern: string): Promise<number>;
|
|
64
|
+
/** @inheritDoc */
|
|
65
|
+
clear(): Promise<void>;
|
|
66
|
+
/** @inheritDoc */
|
|
67
|
+
health(): Promise<boolean>;
|
|
68
|
+
/** @inheritDoc */
|
|
69
|
+
shutdown(): Promise<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Use SCAN to find keys matching a pattern and delete them in batches.
|
|
72
|
+
*
|
|
73
|
+
* SCAN is non-blocking and safe for production (unlike KEYS which blocks
|
|
74
|
+
* the entire Redis server). Keys are deleted in batches as they are found.
|
|
75
|
+
*
|
|
76
|
+
* @param pattern - The full pattern to match (already includes rootKey prefix)
|
|
77
|
+
* @returns Number of keys deleted
|
|
78
|
+
*/
|
|
79
|
+
protected scanAndDelete(pattern: string): Promise<number>;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=redis-cache-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-cache-provider.d.ts","sourceRoot":"","sources":["../src/redis-cache-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AA4BnD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,kBAAmB,SAAQ,aAAa;IACjD,kCAAkC;IAClC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;IAExB;;;;;;;;OAQG;gBACS,MAAM,EAAE,gBAAgB;IA0BpC,kBAAkB;IACZ,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE,kBAAkB;IACZ,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAiBjD,kBAAkB;IACZ,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,kBAAkB;IACZ,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO3C,kBAAkB;IACZ,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO/D,kBAAkB;IACZ,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUvC,kBAAkB;IACZ,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMrD,kBAAkB;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,kBAAkB;IACZ,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAUhC,kBAAkB;IACZ,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAS/B;;;;;;;;OAQG;cACa,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAwBlE"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis-backed cache provider using ioredis.
|
|
3
|
+
*
|
|
4
|
+
* Production-grade implementation with:
|
|
5
|
+
* - Native TTL support via Redis EXPIRE/EX
|
|
6
|
+
* - SCAN-based pattern deletion (safe for production, never uses KEYS)
|
|
7
|
+
* - Automatic JSON serialization/deserialization
|
|
8
|
+
* - Connection health monitoring via PING
|
|
9
|
+
* - Graceful shutdown via quit()
|
|
10
|
+
*
|
|
11
|
+
* @packageDocumentation
|
|
12
|
+
*/
|
|
13
|
+
import { Redis } from "ioredis";
|
|
14
|
+
import { CacheProvider } from "./abstract-cache-provider.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Default Constants
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
/** Default connection timeout in milliseconds */
|
|
19
|
+
const DEFAULT_CONNECT_TIMEOUT = 5000;
|
|
20
|
+
/** Default max retries per request */
|
|
21
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
22
|
+
/** Default Redis host */
|
|
23
|
+
const DEFAULT_HOST = "localhost";
|
|
24
|
+
/** Default Redis port */
|
|
25
|
+
const DEFAULT_PORT = 6379;
|
|
26
|
+
/** Default Redis database index */
|
|
27
|
+
const DEFAULT_DB = 0;
|
|
28
|
+
/** Batch size for SCAN operations — how many keys to fetch per SCAN iteration */
|
|
29
|
+
const SCAN_BATCH_SIZE = 100;
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// RedisCacheProvider
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
/**
|
|
34
|
+
* Redis-backed cache provider using ioredis.
|
|
35
|
+
*
|
|
36
|
+
* Connects to a Redis instance via URL or host/port configuration.
|
|
37
|
+
* All cache operations map directly to Redis commands for optimal performance.
|
|
38
|
+
* Pattern-based operations use SCAN (not KEYS) to avoid blocking the server.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* const cache = new RedisCacheProvider({
|
|
43
|
+
* rootKey: 'MyApp',
|
|
44
|
+
* host: 'localhost',
|
|
45
|
+
* port: 6379,
|
|
46
|
+
* defaultTTL: 300,
|
|
47
|
+
* });
|
|
48
|
+
*
|
|
49
|
+
* await cache.set('user:123', { name: 'Alice' }, 600);
|
|
50
|
+
* const user = await cache.get<User>('user:123');
|
|
51
|
+
* await cache.shutdown();
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export class RedisCacheProvider extends CacheProvider {
|
|
55
|
+
/** The ioredis client instance */
|
|
56
|
+
client;
|
|
57
|
+
/**
|
|
58
|
+
* Create a new Redis cache provider.
|
|
59
|
+
*
|
|
60
|
+
* If `url` is provided in config, it takes precedence over individual
|
|
61
|
+
* host/port/password/db settings. The ioredis client is created immediately
|
|
62
|
+
* and begins connecting in the background.
|
|
63
|
+
*
|
|
64
|
+
* @param config - Redis cache configuration with connection details
|
|
65
|
+
*/
|
|
66
|
+
constructor(config) {
|
|
67
|
+
super(config);
|
|
68
|
+
// Initialize ioredis client — URL takes precedence over individual options
|
|
69
|
+
if (config.url) {
|
|
70
|
+
this.client = new Redis(config.url, {
|
|
71
|
+
db: config.db,
|
|
72
|
+
connectTimeout: config.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT,
|
|
73
|
+
maxRetriesPerRequest: config.maxRetriesPerRequest ?? DEFAULT_MAX_RETRIES,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.client = new Redis({
|
|
78
|
+
host: config.host ?? DEFAULT_HOST,
|
|
79
|
+
port: config.port ?? DEFAULT_PORT,
|
|
80
|
+
password: config.password,
|
|
81
|
+
db: config.db ?? DEFAULT_DB,
|
|
82
|
+
connectTimeout: config.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT,
|
|
83
|
+
maxRetriesPerRequest: config.maxRetriesPerRequest ?? DEFAULT_MAX_RETRIES,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// -----------------------------------------------------------------------
|
|
88
|
+
// Core Operations
|
|
89
|
+
// -----------------------------------------------------------------------
|
|
90
|
+
/** @inheritDoc */
|
|
91
|
+
async set(key, value, ttlSeconds) {
|
|
92
|
+
const fullKey = this.buildKey(key);
|
|
93
|
+
const serialized = JSON.stringify(value);
|
|
94
|
+
const effectiveTTL = this.resolveTTL(ttlSeconds);
|
|
95
|
+
if (effectiveTTL !== undefined) {
|
|
96
|
+
// SET with EX flag for TTL in seconds
|
|
97
|
+
await this.client.set(fullKey, serialized, "EX", effectiveTTL);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
// SET without expiry
|
|
101
|
+
await this.client.set(fullKey, serialized);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/** @inheritDoc */
|
|
105
|
+
async get(key) {
|
|
106
|
+
const fullKey = this.buildKey(key);
|
|
107
|
+
const result = await this.client.get(fullKey);
|
|
108
|
+
// Redis returns null for missing keys
|
|
109
|
+
if (result === null) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
// Deserialize — treat JSON parse failures as cache miss
|
|
113
|
+
try {
|
|
114
|
+
return JSON.parse(result);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/** @inheritDoc */
|
|
121
|
+
async delete(key) {
|
|
122
|
+
const fullKey = this.buildKey(key);
|
|
123
|
+
const result = await this.client.del(fullKey);
|
|
124
|
+
// DEL returns the number of keys removed (0 or 1 for a single key)
|
|
125
|
+
return result === 1;
|
|
126
|
+
}
|
|
127
|
+
/** @inheritDoc */
|
|
128
|
+
async exists(key) {
|
|
129
|
+
const fullKey = this.buildKey(key);
|
|
130
|
+
const result = await this.client.exists(fullKey);
|
|
131
|
+
// EXISTS returns 1 if the key exists, 0 if it doesn't
|
|
132
|
+
return result === 1;
|
|
133
|
+
}
|
|
134
|
+
/** @inheritDoc */
|
|
135
|
+
async expire(key, ttlSeconds) {
|
|
136
|
+
const fullKey = this.buildKey(key);
|
|
137
|
+
const result = await this.client.expire(fullKey, ttlSeconds);
|
|
138
|
+
// EXPIRE returns 1 if TTL was set, 0 if key doesn't exist
|
|
139
|
+
return result === 1;
|
|
140
|
+
}
|
|
141
|
+
/** @inheritDoc */
|
|
142
|
+
async ttl(key) {
|
|
143
|
+
const fullKey = this.buildKey(key);
|
|
144
|
+
// TTL returns: positive = remaining seconds, -1 = no expiry, -2 = key missing
|
|
145
|
+
return await this.client.ttl(fullKey);
|
|
146
|
+
}
|
|
147
|
+
// -----------------------------------------------------------------------
|
|
148
|
+
// Pattern Operations
|
|
149
|
+
// -----------------------------------------------------------------------
|
|
150
|
+
/** @inheritDoc */
|
|
151
|
+
async deletePattern(pattern) {
|
|
152
|
+
// Use SCAN to find matching keys (safe for production, non-blocking)
|
|
153
|
+
const fullPattern = this.buildPattern(pattern);
|
|
154
|
+
return await this.scanAndDelete(fullPattern);
|
|
155
|
+
}
|
|
156
|
+
/** @inheritDoc */
|
|
157
|
+
async clear() {
|
|
158
|
+
// Delete all keys under this rootKey namespace using SCAN + DEL
|
|
159
|
+
const fullPattern = this.buildPattern("*");
|
|
160
|
+
await this.scanAndDelete(fullPattern);
|
|
161
|
+
}
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
// Lifecycle
|
|
164
|
+
// -----------------------------------------------------------------------
|
|
165
|
+
/** @inheritDoc */
|
|
166
|
+
async health() {
|
|
167
|
+
try {
|
|
168
|
+
const result = await this.client.ping();
|
|
169
|
+
return result === "PONG";
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Connection failure, timeout, etc.
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** @inheritDoc */
|
|
177
|
+
async shutdown() {
|
|
178
|
+
// Graceful disconnect — waits for pending commands to complete
|
|
179
|
+
await this.client.quit();
|
|
180
|
+
}
|
|
181
|
+
// -----------------------------------------------------------------------
|
|
182
|
+
// Internal Helpers
|
|
183
|
+
// -----------------------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* Use SCAN to find keys matching a pattern and delete them in batches.
|
|
186
|
+
*
|
|
187
|
+
* SCAN is non-blocking and safe for production (unlike KEYS which blocks
|
|
188
|
+
* the entire Redis server). Keys are deleted in batches as they are found.
|
|
189
|
+
*
|
|
190
|
+
* @param pattern - The full pattern to match (already includes rootKey prefix)
|
|
191
|
+
* @returns Number of keys deleted
|
|
192
|
+
*/
|
|
193
|
+
async scanAndDelete(pattern) {
|
|
194
|
+
let cursor = "0";
|
|
195
|
+
let totalDeleted = 0;
|
|
196
|
+
do {
|
|
197
|
+
// SCAN returns [nextCursor, matchingKeys]
|
|
198
|
+
const [nextCursor, keys] = await this.client.scan(cursor, "MATCH", pattern, "COUNT", SCAN_BATCH_SIZE);
|
|
199
|
+
cursor = nextCursor;
|
|
200
|
+
// Delete found keys in one DEL command (batch delete)
|
|
201
|
+
if (keys.length > 0) {
|
|
202
|
+
const deleted = await this.client.del(...keys);
|
|
203
|
+
totalDeleted += deleted;
|
|
204
|
+
}
|
|
205
|
+
} while (cursor !== "0");
|
|
206
|
+
return totalDeleted;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=redis-cache-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-cache-provider.js","sourceRoot":"","sources":["../src/redis-cache-provider.ts"],"names":[],"mappings":"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"}
|