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,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis-backed pub/sub provider using ioredis.
|
|
3
|
+
*
|
|
4
|
+
* Production-grade implementation with:
|
|
5
|
+
* - Two dedicated ioredis connections (publisher + subscriber)
|
|
6
|
+
* - Automatic JSON serialization/deserialization
|
|
7
|
+
* - Channel prefix support for namespace isolation
|
|
8
|
+
* - Multiple handlers per channel (fan-out)
|
|
9
|
+
* - Handler error isolation via safeInvoke
|
|
10
|
+
* - Connection health monitoring via PING on both connections
|
|
11
|
+
* - Graceful shutdown: unsubscribe all, then close both connections
|
|
12
|
+
*
|
|
13
|
+
* Redis pub/sub requires a dedicated connection for subscribing — once a
|
|
14
|
+
* client enters subscriber mode (SUBSCRIBE/PSUBSCRIBE), it can only execute
|
|
15
|
+
* subscriber commands. Regular commands like PUBLISH must use a separate connection.
|
|
16
|
+
*
|
|
17
|
+
* @packageDocumentation
|
|
18
|
+
*/
|
|
19
|
+
import { Redis } from "ioredis";
|
|
20
|
+
import { PubSubProvider } from "./abstract-pubsub-provider.js";
|
|
21
|
+
import type { RedisPubSubConfig, MessageHandler } from "./types.js";
|
|
22
|
+
/**
|
|
23
|
+
* Redis-backed pub/sub provider using ioredis.
|
|
24
|
+
*
|
|
25
|
+
* Creates two ioredis connections:
|
|
26
|
+
* - `publisher` for PUBLISH commands
|
|
27
|
+
* - `subscriber` for SUBSCRIBE/PSUBSCRIBE (enters subscriber mode)
|
|
28
|
+
*
|
|
29
|
+
* Handler maps use user-facing channel names (without prefix) so that
|
|
30
|
+
* `activeSubscriptions()` returns clean names and handler lookup is simple.
|
|
31
|
+
* Redis subscribe/unsubscribe is only called on the first/last handler for
|
|
32
|
+
* a given channel — multiple in-process handlers share a single Redis subscription.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const pubsub = new RedisPubSubProvider({
|
|
37
|
+
* channelPrefix: 'MyApp',
|
|
38
|
+
* host: 'localhost',
|
|
39
|
+
* port: 6379,
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* await pubsub.subscribe<OrderEvent>('order:new', (msg) => {
|
|
43
|
+
* console.log('New order:', msg.data);
|
|
44
|
+
* });
|
|
45
|
+
*
|
|
46
|
+
* await pubsub.publish('order:new', { orderId: 123, total: 49.99 });
|
|
47
|
+
* await pubsub.shutdown();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class RedisPubSubProvider extends PubSubProvider {
|
|
51
|
+
/** Dedicated connection for PUBLISH commands */
|
|
52
|
+
protected publisher: Redis;
|
|
53
|
+
/** Dedicated connection for SUBSCRIBE/PSUBSCRIBE (enters subscriber mode) */
|
|
54
|
+
protected subscriber: Redis;
|
|
55
|
+
/** Exact channel handlers: Map<userChannel, Set<MessageHandler>> */
|
|
56
|
+
protected handlers: Map<string, Set<MessageHandler>>;
|
|
57
|
+
/** Pattern handlers: Map<userPattern, Set<MessageHandler>> */
|
|
58
|
+
protected patternHandlers: Map<string, Set<MessageHandler>>;
|
|
59
|
+
/**
|
|
60
|
+
* Create a new Redis pub/sub provider.
|
|
61
|
+
*
|
|
62
|
+
* Two ioredis connections are created immediately and begin connecting
|
|
63
|
+
* in the background. The subscriber connection has ioredis message
|
|
64
|
+
* event listeners wired up for routing incoming messages to handlers.
|
|
65
|
+
*
|
|
66
|
+
* @param config - Redis pub/sub configuration with connection details
|
|
67
|
+
*/
|
|
68
|
+
constructor(config: RedisPubSubConfig);
|
|
69
|
+
/**
|
|
70
|
+
* Publish a message to a channel.
|
|
71
|
+
*
|
|
72
|
+
* The data is JSON-serialized and sent via the publisher connection.
|
|
73
|
+
* The channel prefix is applied automatically.
|
|
74
|
+
*
|
|
75
|
+
* @param channel - Channel name (prefix applied automatically)
|
|
76
|
+
* @param data - Message payload (will be JSON-serialized)
|
|
77
|
+
* @returns Number of Redis subscribers that received the message
|
|
78
|
+
*/
|
|
79
|
+
publish<T>(channel: string, data: T): Promise<number>;
|
|
80
|
+
/**
|
|
81
|
+
* Subscribe to an exact channel with a typed handler.
|
|
82
|
+
*
|
|
83
|
+
* Multiple handlers can be registered for the same channel.
|
|
84
|
+
* The Redis SUBSCRIBE command is only sent on the first handler
|
|
85
|
+
* registration for a channel — subsequent handlers share the
|
|
86
|
+
* same Redis subscription.
|
|
87
|
+
*
|
|
88
|
+
* @param channel - Exact channel name (prefix applied automatically)
|
|
89
|
+
* @param handler - Function called when a message is received
|
|
90
|
+
*/
|
|
91
|
+
subscribe<T = unknown>(channel: string, handler: MessageHandler<T>): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Unsubscribe from an exact channel.
|
|
94
|
+
* Removes all handlers and unsubscribes from Redis.
|
|
95
|
+
*
|
|
96
|
+
* @param channel - Channel name to unsubscribe from
|
|
97
|
+
*/
|
|
98
|
+
unsubscribe(channel: string): Promise<void>;
|
|
99
|
+
/**
|
|
100
|
+
* Subscribe to a channel pattern with a typed handler.
|
|
101
|
+
*
|
|
102
|
+
* Multiple handlers can be registered for the same pattern.
|
|
103
|
+
* The Redis PSUBSCRIBE command is only sent on the first handler
|
|
104
|
+
* registration for a pattern.
|
|
105
|
+
*
|
|
106
|
+
* @param pattern - Glob pattern (e.g., 'order:*')
|
|
107
|
+
* @param handler - Function called when a matching message is received
|
|
108
|
+
*/
|
|
109
|
+
psubscribe<T = unknown>(pattern: string, handler: MessageHandler<T>): Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Unsubscribe from a channel pattern.
|
|
112
|
+
* Removes all handlers and unsubscribes from Redis.
|
|
113
|
+
*
|
|
114
|
+
* @param pattern - Pattern to unsubscribe from
|
|
115
|
+
*/
|
|
116
|
+
punsubscribe(pattern: string): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Get currently active subscriptions.
|
|
119
|
+
* Returns user-facing channel/pattern names (without prefix).
|
|
120
|
+
*
|
|
121
|
+
* @returns Object with exact `channels` and glob `patterns` arrays
|
|
122
|
+
*/
|
|
123
|
+
activeSubscriptions(): {
|
|
124
|
+
channels: string[];
|
|
125
|
+
patterns: string[];
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Health check — pings both publisher and subscriber connections.
|
|
129
|
+
* Returns true only if both connections respond with PONG.
|
|
130
|
+
*/
|
|
131
|
+
health(): Promise<boolean>;
|
|
132
|
+
/**
|
|
133
|
+
* Graceful shutdown — unsubscribe all, clear handlers, close both connections.
|
|
134
|
+
*
|
|
135
|
+
* Unsubscribes from all channels and patterns before closing to ensure
|
|
136
|
+
* clean disconnection. Both connections are closed via quit() which
|
|
137
|
+
* waits for pending commands to complete.
|
|
138
|
+
*/
|
|
139
|
+
shutdown(): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Create an ioredis client from config.
|
|
142
|
+
*
|
|
143
|
+
* URL takes precedence over individual host/port/password/db settings.
|
|
144
|
+
* This is the same pattern used by RedisCacheProvider.
|
|
145
|
+
*
|
|
146
|
+
* @param config - Redis connection configuration
|
|
147
|
+
* @returns A new ioredis Redis client
|
|
148
|
+
*/
|
|
149
|
+
protected createRedisClient(config: RedisPubSubConfig): Redis;
|
|
150
|
+
/**
|
|
151
|
+
* Wire up ioredis event listeners on the subscriber connection.
|
|
152
|
+
*
|
|
153
|
+
* ioredis emits two events for pub/sub messages:
|
|
154
|
+
* - `message(channel, message)` for exact channel subscriptions
|
|
155
|
+
* - `pmessage(pattern, channel, message)` for pattern subscriptions
|
|
156
|
+
*
|
|
157
|
+
* This method sets up listeners that:
|
|
158
|
+
* 1. Strip the channel prefix from the full Redis channel name
|
|
159
|
+
* 2. JSON-deserialize the message payload
|
|
160
|
+
* 3. Fan out to all registered handlers via safeInvoke
|
|
161
|
+
*/
|
|
162
|
+
protected setupMessageHandlers(): void;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=redis-pubsub-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-pubsub-provider.d.ts","sourceRoot":"","sources":["../src/redis-pubsub-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAC;AAyBnF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,mBAAoB,SAAQ,cAAc;IACnD,gDAAgD;IAChD,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC;IAE3B,6EAA6E;IAC7E,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC;IAE5B,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;;;;;;;;OAQG;gBACS,MAAM,EAAE,iBAAiB;IAkBrC;;;;;;;;;OASG;IACG,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAO3D;;;;;;;;;;OAUG;IACG,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxF;;;;;OAKG;IACG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD;;;;;;;;;OASG;IACG,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAazF;;;;;OAKG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD;;;;;OAKG;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;IAYhC;;;;;;OAMG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB/B;;;;;;;;OAQG;IACH,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,KAAK;IAyB7D;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,oBAAoB,IAAI,IAAI;CAsDzC"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis-backed pub/sub provider using ioredis.
|
|
3
|
+
*
|
|
4
|
+
* Production-grade implementation with:
|
|
5
|
+
* - Two dedicated ioredis connections (publisher + subscriber)
|
|
6
|
+
* - Automatic JSON serialization/deserialization
|
|
7
|
+
* - Channel prefix support for namespace isolation
|
|
8
|
+
* - Multiple handlers per channel (fan-out)
|
|
9
|
+
* - Handler error isolation via safeInvoke
|
|
10
|
+
* - Connection health monitoring via PING on both connections
|
|
11
|
+
* - Graceful shutdown: unsubscribe all, then close both connections
|
|
12
|
+
*
|
|
13
|
+
* Redis pub/sub requires a dedicated connection for subscribing — once a
|
|
14
|
+
* client enters subscriber mode (SUBSCRIBE/PSUBSCRIBE), it can only execute
|
|
15
|
+
* subscriber commands. Regular commands like PUBLISH must use a separate connection.
|
|
16
|
+
*
|
|
17
|
+
* @packageDocumentation
|
|
18
|
+
*/
|
|
19
|
+
import { Redis } from "ioredis";
|
|
20
|
+
import { PubSubProvider } from "./abstract-pubsub-provider.js";
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Default Constants
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/** Default connection timeout in milliseconds */
|
|
25
|
+
const DEFAULT_CONNECT_TIMEOUT = 5000;
|
|
26
|
+
/** Default max retries per request */
|
|
27
|
+
const DEFAULT_MAX_RETRIES = 3;
|
|
28
|
+
/** Default Redis host */
|
|
29
|
+
const DEFAULT_HOST = "localhost";
|
|
30
|
+
/** Default Redis port */
|
|
31
|
+
const DEFAULT_PORT = 6379;
|
|
32
|
+
/** Default Redis database index */
|
|
33
|
+
const DEFAULT_DB = 0;
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// RedisPubSubProvider
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
/**
|
|
38
|
+
* Redis-backed pub/sub provider using ioredis.
|
|
39
|
+
*
|
|
40
|
+
* Creates two ioredis connections:
|
|
41
|
+
* - `publisher` for PUBLISH commands
|
|
42
|
+
* - `subscriber` for SUBSCRIBE/PSUBSCRIBE (enters subscriber mode)
|
|
43
|
+
*
|
|
44
|
+
* Handler maps use user-facing channel names (without prefix) so that
|
|
45
|
+
* `activeSubscriptions()` returns clean names and handler lookup is simple.
|
|
46
|
+
* Redis subscribe/unsubscribe is only called on the first/last handler for
|
|
47
|
+
* a given channel — multiple in-process handlers share a single Redis subscription.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const pubsub = new RedisPubSubProvider({
|
|
52
|
+
* channelPrefix: 'MyApp',
|
|
53
|
+
* host: 'localhost',
|
|
54
|
+
* port: 6379,
|
|
55
|
+
* });
|
|
56
|
+
*
|
|
57
|
+
* await pubsub.subscribe<OrderEvent>('order:new', (msg) => {
|
|
58
|
+
* console.log('New order:', msg.data);
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* await pubsub.publish('order:new', { orderId: 123, total: 49.99 });
|
|
62
|
+
* await pubsub.shutdown();
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export class RedisPubSubProvider extends PubSubProvider {
|
|
66
|
+
/** Dedicated connection for PUBLISH commands */
|
|
67
|
+
publisher;
|
|
68
|
+
/** Dedicated connection for SUBSCRIBE/PSUBSCRIBE (enters subscriber mode) */
|
|
69
|
+
subscriber;
|
|
70
|
+
/** Exact channel handlers: Map<userChannel, Set<MessageHandler>> */
|
|
71
|
+
handlers;
|
|
72
|
+
/** Pattern handlers: Map<userPattern, Set<MessageHandler>> */
|
|
73
|
+
patternHandlers;
|
|
74
|
+
/**
|
|
75
|
+
* Create a new Redis pub/sub provider.
|
|
76
|
+
*
|
|
77
|
+
* Two ioredis connections are created immediately and begin connecting
|
|
78
|
+
* in the background. The subscriber connection has ioredis message
|
|
79
|
+
* event listeners wired up for routing incoming messages to handlers.
|
|
80
|
+
*
|
|
81
|
+
* @param config - Redis pub/sub configuration with connection details
|
|
82
|
+
*/
|
|
83
|
+
constructor(config) {
|
|
84
|
+
super(config);
|
|
85
|
+
// Create TWO connections with the same Redis config
|
|
86
|
+
this.publisher = this.createRedisClient(config);
|
|
87
|
+
this.subscriber = this.createRedisClient(config);
|
|
88
|
+
this.handlers = new Map();
|
|
89
|
+
this.patternHandlers = new Map();
|
|
90
|
+
// Wire up ioredis message events for routing to handlers
|
|
91
|
+
this.setupMessageHandlers();
|
|
92
|
+
}
|
|
93
|
+
// -------------------------------------------------------------------
|
|
94
|
+
// Core Operations
|
|
95
|
+
// -------------------------------------------------------------------
|
|
96
|
+
/**
|
|
97
|
+
* Publish a message to a channel.
|
|
98
|
+
*
|
|
99
|
+
* The data is JSON-serialized and sent via the publisher connection.
|
|
100
|
+
* The channel prefix is applied automatically.
|
|
101
|
+
*
|
|
102
|
+
* @param channel - Channel name (prefix applied automatically)
|
|
103
|
+
* @param data - Message payload (will be JSON-serialized)
|
|
104
|
+
* @returns Number of Redis subscribers that received the message
|
|
105
|
+
*/
|
|
106
|
+
async publish(channel, data) {
|
|
107
|
+
const fullChannel = this.buildChannel(channel);
|
|
108
|
+
const serialized = JSON.stringify(data);
|
|
109
|
+
// PUBLISH returns the number of clients that received the message
|
|
110
|
+
return await this.publisher.publish(fullChannel, serialized);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Subscribe to an exact channel with a typed handler.
|
|
114
|
+
*
|
|
115
|
+
* Multiple handlers can be registered for the same channel.
|
|
116
|
+
* The Redis SUBSCRIBE command is only sent on the first handler
|
|
117
|
+
* registration for a channel — subsequent handlers share the
|
|
118
|
+
* same Redis subscription.
|
|
119
|
+
*
|
|
120
|
+
* @param channel - Exact channel name (prefix applied automatically)
|
|
121
|
+
* @param handler - Function called when a message is received
|
|
122
|
+
*/
|
|
123
|
+
async subscribe(channel, handler) {
|
|
124
|
+
// Add handler to local map
|
|
125
|
+
if (!this.handlers.has(channel)) {
|
|
126
|
+
this.handlers.set(channel, new Set());
|
|
127
|
+
}
|
|
128
|
+
this.handlers.get(channel).add(handler);
|
|
129
|
+
// Only subscribe to Redis on the first handler for this channel
|
|
130
|
+
if (this.handlers.get(channel).size === 1) {
|
|
131
|
+
const fullChannel = this.buildChannel(channel);
|
|
132
|
+
await this.subscriber.subscribe(fullChannel);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Unsubscribe from an exact channel.
|
|
137
|
+
* Removes all handlers and unsubscribes from Redis.
|
|
138
|
+
*
|
|
139
|
+
* @param channel - Channel name to unsubscribe from
|
|
140
|
+
*/
|
|
141
|
+
async unsubscribe(channel) {
|
|
142
|
+
const fullChannel = this.buildChannel(channel);
|
|
143
|
+
await this.subscriber.unsubscribe(fullChannel);
|
|
144
|
+
this.handlers.delete(channel);
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Subscribe to a channel pattern with a typed handler.
|
|
148
|
+
*
|
|
149
|
+
* Multiple handlers can be registered for the same pattern.
|
|
150
|
+
* The Redis PSUBSCRIBE command is only sent on the first handler
|
|
151
|
+
* registration for a pattern.
|
|
152
|
+
*
|
|
153
|
+
* @param pattern - Glob pattern (e.g., 'order:*')
|
|
154
|
+
* @param handler - Function called when a matching message is received
|
|
155
|
+
*/
|
|
156
|
+
async psubscribe(pattern, handler) {
|
|
157
|
+
if (!this.patternHandlers.has(pattern)) {
|
|
158
|
+
this.patternHandlers.set(pattern, new Set());
|
|
159
|
+
}
|
|
160
|
+
this.patternHandlers.get(pattern).add(handler);
|
|
161
|
+
// Only psubscribe to Redis on the first handler for this pattern
|
|
162
|
+
if (this.patternHandlers.get(pattern).size === 1) {
|
|
163
|
+
const fullPattern = this.buildChannelPattern(pattern);
|
|
164
|
+
await this.subscriber.psubscribe(fullPattern);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Unsubscribe from a channel pattern.
|
|
169
|
+
* Removes all handlers and unsubscribes from Redis.
|
|
170
|
+
*
|
|
171
|
+
* @param pattern - Pattern to unsubscribe from
|
|
172
|
+
*/
|
|
173
|
+
async punsubscribe(pattern) {
|
|
174
|
+
const fullPattern = this.buildChannelPattern(pattern);
|
|
175
|
+
await this.subscriber.punsubscribe(fullPattern);
|
|
176
|
+
this.patternHandlers.delete(pattern);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get currently active subscriptions.
|
|
180
|
+
* Returns user-facing channel/pattern names (without prefix).
|
|
181
|
+
*
|
|
182
|
+
* @returns Object with exact `channels` and glob `patterns` arrays
|
|
183
|
+
*/
|
|
184
|
+
activeSubscriptions() {
|
|
185
|
+
return {
|
|
186
|
+
channels: Array.from(this.handlers.keys()),
|
|
187
|
+
patterns: Array.from(this.patternHandlers.keys()),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// -------------------------------------------------------------------
|
|
191
|
+
// Lifecycle
|
|
192
|
+
// -------------------------------------------------------------------
|
|
193
|
+
/**
|
|
194
|
+
* Health check — pings both publisher and subscriber connections.
|
|
195
|
+
* Returns true only if both connections respond with PONG.
|
|
196
|
+
*/
|
|
197
|
+
async health() {
|
|
198
|
+
try {
|
|
199
|
+
const [pubResult, subResult] = await Promise.all([
|
|
200
|
+
this.publisher.ping(),
|
|
201
|
+
this.subscriber.ping(),
|
|
202
|
+
]);
|
|
203
|
+
return pubResult === "PONG" && subResult === "PONG";
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Graceful shutdown — unsubscribe all, clear handlers, close both connections.
|
|
211
|
+
*
|
|
212
|
+
* Unsubscribes from all channels and patterns before closing to ensure
|
|
213
|
+
* clean disconnection. Both connections are closed via quit() which
|
|
214
|
+
* waits for pending commands to complete.
|
|
215
|
+
*/
|
|
216
|
+
async shutdown() {
|
|
217
|
+
// Unsubscribe all exact channels
|
|
218
|
+
for (const channel of this.handlers.keys()) {
|
|
219
|
+
const fullChannel = this.buildChannel(channel);
|
|
220
|
+
await this.subscriber.unsubscribe(fullChannel);
|
|
221
|
+
}
|
|
222
|
+
// Unsubscribe all patterns
|
|
223
|
+
for (const pattern of this.patternHandlers.keys()) {
|
|
224
|
+
const fullPattern = this.buildChannelPattern(pattern);
|
|
225
|
+
await this.subscriber.punsubscribe(fullPattern);
|
|
226
|
+
}
|
|
227
|
+
// Clear all handler maps
|
|
228
|
+
this.handlers.clear();
|
|
229
|
+
this.patternHandlers.clear();
|
|
230
|
+
// Close both connections gracefully — waits for pending commands
|
|
231
|
+
await Promise.all([this.publisher.quit(), this.subscriber.quit()]);
|
|
232
|
+
}
|
|
233
|
+
// -------------------------------------------------------------------
|
|
234
|
+
// Internal: Redis Client Factory
|
|
235
|
+
// -------------------------------------------------------------------
|
|
236
|
+
/**
|
|
237
|
+
* Create an ioredis client from config.
|
|
238
|
+
*
|
|
239
|
+
* URL takes precedence over individual host/port/password/db settings.
|
|
240
|
+
* This is the same pattern used by RedisCacheProvider.
|
|
241
|
+
*
|
|
242
|
+
* @param config - Redis connection configuration
|
|
243
|
+
* @returns A new ioredis Redis client
|
|
244
|
+
*/
|
|
245
|
+
createRedisClient(config) {
|
|
246
|
+
if (config.url) {
|
|
247
|
+
// URL-based connection — pass additional options alongside
|
|
248
|
+
return new Redis(config.url, {
|
|
249
|
+
db: config.db,
|
|
250
|
+
connectTimeout: config.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT,
|
|
251
|
+
maxRetriesPerRequest: config.maxRetriesPerRequest ?? DEFAULT_MAX_RETRIES,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
// Individual field connection
|
|
255
|
+
return new Redis({
|
|
256
|
+
host: config.host ?? DEFAULT_HOST,
|
|
257
|
+
port: config.port ?? DEFAULT_PORT,
|
|
258
|
+
password: config.password,
|
|
259
|
+
db: config.db ?? DEFAULT_DB,
|
|
260
|
+
connectTimeout: config.connectTimeout ?? DEFAULT_CONNECT_TIMEOUT,
|
|
261
|
+
maxRetriesPerRequest: config.maxRetriesPerRequest ?? DEFAULT_MAX_RETRIES,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// -------------------------------------------------------------------
|
|
265
|
+
// Internal: Message Routing
|
|
266
|
+
// -------------------------------------------------------------------
|
|
267
|
+
/**
|
|
268
|
+
* Wire up ioredis event listeners on the subscriber connection.
|
|
269
|
+
*
|
|
270
|
+
* ioredis emits two events for pub/sub messages:
|
|
271
|
+
* - `message(channel, message)` for exact channel subscriptions
|
|
272
|
+
* - `pmessage(pattern, channel, message)` for pattern subscriptions
|
|
273
|
+
*
|
|
274
|
+
* This method sets up listeners that:
|
|
275
|
+
* 1. Strip the channel prefix from the full Redis channel name
|
|
276
|
+
* 2. JSON-deserialize the message payload
|
|
277
|
+
* 3. Fan out to all registered handlers via safeInvoke
|
|
278
|
+
*/
|
|
279
|
+
setupMessageHandlers() {
|
|
280
|
+
// Handle exact channel messages (from SUBSCRIBE)
|
|
281
|
+
this.subscriber.on("message", (fullChannel, message) => {
|
|
282
|
+
const userChannel = this.stripPrefix(fullChannel);
|
|
283
|
+
const handlers = this.handlers.get(userChannel);
|
|
284
|
+
if (!handlers || handlers.size === 0)
|
|
285
|
+
return;
|
|
286
|
+
// Deserialize the JSON payload
|
|
287
|
+
let data;
|
|
288
|
+
try {
|
|
289
|
+
data = JSON.parse(message);
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
console.error(`[PubSub] Failed to parse message on "${userChannel}"`);
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
const envelope = { channel: userChannel, data };
|
|
296
|
+
// Fan out to all handlers — errors isolated per handler
|
|
297
|
+
for (const handler of handlers) {
|
|
298
|
+
void this.safeInvoke(handler, envelope);
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
// Handle pattern messages (from PSUBSCRIBE)
|
|
302
|
+
this.subscriber.on("pmessage", (fullPattern, fullChannel, message) => {
|
|
303
|
+
const userChannel = this.stripPrefix(fullChannel);
|
|
304
|
+
const userPattern = this.stripPrefix(fullPattern);
|
|
305
|
+
const handlers = this.patternHandlers.get(userPattern);
|
|
306
|
+
if (!handlers || handlers.size === 0)
|
|
307
|
+
return;
|
|
308
|
+
// Deserialize the JSON payload
|
|
309
|
+
let data;
|
|
310
|
+
try {
|
|
311
|
+
data = JSON.parse(message);
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
console.error(`[PubSub] Failed to parse message on "${userChannel}" (pattern: "${userPattern}")`);
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
const envelope = {
|
|
318
|
+
channel: userChannel,
|
|
319
|
+
data,
|
|
320
|
+
pattern: userPattern,
|
|
321
|
+
};
|
|
322
|
+
// Fan out to all handlers — errors isolated per handler
|
|
323
|
+
for (const handler of handlers) {
|
|
324
|
+
void this.safeInvoke(handler, envelope);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=redis-pubsub-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-pubsub-provider.js","sourceRoot":"","sources":["../src/redis-pubsub-provider.ts"],"names":[],"mappings":"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"}
|