expressed-core 1.0.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-es.md +42 -0
- package/README-es.md.backup +44 -0
- package/README.md +41 -0
- package/README.md.backup +43 -0
- package/hooked/LICENSE +204 -0
- package/hooked/README.es.md +238 -0
- package/hooked/README.md +238 -0
- package/hooked/advanced-example.js +240 -0
- package/hooked/express-hooked.js +206 -0
- package/hooked/hooks.js +584 -0
- package/hooked/package.json +30 -0
- package/index.js +25 -0
- package/package.json +36 -0
- package/queued/LICENSE +201 -0
- package/queued/QueueSystem.js +451 -0
- package/queued/README.es.md +335 -0
- package/queued/README.md +335 -0
- package/queued/express-example.js +143 -0
- package/queued/express-integration.js +115 -0
- package/queued/package.json +33 -0
- package/router/ExpressRouter.js +247 -0
- package/router/ExpressRouterIntegration.js +129 -0
- package/router/LICENSE +201 -0
- package/router/README.es.md +142 -0
- package/router/README.md +142 -0
- package/router/RouteDirectoryLoader.js +299 -0
- package/router/RouteLoader.js +245 -0
- package/router/RouteMatcher.js +361 -0
- package/router/node_modules/.package-lock.json +876 -0
- package/router/node_modules/accepts/HISTORY.md +243 -0
- package/router/node_modules/accepts/LICENSE +23 -0
- package/router/node_modules/accepts/README.md +140 -0
- package/router/node_modules/accepts/index.js +238 -0
- package/router/node_modules/accepts/package.json +47 -0
- package/router/node_modules/array-flatten/LICENSE +21 -0
- package/router/node_modules/array-flatten/README.md +43 -0
- package/router/node_modules/array-flatten/array-flatten.js +64 -0
- package/router/node_modules/array-flatten/package.json +39 -0
- package/router/node_modules/body-parser/HISTORY.md +680 -0
- package/router/node_modules/body-parser/LICENSE +23 -0
- package/router/node_modules/body-parser/README.md +476 -0
- package/router/node_modules/body-parser/index.js +156 -0
- package/router/node_modules/body-parser/lib/read.js +205 -0
- package/router/node_modules/body-parser/lib/types/json.js +247 -0
- package/router/node_modules/body-parser/lib/types/raw.js +101 -0
- package/router/node_modules/body-parser/lib/types/text.js +121 -0
- package/router/node_modules/body-parser/lib/types/urlencoded.js +300 -0
- package/router/node_modules/body-parser/package.json +55 -0
- package/router/node_modules/bytes/History.md +97 -0
- package/router/node_modules/bytes/LICENSE +23 -0
- package/router/node_modules/bytes/Readme.md +152 -0
- package/router/node_modules/bytes/index.js +170 -0
- package/router/node_modules/bytes/package.json +42 -0
- package/router/node_modules/call-bind-apply-helpers/.github/FUNDING.yml +12 -0
- package/router/node_modules/call-bind-apply-helpers/CHANGELOG.md +30 -0
- package/router/node_modules/call-bind-apply-helpers/LICENSE +21 -0
- package/router/node_modules/call-bind-apply-helpers/README.md +62 -0
- package/router/node_modules/call-bind-apply-helpers/actualApply.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/actualApply.js +10 -0
- package/router/node_modules/call-bind-apply-helpers/applyBind.d.ts +19 -0
- package/router/node_modules/call-bind-apply-helpers/applyBind.js +10 -0
- package/router/node_modules/call-bind-apply-helpers/functionApply.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/functionApply.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/functionCall.d.ts +1 -0
- package/router/node_modules/call-bind-apply-helpers/functionCall.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/index.d.ts +64 -0
- package/router/node_modules/call-bind-apply-helpers/index.js +15 -0
- package/router/node_modules/call-bind-apply-helpers/package.json +85 -0
- package/router/node_modules/call-bind-apply-helpers/reflectApply.d.ts +3 -0
- package/router/node_modules/call-bind-apply-helpers/reflectApply.js +4 -0
- package/router/node_modules/call-bind-apply-helpers/tsconfig.json +9 -0
- package/router/node_modules/call-bound/.github/FUNDING.yml +12 -0
- package/router/node_modules/call-bound/CHANGELOG.md +42 -0
- package/router/node_modules/call-bound/LICENSE +21 -0
- package/router/node_modules/call-bound/README.md +53 -0
- package/router/node_modules/call-bound/index.d.ts +94 -0
- package/router/node_modules/call-bound/index.js +19 -0
- package/router/node_modules/call-bound/package.json +99 -0
- package/router/node_modules/call-bound/tsconfig.json +10 -0
- package/router/node_modules/content-disposition/HISTORY.md +60 -0
- package/router/node_modules/content-disposition/LICENSE +22 -0
- package/router/node_modules/content-disposition/README.md +142 -0
- package/router/node_modules/content-disposition/index.js +458 -0
- package/router/node_modules/content-disposition/package.json +44 -0
- package/router/node_modules/content-type/HISTORY.md +29 -0
- package/router/node_modules/content-type/LICENSE +22 -0
- package/router/node_modules/content-type/README.md +94 -0
- package/router/node_modules/content-type/index.js +225 -0
- package/router/node_modules/content-type/package.json +42 -0
- package/router/node_modules/cookie/LICENSE +24 -0
- package/router/node_modules/cookie/README.md +317 -0
- package/router/node_modules/cookie/SECURITY.md +25 -0
- package/router/node_modules/cookie/index.js +335 -0
- package/router/node_modules/cookie/package.json +44 -0
- package/router/node_modules/cookie-signature/History.md +42 -0
- package/router/node_modules/cookie-signature/Readme.md +42 -0
- package/router/node_modules/cookie-signature/index.js +51 -0
- package/router/node_modules/cookie-signature/package.json +18 -0
- package/router/node_modules/debug/.coveralls.yml +1 -0
- package/router/node_modules/debug/CHANGELOG.md +362 -0
- package/router/node_modules/debug/LICENSE +19 -0
- package/router/node_modules/debug/Makefile +50 -0
- package/router/node_modules/debug/README.md +312 -0
- package/router/node_modules/debug/component.json +19 -0
- package/router/node_modules/debug/karma.conf.js +70 -0
- package/router/node_modules/debug/node.js +1 -0
- package/router/node_modules/debug/package.json +49 -0
- package/router/node_modules/debug/src/browser.js +185 -0
- package/router/node_modules/debug/src/debug.js +202 -0
- package/router/node_modules/debug/src/index.js +10 -0
- package/router/node_modules/debug/src/inspector-log.js +15 -0
- package/router/node_modules/debug/src/node.js +248 -0
- package/router/node_modules/depd/History.md +103 -0
- package/router/node_modules/depd/LICENSE +22 -0
- package/router/node_modules/depd/Readme.md +280 -0
- package/router/node_modules/depd/index.js +538 -0
- package/router/node_modules/depd/lib/browser/index.js +77 -0
- package/router/node_modules/depd/package.json +45 -0
- package/router/node_modules/destroy/LICENSE +23 -0
- package/router/node_modules/destroy/README.md +63 -0
- package/router/node_modules/destroy/index.js +209 -0
- package/router/node_modules/destroy/package.json +48 -0
- package/router/node_modules/dunder-proto/.github/FUNDING.yml +12 -0
- package/router/node_modules/dunder-proto/CHANGELOG.md +24 -0
- package/router/node_modules/dunder-proto/LICENSE +21 -0
- package/router/node_modules/dunder-proto/README.md +54 -0
- package/router/node_modules/dunder-proto/get.d.ts +5 -0
- package/router/node_modules/dunder-proto/get.js +30 -0
- package/router/node_modules/dunder-proto/package.json +76 -0
- package/router/node_modules/dunder-proto/set.d.ts +5 -0
- package/router/node_modules/dunder-proto/set.js +35 -0
- package/router/node_modules/dunder-proto/tsconfig.json +9 -0
- package/router/node_modules/ee-first/LICENSE +22 -0
- package/router/node_modules/ee-first/README.md +80 -0
- package/router/node_modules/ee-first/index.js +95 -0
- package/router/node_modules/ee-first/package.json +29 -0
- package/router/node_modules/encodeurl/LICENSE +22 -0
- package/router/node_modules/encodeurl/README.md +109 -0
- package/router/node_modules/encodeurl/index.js +60 -0
- package/router/node_modules/encodeurl/package.json +40 -0
- package/router/node_modules/es-define-property/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-define-property/CHANGELOG.md +29 -0
- package/router/node_modules/es-define-property/LICENSE +21 -0
- package/router/node_modules/es-define-property/README.md +49 -0
- package/router/node_modules/es-define-property/index.d.ts +3 -0
- package/router/node_modules/es-define-property/index.js +14 -0
- package/router/node_modules/es-define-property/package.json +81 -0
- package/router/node_modules/es-define-property/tsconfig.json +10 -0
- package/router/node_modules/es-errors/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-errors/CHANGELOG.md +40 -0
- package/router/node_modules/es-errors/LICENSE +21 -0
- package/router/node_modules/es-errors/README.md +55 -0
- package/router/node_modules/es-errors/eval.d.ts +3 -0
- package/router/node_modules/es-errors/eval.js +4 -0
- package/router/node_modules/es-errors/index.d.ts +3 -0
- package/router/node_modules/es-errors/index.js +4 -0
- package/router/node_modules/es-errors/package.json +80 -0
- package/router/node_modules/es-errors/range.d.ts +3 -0
- package/router/node_modules/es-errors/range.js +4 -0
- package/router/node_modules/es-errors/ref.d.ts +3 -0
- package/router/node_modules/es-errors/ref.js +4 -0
- package/router/node_modules/es-errors/syntax.d.ts +3 -0
- package/router/node_modules/es-errors/syntax.js +4 -0
- package/router/node_modules/es-errors/tsconfig.json +49 -0
- package/router/node_modules/es-errors/type.d.ts +3 -0
- package/router/node_modules/es-errors/type.js +4 -0
- package/router/node_modules/es-errors/uri.d.ts +3 -0
- package/router/node_modules/es-errors/uri.js +4 -0
- package/router/node_modules/es-object-atoms/.github/FUNDING.yml +12 -0
- package/router/node_modules/es-object-atoms/CHANGELOG.md +37 -0
- package/router/node_modules/es-object-atoms/LICENSE +21 -0
- package/router/node_modules/es-object-atoms/README.md +63 -0
- package/router/node_modules/es-object-atoms/RequireObjectCoercible.d.ts +3 -0
- package/router/node_modules/es-object-atoms/RequireObjectCoercible.js +11 -0
- package/router/node_modules/es-object-atoms/ToObject.d.ts +7 -0
- package/router/node_modules/es-object-atoms/ToObject.js +10 -0
- package/router/node_modules/es-object-atoms/index.d.ts +3 -0
- package/router/node_modules/es-object-atoms/index.js +4 -0
- package/router/node_modules/es-object-atoms/isObject.d.ts +3 -0
- package/router/node_modules/es-object-atoms/isObject.js +6 -0
- package/router/node_modules/es-object-atoms/package.json +80 -0
- package/router/node_modules/es-object-atoms/tsconfig.json +6 -0
- package/router/node_modules/escape-html/LICENSE +24 -0
- package/router/node_modules/escape-html/Readme.md +43 -0
- package/router/node_modules/escape-html/index.js +78 -0
- package/router/node_modules/escape-html/package.json +24 -0
- package/router/node_modules/etag/HISTORY.md +83 -0
- package/router/node_modules/etag/LICENSE +22 -0
- package/router/node_modules/etag/README.md +159 -0
- package/router/node_modules/etag/index.js +131 -0
- package/router/node_modules/etag/package.json +47 -0
- package/router/node_modules/express/History.md +3667 -0
- package/router/node_modules/express/LICENSE +24 -0
- package/router/node_modules/express/Readme.md +260 -0
- package/router/node_modules/express/index.js +11 -0
- package/router/node_modules/express/lib/application.js +661 -0
- package/router/node_modules/express/lib/express.js +116 -0
- package/router/node_modules/express/lib/middleware/init.js +43 -0
- package/router/node_modules/express/lib/middleware/query.js +47 -0
- package/router/node_modules/express/lib/request.js +525 -0
- package/router/node_modules/express/lib/response.js +1179 -0
- package/router/node_modules/express/lib/router/index.js +673 -0
- package/router/node_modules/express/lib/router/layer.js +181 -0
- package/router/node_modules/express/lib/router/route.js +230 -0
- package/router/node_modules/express/lib/utils.js +303 -0
- package/router/node_modules/express/lib/view.js +182 -0
- package/router/node_modules/express/package.json +102 -0
- package/router/node_modules/express-hooked/LICENSE +204 -0
- package/router/node_modules/express-hooked/README.es.md +123 -0
- package/router/node_modules/express-hooked/README.md +123 -0
- package/router/node_modules/express-hooked/express-hooked.js +206 -0
- package/router/node_modules/express-hooked/hooks.js +584 -0
- package/router/node_modules/express-hooked/package.json +30 -0
- package/router/node_modules/finalhandler/HISTORY.md +216 -0
- package/router/node_modules/finalhandler/LICENSE +22 -0
- package/router/node_modules/finalhandler/README.md +147 -0
- package/router/node_modules/finalhandler/SECURITY.md +25 -0
- package/router/node_modules/finalhandler/index.js +341 -0
- package/router/node_modules/finalhandler/package.json +47 -0
- package/router/node_modules/forwarded/HISTORY.md +21 -0
- package/router/node_modules/forwarded/LICENSE +22 -0
- package/router/node_modules/forwarded/README.md +57 -0
- package/router/node_modules/forwarded/index.js +90 -0
- package/router/node_modules/forwarded/package.json +45 -0
- package/router/node_modules/fresh/HISTORY.md +70 -0
- package/router/node_modules/fresh/LICENSE +23 -0
- package/router/node_modules/fresh/README.md +119 -0
- package/router/node_modules/fresh/index.js +137 -0
- package/router/node_modules/fresh/package.json +46 -0
- package/router/node_modules/function-bind/.github/FUNDING.yml +12 -0
- package/router/node_modules/function-bind/.github/SECURITY.md +3 -0
- package/router/node_modules/function-bind/CHANGELOG.md +136 -0
- package/router/node_modules/function-bind/LICENSE +20 -0
- package/router/node_modules/function-bind/README.md +46 -0
- package/router/node_modules/function-bind/implementation.js +84 -0
- package/router/node_modules/function-bind/index.js +5 -0
- package/router/node_modules/function-bind/package.json +87 -0
- package/router/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
- package/router/node_modules/get-intrinsic/CHANGELOG.md +186 -0
- package/router/node_modules/get-intrinsic/LICENSE +21 -0
- package/router/node_modules/get-intrinsic/README.md +71 -0
- package/router/node_modules/get-intrinsic/index.js +378 -0
- package/router/node_modules/get-intrinsic/package.json +97 -0
- package/router/node_modules/get-proto/.github/FUNDING.yml +12 -0
- package/router/node_modules/get-proto/CHANGELOG.md +21 -0
- package/router/node_modules/get-proto/LICENSE +21 -0
- package/router/node_modules/get-proto/Object.getPrototypeOf.d.ts +5 -0
- package/router/node_modules/get-proto/Object.getPrototypeOf.js +6 -0
- package/router/node_modules/get-proto/README.md +50 -0
- package/router/node_modules/get-proto/Reflect.getPrototypeOf.d.ts +3 -0
- package/router/node_modules/get-proto/Reflect.getPrototypeOf.js +4 -0
- package/router/node_modules/get-proto/index.d.ts +5 -0
- package/router/node_modules/get-proto/index.js +27 -0
- package/router/node_modules/get-proto/package.json +81 -0
- package/router/node_modules/get-proto/tsconfig.json +9 -0
- package/router/node_modules/gopd/.github/FUNDING.yml +12 -0
- package/router/node_modules/gopd/CHANGELOG.md +45 -0
- package/router/node_modules/gopd/LICENSE +21 -0
- package/router/node_modules/gopd/README.md +40 -0
- package/router/node_modules/gopd/gOPD.d.ts +1 -0
- package/router/node_modules/gopd/gOPD.js +4 -0
- package/router/node_modules/gopd/index.d.ts +5 -0
- package/router/node_modules/gopd/index.js +15 -0
- package/router/node_modules/gopd/package.json +77 -0
- package/router/node_modules/gopd/tsconfig.json +9 -0
- package/router/node_modules/has-symbols/.github/FUNDING.yml +12 -0
- package/router/node_modules/has-symbols/CHANGELOG.md +91 -0
- package/router/node_modules/has-symbols/LICENSE +21 -0
- package/router/node_modules/has-symbols/README.md +46 -0
- package/router/node_modules/has-symbols/index.d.ts +3 -0
- package/router/node_modules/has-symbols/index.js +14 -0
- package/router/node_modules/has-symbols/package.json +111 -0
- package/router/node_modules/has-symbols/shams.d.ts +3 -0
- package/router/node_modules/has-symbols/shams.js +45 -0
- package/router/node_modules/has-symbols/tsconfig.json +10 -0
- package/router/node_modules/hasown/.github/FUNDING.yml +12 -0
- package/router/node_modules/hasown/CHANGELOG.md +40 -0
- package/router/node_modules/hasown/LICENSE +21 -0
- package/router/node_modules/hasown/README.md +40 -0
- package/router/node_modules/hasown/index.d.ts +3 -0
- package/router/node_modules/hasown/index.js +8 -0
- package/router/node_modules/hasown/package.json +92 -0
- package/router/node_modules/hasown/tsconfig.json +6 -0
- package/router/node_modules/http-errors/HISTORY.md +186 -0
- package/router/node_modules/http-errors/LICENSE +23 -0
- package/router/node_modules/http-errors/README.md +169 -0
- package/router/node_modules/http-errors/index.js +290 -0
- package/router/node_modules/http-errors/package.json +54 -0
- package/router/node_modules/iconv-lite/Changelog.md +162 -0
- package/router/node_modules/iconv-lite/LICENSE +21 -0
- package/router/node_modules/iconv-lite/README.md +156 -0
- package/router/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
- package/router/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
- package/router/node_modules/iconv-lite/encodings/index.js +22 -0
- package/router/node_modules/iconv-lite/encodings/internal.js +188 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
- package/router/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
- package/router/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
- package/router/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
- package/router/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
- package/router/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
- package/router/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
- package/router/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
- package/router/node_modules/iconv-lite/encodings/utf16.js +177 -0
- package/router/node_modules/iconv-lite/encodings/utf7.js +290 -0
- package/router/node_modules/iconv-lite/lib/bom-handling.js +52 -0
- package/router/node_modules/iconv-lite/lib/extend-node.js +217 -0
- package/router/node_modules/iconv-lite/lib/index.d.ts +24 -0
- package/router/node_modules/iconv-lite/lib/index.js +153 -0
- package/router/node_modules/iconv-lite/lib/streams.js +121 -0
- package/router/node_modules/iconv-lite/package.json +46 -0
- package/router/node_modules/inherits/LICENSE +16 -0
- package/router/node_modules/inherits/README.md +42 -0
- package/router/node_modules/inherits/inherits.js +9 -0
- package/router/node_modules/inherits/inherits_browser.js +27 -0
- package/router/node_modules/inherits/package.json +29 -0
- package/router/node_modules/ipaddr.js/LICENSE +19 -0
- package/router/node_modules/ipaddr.js/README.md +233 -0
- package/router/node_modules/ipaddr.js/ipaddr.min.js +1 -0
- package/router/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
- package/router/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
- package/router/node_modules/ipaddr.js/package.json +35 -0
- package/router/node_modules/math-intrinsics/.github/FUNDING.yml +12 -0
- package/router/node_modules/math-intrinsics/CHANGELOG.md +24 -0
- package/router/node_modules/math-intrinsics/LICENSE +21 -0
- package/router/node_modules/math-intrinsics/README.md +50 -0
- package/router/node_modules/math-intrinsics/abs.d.ts +1 -0
- package/router/node_modules/math-intrinsics/abs.js +4 -0
- package/router/node_modules/math-intrinsics/constants/maxArrayLength.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxArrayLength.js +4 -0
- package/router/node_modules/math-intrinsics/constants/maxSafeInteger.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxSafeInteger.js +5 -0
- package/router/node_modules/math-intrinsics/constants/maxValue.d.ts +3 -0
- package/router/node_modules/math-intrinsics/constants/maxValue.js +5 -0
- package/router/node_modules/math-intrinsics/floor.d.ts +1 -0
- package/router/node_modules/math-intrinsics/floor.js +4 -0
- package/router/node_modules/math-intrinsics/isFinite.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isFinite.js +12 -0
- package/router/node_modules/math-intrinsics/isInteger.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isInteger.js +16 -0
- package/router/node_modules/math-intrinsics/isNaN.d.ts +1 -0
- package/router/node_modules/math-intrinsics/isNaN.js +6 -0
- package/router/node_modules/math-intrinsics/isNegativeZero.d.ts +3 -0
- package/router/node_modules/math-intrinsics/isNegativeZero.js +6 -0
- package/router/node_modules/math-intrinsics/max.d.ts +1 -0
- package/router/node_modules/math-intrinsics/max.js +4 -0
- package/router/node_modules/math-intrinsics/min.d.ts +1 -0
- package/router/node_modules/math-intrinsics/min.js +4 -0
- package/router/node_modules/math-intrinsics/mod.d.ts +3 -0
- package/router/node_modules/math-intrinsics/mod.js +9 -0
- package/router/node_modules/math-intrinsics/package.json +86 -0
- package/router/node_modules/math-intrinsics/pow.d.ts +1 -0
- package/router/node_modules/math-intrinsics/pow.js +4 -0
- package/router/node_modules/math-intrinsics/round.d.ts +1 -0
- package/router/node_modules/math-intrinsics/round.js +4 -0
- package/router/node_modules/math-intrinsics/sign.d.ts +3 -0
- package/router/node_modules/math-intrinsics/sign.js +11 -0
- package/router/node_modules/math-intrinsics/tsconfig.json +3 -0
- package/router/node_modules/media-typer/HISTORY.md +22 -0
- package/router/node_modules/media-typer/LICENSE +22 -0
- package/router/node_modules/media-typer/README.md +81 -0
- package/router/node_modules/media-typer/index.js +270 -0
- package/router/node_modules/media-typer/package.json +26 -0
- package/router/node_modules/merge-descriptors/HISTORY.md +21 -0
- package/router/node_modules/merge-descriptors/LICENSE +23 -0
- package/router/node_modules/merge-descriptors/README.md +49 -0
- package/router/node_modules/merge-descriptors/index.js +60 -0
- package/router/node_modules/merge-descriptors/package.json +39 -0
- package/router/node_modules/methods/HISTORY.md +29 -0
- package/router/node_modules/methods/LICENSE +24 -0
- package/router/node_modules/methods/README.md +51 -0
- package/router/node_modules/methods/index.js +69 -0
- package/router/node_modules/methods/package.json +36 -0
- package/router/node_modules/mime/CHANGELOG.md +164 -0
- package/router/node_modules/mime/LICENSE +21 -0
- package/router/node_modules/mime/README.md +90 -0
- package/router/node_modules/mime/cli.js +8 -0
- package/router/node_modules/mime/mime.js +108 -0
- package/router/node_modules/mime/package.json +44 -0
- package/router/node_modules/mime/src/build.js +53 -0
- package/router/node_modules/mime/src/test.js +60 -0
- package/router/node_modules/mime/types.json +1 -0
- package/router/node_modules/mime-db/HISTORY.md +507 -0
- package/router/node_modules/mime-db/LICENSE +23 -0
- package/router/node_modules/mime-db/README.md +100 -0
- package/router/node_modules/mime-db/db.json +8519 -0
- package/router/node_modules/mime-db/index.js +12 -0
- package/router/node_modules/mime-db/package.json +60 -0
- package/router/node_modules/mime-types/HISTORY.md +397 -0
- package/router/node_modules/mime-types/LICENSE +23 -0
- package/router/node_modules/mime-types/README.md +113 -0
- package/router/node_modules/mime-types/index.js +188 -0
- package/router/node_modules/mime-types/package.json +44 -0
- package/router/node_modules/ms/index.js +152 -0
- package/router/node_modules/ms/license.md +21 -0
- package/router/node_modules/ms/package.json +37 -0
- package/router/node_modules/ms/readme.md +51 -0
- package/router/node_modules/negotiator/HISTORY.md +108 -0
- package/router/node_modules/negotiator/LICENSE +24 -0
- package/router/node_modules/negotiator/README.md +203 -0
- package/router/node_modules/negotiator/index.js +82 -0
- package/router/node_modules/negotiator/lib/charset.js +169 -0
- package/router/node_modules/negotiator/lib/encoding.js +184 -0
- package/router/node_modules/negotiator/lib/language.js +179 -0
- package/router/node_modules/negotiator/lib/mediaType.js +294 -0
- package/router/node_modules/negotiator/package.json +42 -0
- package/router/node_modules/object-inspect/.github/FUNDING.yml +12 -0
- package/router/node_modules/object-inspect/CHANGELOG.md +424 -0
- package/router/node_modules/object-inspect/LICENSE +21 -0
- package/router/node_modules/object-inspect/example/all.js +23 -0
- package/router/node_modules/object-inspect/example/circular.js +6 -0
- package/router/node_modules/object-inspect/example/fn.js +5 -0
- package/router/node_modules/object-inspect/example/inspect.js +10 -0
- package/router/node_modules/object-inspect/index.js +544 -0
- package/router/node_modules/object-inspect/package-support.json +20 -0
- package/router/node_modules/object-inspect/package.json +105 -0
- package/router/node_modules/object-inspect/readme.markdown +84 -0
- package/router/node_modules/object-inspect/test-core-js.js +26 -0
- package/router/node_modules/object-inspect/util.inspect.js +1 -0
- package/router/node_modules/on-finished/HISTORY.md +98 -0
- package/router/node_modules/on-finished/LICENSE +23 -0
- package/router/node_modules/on-finished/README.md +162 -0
- package/router/node_modules/on-finished/index.js +234 -0
- package/router/node_modules/on-finished/package.json +39 -0
- package/router/node_modules/parseurl/HISTORY.md +58 -0
- package/router/node_modules/parseurl/LICENSE +24 -0
- package/router/node_modules/parseurl/README.md +133 -0
- package/router/node_modules/parseurl/index.js +158 -0
- package/router/node_modules/parseurl/package.json +40 -0
- package/router/node_modules/path-to-regexp/LICENSE +21 -0
- package/router/node_modules/path-to-regexp/Readme.md +35 -0
- package/router/node_modules/path-to-regexp/index.js +156 -0
- package/router/node_modules/path-to-regexp/package.json +30 -0
- package/router/node_modules/proxy-addr/HISTORY.md +161 -0
- package/router/node_modules/proxy-addr/LICENSE +22 -0
- package/router/node_modules/proxy-addr/README.md +139 -0
- package/router/node_modules/proxy-addr/index.js +327 -0
- package/router/node_modules/proxy-addr/package.json +47 -0
- package/router/node_modules/qs/.github/FUNDING.yml +12 -0
- package/router/node_modules/qs/.github/SECURITY.md +11 -0
- package/router/node_modules/qs/.github/THREAT_MODEL.md +78 -0
- package/router/node_modules/qs/CHANGELOG.md +644 -0
- package/router/node_modules/qs/LICENSE.md +29 -0
- package/router/node_modules/qs/README.md +740 -0
- package/router/node_modules/qs/dist/qs.js +141 -0
- package/router/node_modules/qs/eslint.config.mjs +56 -0
- package/router/node_modules/qs/lib/formats.js +23 -0
- package/router/node_modules/qs/lib/index.js +11 -0
- package/router/node_modules/qs/lib/parse.js +371 -0
- package/router/node_modules/qs/lib/stringify.js +356 -0
- package/router/node_modules/qs/lib/utils.js +340 -0
- package/router/node_modules/qs/package.json +94 -0
- package/router/node_modules/range-parser/HISTORY.md +56 -0
- package/router/node_modules/range-parser/LICENSE +23 -0
- package/router/node_modules/range-parser/README.md +84 -0
- package/router/node_modules/range-parser/index.js +162 -0
- package/router/node_modules/range-parser/package.json +44 -0
- package/router/node_modules/raw-body/LICENSE +22 -0
- package/router/node_modules/raw-body/README.md +223 -0
- package/router/node_modules/raw-body/index.d.ts +87 -0
- package/router/node_modules/raw-body/index.js +336 -0
- package/router/node_modules/raw-body/package.json +47 -0
- package/router/node_modules/safe-buffer/LICENSE +21 -0
- package/router/node_modules/safe-buffer/README.md +584 -0
- package/router/node_modules/safe-buffer/index.d.ts +187 -0
- package/router/node_modules/safe-buffer/index.js +65 -0
- package/router/node_modules/safe-buffer/package.json +51 -0
- package/router/node_modules/safer-buffer/LICENSE +21 -0
- package/router/node_modules/safer-buffer/Porting-Buffer.md +268 -0
- package/router/node_modules/safer-buffer/Readme.md +156 -0
- package/router/node_modules/safer-buffer/dangerous.js +58 -0
- package/router/node_modules/safer-buffer/package.json +34 -0
- package/router/node_modules/safer-buffer/safer.js +77 -0
- package/router/node_modules/safer-buffer/tests.js +406 -0
- package/router/node_modules/send/HISTORY.md +538 -0
- package/router/node_modules/send/LICENSE +23 -0
- package/router/node_modules/send/README.md +327 -0
- package/router/node_modules/send/SECURITY.md +24 -0
- package/router/node_modules/send/index.js +1142 -0
- package/router/node_modules/send/node_modules/ms/index.js +162 -0
- package/router/node_modules/send/node_modules/ms/license.md +21 -0
- package/router/node_modules/send/node_modules/ms/package.json +38 -0
- package/router/node_modules/send/node_modules/ms/readme.md +59 -0
- package/router/node_modules/send/package.json +62 -0
- package/router/node_modules/serve-static/HISTORY.md +493 -0
- package/router/node_modules/serve-static/LICENSE +25 -0
- package/router/node_modules/serve-static/README.md +257 -0
- package/router/node_modules/serve-static/index.js +209 -0
- package/router/node_modules/serve-static/package.json +42 -0
- package/router/node_modules/setprototypeof/LICENSE +13 -0
- package/router/node_modules/setprototypeof/README.md +31 -0
- package/router/node_modules/setprototypeof/index.d.ts +2 -0
- package/router/node_modules/setprototypeof/index.js +17 -0
- package/router/node_modules/setprototypeof/package.json +38 -0
- package/router/node_modules/side-channel/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel/CHANGELOG.md +110 -0
- package/router/node_modules/side-channel/LICENSE +21 -0
- package/router/node_modules/side-channel/README.md +61 -0
- package/router/node_modules/side-channel/index.d.ts +14 -0
- package/router/node_modules/side-channel/index.js +43 -0
- package/router/node_modules/side-channel/package.json +85 -0
- package/router/node_modules/side-channel/tsconfig.json +9 -0
- package/router/node_modules/side-channel-list/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-list/CHANGELOG.md +15 -0
- package/router/node_modules/side-channel-list/LICENSE +21 -0
- package/router/node_modules/side-channel-list/README.md +62 -0
- package/router/node_modules/side-channel-list/index.d.ts +13 -0
- package/router/node_modules/side-channel-list/index.js +113 -0
- package/router/node_modules/side-channel-list/list.d.ts +14 -0
- package/router/node_modules/side-channel-list/package.json +77 -0
- package/router/node_modules/side-channel-list/tsconfig.json +9 -0
- package/router/node_modules/side-channel-map/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-map/CHANGELOG.md +22 -0
- package/router/node_modules/side-channel-map/LICENSE +21 -0
- package/router/node_modules/side-channel-map/README.md +62 -0
- package/router/node_modules/side-channel-map/index.d.ts +15 -0
- package/router/node_modules/side-channel-map/index.js +68 -0
- package/router/node_modules/side-channel-map/package.json +80 -0
- package/router/node_modules/side-channel-map/tsconfig.json +9 -0
- package/router/node_modules/side-channel-weakmap/.github/FUNDING.yml +12 -0
- package/router/node_modules/side-channel-weakmap/CHANGELOG.md +28 -0
- package/router/node_modules/side-channel-weakmap/LICENSE +21 -0
- package/router/node_modules/side-channel-weakmap/README.md +62 -0
- package/router/node_modules/side-channel-weakmap/index.d.ts +15 -0
- package/router/node_modules/side-channel-weakmap/index.js +84 -0
- package/router/node_modules/side-channel-weakmap/package.json +87 -0
- package/router/node_modules/side-channel-weakmap/tsconfig.json +9 -0
- package/router/node_modules/statuses/HISTORY.md +87 -0
- package/router/node_modules/statuses/LICENSE +23 -0
- package/router/node_modules/statuses/README.md +139 -0
- package/router/node_modules/statuses/codes.json +65 -0
- package/router/node_modules/statuses/index.js +146 -0
- package/router/node_modules/statuses/package.json +49 -0
- package/router/node_modules/toidentifier/HISTORY.md +9 -0
- package/router/node_modules/toidentifier/LICENSE +21 -0
- package/router/node_modules/toidentifier/README.md +61 -0
- package/router/node_modules/toidentifier/index.js +32 -0
- package/router/node_modules/toidentifier/package.json +38 -0
- package/router/node_modules/type-is/HISTORY.md +259 -0
- package/router/node_modules/type-is/LICENSE +23 -0
- package/router/node_modules/type-is/README.md +170 -0
- package/router/node_modules/type-is/index.js +266 -0
- package/router/node_modules/type-is/package.json +45 -0
- package/router/node_modules/unpipe/HISTORY.md +4 -0
- package/router/node_modules/unpipe/LICENSE +22 -0
- package/router/node_modules/unpipe/README.md +43 -0
- package/router/node_modules/unpipe/index.js +69 -0
- package/router/node_modules/unpipe/package.json +27 -0
- package/router/node_modules/utils-merge/LICENSE +20 -0
- package/router/node_modules/utils-merge/README.md +34 -0
- package/router/node_modules/utils-merge/index.js +23 -0
- package/router/node_modules/utils-merge/package.json +40 -0
- package/router/node_modules/vary/HISTORY.md +39 -0
- package/router/node_modules/vary/LICENSE +22 -0
- package/router/node_modules/vary/README.md +101 -0
- package/router/node_modules/vary/index.js +149 -0
- package/router/node_modules/vary/package.json +43 -0
- package/router/package.json +36 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Express-Queued
|
|
2
|
+
|
|
3
|
+
Express-Queued es un sistema de colas independiente para Express.js que permite la ejecución asíncrona de tareas en múltiples colas concurrentes. Este sistema es ideal para operaciones que consumen tiempo como procesamiento de imágenes, envío de correos electrónicos, procesamiento de pagos, y otras operaciones que no deben bloquear la respuesta inmediata a las solicitudes del usuario.
|
|
4
|
+
|
|
5
|
+
## Características
|
|
6
|
+
|
|
7
|
+
- **Soporte para N colas**: Puedes crear tantas colas como necesites, cada una con su propia configuración.
|
|
8
|
+
- **Concurrencia configurable**: Controla cuántas tareas se ejecutan simultáneamente por cola.
|
|
9
|
+
- **Hooks personalizados**: Personaliza la lógica de procesamiento y fallback para cada cola usando el sistema de hooks de [express-hooked](https://www.npmjs.com/package/express-hooked).
|
|
10
|
+
- **Sistema de reintentos**: Manejo automático de fallos con reintentos configurables.
|
|
11
|
+
- **Gestión de prioridades**: Asigna prioridades a las tareas para determinar su orden de ejecución.
|
|
12
|
+
- **Sistema de fallback**: Manejo de tareas que fallan definitivamente.
|
|
13
|
+
- **Totalmente asíncrono**: No bloquea el hilo principal de ejecución.
|
|
14
|
+
- **Integración con Express**: Middleware para inyectar el sistema de colas en las solicitudes de Express.
|
|
15
|
+
|
|
16
|
+
## Instalación
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install express-queued express-hooked
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Uso Básico
|
|
23
|
+
|
|
24
|
+
### 1. Importar e inicializar
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
const express = require('express');
|
|
28
|
+
const ExpressQueueIntegration = require('express-queued');
|
|
29
|
+
|
|
30
|
+
const app = express();
|
|
31
|
+
const expressQueue = new ExpressQueueIntegration();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Crear una cola
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// Crear una cola con configuración por defecto
|
|
38
|
+
expressQueue.createQueue('procesamiento-general', {
|
|
39
|
+
concurrency: 2, // Máximo 2 tareas ejecutándose simultáneamente
|
|
40
|
+
retryAttempts: 3, // Reintentar hasta 3 veces si falla
|
|
41
|
+
retryDelay: 1000 // Esperar 1 segundo entre reintentos
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. Definir una tarea
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
// Función que representa una tarea
|
|
49
|
+
function procesarImagen(datos, taskObj) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
// Simular procesamiento
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
console.log(`Procesando imagen:`, datos);
|
|
54
|
+
resolve('Procesamiento de imagen completado');
|
|
55
|
+
}, 2000);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 4. Agregar tareas a la cola
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
// Agregar una tarea a la cola
|
|
64
|
+
const taskId = expressQueue.addTask(
|
|
65
|
+
'procesamiento-general', // Nombre de la cola
|
|
66
|
+
procesarImagen, // Función de la tarea
|
|
67
|
+
{ id: 1, nombre: 'imagen1.jpg' }, // Datos para la tarea
|
|
68
|
+
0 // Prioridad (0 es la más alta)
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 5. Iniciar el sistema de colas
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
// Iniciar la ejecución de tareas
|
|
76
|
+
expressQueue.start();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Uso con Express
|
|
80
|
+
|
|
81
|
+
### 1. Agregar el middleware
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
// Middleware para inyectar el sistema de colas en las solicitudes
|
|
85
|
+
app.use(expressQueue.queueMiddleware());
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 2. Usar el sistema de colas en las rutas
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
// Ruta para agregar una tarea
|
|
92
|
+
app.post('/procesar-imagen', (req, res) => {
|
|
93
|
+
const { nombre, tamaño } = req.body;
|
|
94
|
+
|
|
95
|
+
const taskId = req.addTask('procesamiento-general', procesarImagen, {
|
|
96
|
+
nombre,
|
|
97
|
+
tamaño
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
res.json({
|
|
101
|
+
message: 'Tarea de procesamiento de imagen agregada a la cola',
|
|
102
|
+
taskId
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Ruta para obtener el estado del sistema de colas
|
|
107
|
+
app.get('/estado-colas', (req, res) => {
|
|
108
|
+
const status = req.getQueueStatus();
|
|
109
|
+
res.json(status);
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Hooks Personalizados
|
|
114
|
+
|
|
115
|
+
El sistema de colas se integra con el sistema de hooks de [express-hooked](https://www.npmjs.com/package/express-hooked), lo que permite personalizar el comportamiento del sistema a través de puntos de extensión.
|
|
116
|
+
|
|
117
|
+
### Hooks Disponibles
|
|
118
|
+
|
|
119
|
+
- `queue_execute_task`: Se ejecuta antes de procesar una tarea. Permite modificar la lógica de la tarea.
|
|
120
|
+
- `queue_task_completed`: Se ejecuta cuando una tarea se completa exitosamente.
|
|
121
|
+
- `queue_task_failed`: Se ejecuta cuando una tarea falla.
|
|
122
|
+
- `queue_task_retry`: Se ejecuta cuando una tarea se reintenta.
|
|
123
|
+
- `queue_task_fallback`: Se ejecuta cuando una tarea falla definitivamente después de todos los reintentos.
|
|
124
|
+
- `queue_task_added`: Se ejecuta cuando se agrega una tarea a la cola.
|
|
125
|
+
- `queue_system_started`: Se ejecuta cuando se inicia el sistema de colas.
|
|
126
|
+
- `queue_system_stopped`: Se ejecuta cuando se detiene el sistema de colas.
|
|
127
|
+
|
|
128
|
+
### Ejemplo de hook personalizado
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
const { HookSystem } = require('express-hooked');
|
|
132
|
+
|
|
133
|
+
// Crear un sistema de hooks específico para una cola
|
|
134
|
+
const imagenHooks = new HookSystem();
|
|
135
|
+
|
|
136
|
+
// Hook para personalizar la lógica de procesamiento
|
|
137
|
+
imagenHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
|
|
138
|
+
console.log(`Preparando para procesar imagen: ${taskObj.id}`);
|
|
139
|
+
|
|
140
|
+
// Envolver la tarea original con lógica adicional
|
|
141
|
+
const wrappedTask = async (datos, taskObj) => {
|
|
142
|
+
console.log(`Iniciando procesamiento de imagen: ${taskObj.id}`);
|
|
143
|
+
try {
|
|
144
|
+
const result = await task(datos, taskObj);
|
|
145
|
+
console.log(`Imagen procesada exitosamente: ${taskObj.id}`);
|
|
146
|
+
return result;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.log(`Error procesando imagen: ${taskObj.id} - ${error.message}`);
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
return wrappedTask;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Crear la cola con hooks personalizados
|
|
157
|
+
expressQueue.createQueue('imagenes', {
|
|
158
|
+
concurrency: 3,
|
|
159
|
+
retryAttempts: 2,
|
|
160
|
+
retryDelay: 1000
|
|
161
|
+
}, imagenHooks);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Manejo de Errores y Reintentos
|
|
165
|
+
|
|
166
|
+
El sistema de colas incluye un mecanismo robusto para manejar errores:
|
|
167
|
+
|
|
168
|
+
### Configuración de reintentos
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
expressQueue.createQueue('procesamiento-confiable', {
|
|
172
|
+
retryAttempts: 5, // Número máximo de reintentos
|
|
173
|
+
retryDelay: 2000 // Milisegundos de espera entre reintentos
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Lógica de fallback
|
|
178
|
+
|
|
179
|
+
Cuando una tarea falla después de todos los reintentos, se ejecuta la lógica de fallback:
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
const hooks = new HookSystem();
|
|
183
|
+
|
|
184
|
+
hooks.addAction('queue_task_fallback', (queueName, task, error) => {
|
|
185
|
+
// Aquí puedes implementar lógica personalizada para manejar tareas fallidas
|
|
186
|
+
console.log(`Tarea fallida definitivamente:`, task.id);
|
|
187
|
+
console.log(`Error:`, error.message);
|
|
188
|
+
|
|
189
|
+
// Por ejemplo, guardar en una base de datos para procesamiento manual
|
|
190
|
+
// o enviar una alerta al equipo de soporte
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Uso Avanzado
|
|
195
|
+
|
|
196
|
+
### Múltiples colas con diferentes configuraciones
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
// Cola de procesamiento de imágenes
|
|
200
|
+
expressQueue.createQueue('procesamiento-imagenes', {
|
|
201
|
+
concurrency: 3,
|
|
202
|
+
retryAttempts: 2,
|
|
203
|
+
retryDelay: 1000
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Cola de envío de correos
|
|
207
|
+
expressQueue.createQueue('envio-correos', {
|
|
208
|
+
concurrency: 2,
|
|
209
|
+
retryAttempts: 3,
|
|
210
|
+
retryDelay: 2000
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Cola de procesamiento de pagos
|
|
214
|
+
expressQueue.createQueue('procesamiento-pagos', {
|
|
215
|
+
concurrency: 1,
|
|
216
|
+
retryAttempts: 5,
|
|
217
|
+
retryDelay: 3000
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Prioridades de tareas
|
|
222
|
+
|
|
223
|
+
Las tareas pueden asignarse con diferentes niveles de prioridad:
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
// Tarea de alta prioridad (prioridad 0)
|
|
227
|
+
expressQueue.addTask('procesamiento-imagenes', procesarImagen, { nombre: 'urgente.jpg' }, 0);
|
|
228
|
+
|
|
229
|
+
// Tarea de prioridad media (prioridad 5)
|
|
230
|
+
expressQueue.addTask('procesamiento-imagenes', procesarImagen, { nombre: 'normal.jpg' }, 5);
|
|
231
|
+
|
|
232
|
+
// Tarea de baja prioridad (prioridad 10)
|
|
233
|
+
expressQueue.addTask('procesamiento-imagenes', procesarImagen, { nombre: 'opcional.jpg' }, 10);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Gestión de colas mediante API
|
|
237
|
+
|
|
238
|
+
```javascript
|
|
239
|
+
// Pausar una cola
|
|
240
|
+
app.post('/pausar-cola/:queueName', (req, res) => {
|
|
241
|
+
const { queueName } = req.params;
|
|
242
|
+
expressQueue.pauseQueue(queueName);
|
|
243
|
+
res.json({ message: `Cola ${queueName} pausada` });
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// Reanudar una cola
|
|
247
|
+
app.post('/reanudar-cola/:queueName', (req, res) => {
|
|
248
|
+
const { queueName } = req.params;
|
|
249
|
+
expressQueue.resumeQueue(queueName);
|
|
250
|
+
res.json({ message: `Cola ${queueName} reanudada` });
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Limpiar una cola
|
|
254
|
+
app.post('/limpiar-cola/:queueName', (req, res) => {
|
|
255
|
+
const { queueName } = req.params;
|
|
256
|
+
expressQueue.clearQueue(queueName);
|
|
257
|
+
res.json({ message: `Cola ${queueName} limpiada` });
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Reintentar tareas fallidas
|
|
261
|
+
app.post('/reintentar-fallidas/:queueName', (req, res) => {
|
|
262
|
+
const { queueName } = req.params;
|
|
263
|
+
expressQueue.retryFailedTasks(queueName);
|
|
264
|
+
res.json({ message: `Reintentando tareas fallidas en cola ${queueName}` });
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## API
|
|
269
|
+
|
|
270
|
+
### ExpressQueueIntegration
|
|
271
|
+
|
|
272
|
+
#### constructor(options = {})
|
|
273
|
+
|
|
274
|
+
- `options.concurrency`: Número de trabajadores concurrentes por defecto (por defecto: 1)
|
|
275
|
+
- `options.retryAttempts`: Número de reintentos por defecto (por defecto: 3)
|
|
276
|
+
- `options.retryDelay`: Retraso entre reintentos en ms por defecto (por defecto: 1000)
|
|
277
|
+
|
|
278
|
+
#### createQueue(queueName, options = {}, hooks = null)
|
|
279
|
+
|
|
280
|
+
Crea una cola con la configuración especificada.
|
|
281
|
+
|
|
282
|
+
- `queueName`: Nombre de la cola
|
|
283
|
+
- `options.concurrency`: Número de trabajadores concurrentes
|
|
284
|
+
- `options.retryAttempts`: Número de reintentos
|
|
285
|
+
- `options.retryDelay`: Retraso entre reintentos en ms
|
|
286
|
+
- `hooks`: Sistema de hooks para esta cola
|
|
287
|
+
|
|
288
|
+
#### addTask(queueName, task, data = {}, priority = 0)
|
|
289
|
+
|
|
290
|
+
Agrega una tarea a la cola especificada.
|
|
291
|
+
|
|
292
|
+
- `queueName`: Nombre de la cola
|
|
293
|
+
- `task`: Función que representa la tarea
|
|
294
|
+
- `data`: Datos para la tarea
|
|
295
|
+
- `priority`: Prioridad de la tarea (menor número = mayor prioridad)
|
|
296
|
+
|
|
297
|
+
#### start()
|
|
298
|
+
|
|
299
|
+
Inicia la ejecución de tareas en todas las colas.
|
|
300
|
+
|
|
301
|
+
#### stop()
|
|
302
|
+
|
|
303
|
+
Detiene la ejecución de tareas en todas las colas.
|
|
304
|
+
|
|
305
|
+
#### getStatus()
|
|
306
|
+
|
|
307
|
+
Obtiene el estado actual del sistema de colas.
|
|
308
|
+
|
|
309
|
+
#### retryFailedTasks(queueName)
|
|
310
|
+
|
|
311
|
+
Reintenta todas las tareas fallidas en la cola especificada.
|
|
312
|
+
|
|
313
|
+
#### queueMiddleware()
|
|
314
|
+
|
|
315
|
+
Middleware para inyectar el sistema de colas en las solicitudes de Express.
|
|
316
|
+
|
|
317
|
+
#### pauseQueue(queueName)
|
|
318
|
+
|
|
319
|
+
Pausa la cola especificada.
|
|
320
|
+
|
|
321
|
+
#### resumeQueue(queueName)
|
|
322
|
+
|
|
323
|
+
Reanuda la cola especificada.
|
|
324
|
+
|
|
325
|
+
#### clearQueue(queueName)
|
|
326
|
+
|
|
327
|
+
Limpia las tareas pendientes de la cola especificada.
|
|
328
|
+
|
|
329
|
+
## Repositorio
|
|
330
|
+
|
|
331
|
+
Código fuente disponible en: https://gitlab.com/bytedogssyndicate1/express-queued
|
|
332
|
+
|
|
333
|
+
## Licencia
|
|
334
|
+
|
|
335
|
+
Apache 2.0
|
package/queued/README.md
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
# Express-Queued
|
|
2
|
+
|
|
3
|
+
Express-Queued is an independent queue system for Express.js that enables asynchronous execution of tasks in multiple concurrent queues. This system is ideal for time-consuming operations such as image processing, email sending, payment processing, and other operations that shouldn't block the immediate response to user requests.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Support for N queues**: Create as many queues as needed, each with its own configuration.
|
|
8
|
+
- **Configurable concurrency**: Control how many tasks execute simultaneously per queue.
|
|
9
|
+
- **Custom hooks**: Customize processing and fallback logic for each queue using the hooks system from [express-hooked](https://www.npmjs.com/package/express-hooked).
|
|
10
|
+
- **Retry system**: Automatic failure handling with configurable retries.
|
|
11
|
+
- **Priority management**: Assign priorities to tasks to determine their execution order.
|
|
12
|
+
- **Fallback system**: Handle tasks that definitively fail.
|
|
13
|
+
- **Fully asynchronous**: Does not block the main execution thread.
|
|
14
|
+
- **Express integration**: Middleware to inject the queue system into Express requests.
|
|
15
|
+
|
|
16
|
+
## Installation
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npm install express-queued express-hooked
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Basic Usage
|
|
23
|
+
|
|
24
|
+
### 1. Import and initialize
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
const express = require('express');
|
|
28
|
+
const ExpressQueueIntegration = require('express-queued');
|
|
29
|
+
|
|
30
|
+
const app = express();
|
|
31
|
+
const expressQueue = new ExpressQueueIntegration();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Create a queue
|
|
35
|
+
|
|
36
|
+
```javascript
|
|
37
|
+
// Create a queue with default configuration
|
|
38
|
+
expressQueue.createQueue('general-processing', {
|
|
39
|
+
concurrency: 2, // Maximum 2 tasks running simultaneously
|
|
40
|
+
retryAttempts: 3, // Retry up to 3 times if it fails
|
|
41
|
+
retryDelay: 1000 // Wait 1 second between retries
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 3. Define a task
|
|
46
|
+
|
|
47
|
+
```javascript
|
|
48
|
+
// Function representing a task
|
|
49
|
+
function processImage(data, taskObj) {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
// Simulate processing
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
console.log(`Processing image:`, data);
|
|
54
|
+
resolve('Image processing completed');
|
|
55
|
+
}, 2000);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 4. Add tasks to the queue
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
// Add a task to the queue
|
|
64
|
+
const taskId = expressQueue.addTask(
|
|
65
|
+
'general-processing', // Queue name
|
|
66
|
+
processImage, // Task function
|
|
67
|
+
{ id: 1, filename: 'image1.jpg' }, // Data for the task
|
|
68
|
+
0 // Priority (0 is highest)
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 5. Start the queue system
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
// Start task execution
|
|
76
|
+
expressQueue.start();
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Express Usage
|
|
80
|
+
|
|
81
|
+
### 1. Add the middleware
|
|
82
|
+
|
|
83
|
+
```javascript
|
|
84
|
+
// Middleware to inject the queue system into requests
|
|
85
|
+
app.use(expressQueue.queueMiddleware());
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 2. Use the queue system in routes
|
|
89
|
+
|
|
90
|
+
```javascript
|
|
91
|
+
// Route to add a task
|
|
92
|
+
app.post('/process-image', (req, res) => {
|
|
93
|
+
const { filename, size } = req.body;
|
|
94
|
+
|
|
95
|
+
const taskId = req.addTask('general-processing', processImage, {
|
|
96
|
+
filename,
|
|
97
|
+
size
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
res.json({
|
|
101
|
+
message: 'Image processing task added to queue',
|
|
102
|
+
taskId
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Route to get queue system status
|
|
107
|
+
app.get('/queue-status', (req, res) => {
|
|
108
|
+
const status = req.getQueueStatus();
|
|
109
|
+
res.json(status);
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Custom Hooks
|
|
114
|
+
|
|
115
|
+
The queue system integrates with the hooks system from [express-hooked](https://www.npmjs.com/package/express-hooked), allowing customization of system behavior through extension points.
|
|
116
|
+
|
|
117
|
+
### Available Hooks
|
|
118
|
+
|
|
119
|
+
- `queue_execute_task`: Executes before processing a task. Allows modifying task logic.
|
|
120
|
+
- `queue_task_completed`: Executes when a task completes successfully.
|
|
121
|
+
- `queue_task_failed`: Executes when a task fails.
|
|
122
|
+
- `queue_task_retry`: Executes when a task is retried.
|
|
123
|
+
- `queue_task_fallback`: Executes when a task definitively fails after all retries.
|
|
124
|
+
- `queue_task_added`: Executes when a task is added to the queue.
|
|
125
|
+
- `queue_system_started`: Executes when the queue system starts.
|
|
126
|
+
- `queue_system_stopped`: Executes when the queue system stops.
|
|
127
|
+
|
|
128
|
+
### Custom Hook Example
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
const { HookSystem } = require('express-hooked');
|
|
132
|
+
|
|
133
|
+
// Create a specific hook system for a queue
|
|
134
|
+
const imageHooks = new HookSystem();
|
|
135
|
+
|
|
136
|
+
// Hook to customize processing logic
|
|
137
|
+
imageHooks.addAction('queue_execute_task', (task, queueName, taskObj) => {
|
|
138
|
+
console.log(`Preparing to process image: ${taskObj.id}`);
|
|
139
|
+
|
|
140
|
+
// Wrap the original task with additional logic
|
|
141
|
+
const wrappedTask = async (data, taskObj) => {
|
|
142
|
+
console.log(`Starting image processing: ${taskObj.id}`);
|
|
143
|
+
try {
|
|
144
|
+
const result = await task(data, taskObj);
|
|
145
|
+
console.log(`Image processed successfully: ${taskObj.id}`);
|
|
146
|
+
return result;
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.log(`Error processing image: ${taskObj.id} - ${error.message}`);
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
return wrappedTask;
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Create the queue with custom hooks
|
|
157
|
+
expressQueue.createQueue('images', {
|
|
158
|
+
concurrency: 3,
|
|
159
|
+
retryAttempts: 2,
|
|
160
|
+
retryDelay: 1000
|
|
161
|
+
}, imageHooks);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Error Handling and Retries
|
|
165
|
+
|
|
166
|
+
The queue system includes a robust mechanism for handling errors:
|
|
167
|
+
|
|
168
|
+
### Retry Configuration
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
expressQueue.createQueue('reliable-processing', {
|
|
172
|
+
retryAttempts: 5, // Maximum number of retries
|
|
173
|
+
retryDelay: 2000 // Milliseconds to wait between retries
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Fallback Logic
|
|
178
|
+
|
|
179
|
+
When a task fails after all retries, the fallback logic executes:
|
|
180
|
+
|
|
181
|
+
```javascript
|
|
182
|
+
const hooks = new HookSystem();
|
|
183
|
+
|
|
184
|
+
hooks.addAction('queue_task_fallback', (queueName, task, error) => {
|
|
185
|
+
// Implement custom logic to handle failed tasks
|
|
186
|
+
console.log(`Definitively failed task:`, task.id);
|
|
187
|
+
console.log(`Error:`, error.message);
|
|
188
|
+
|
|
189
|
+
// For example, save to a database for manual processing
|
|
190
|
+
// or send an alert to the support team
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Advanced Usage
|
|
195
|
+
|
|
196
|
+
### Multiple Queues with Different Configurations
|
|
197
|
+
|
|
198
|
+
```javascript
|
|
199
|
+
// Image processing queue
|
|
200
|
+
expressQueue.createQueue('image-processing', {
|
|
201
|
+
concurrency: 3,
|
|
202
|
+
retryAttempts: 2,
|
|
203
|
+
retryDelay: 1000
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
// Email sending queue
|
|
207
|
+
expressQueue.createQueue('email-sending', {
|
|
208
|
+
concurrency: 2,
|
|
209
|
+
retryAttempts: 3,
|
|
210
|
+
retryDelay: 2000
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
// Payment processing queue
|
|
214
|
+
expressQueue.createQueue('payment-processing', {
|
|
215
|
+
concurrency: 1,
|
|
216
|
+
retryAttempts: 5,
|
|
217
|
+
retryDelay: 3000
|
|
218
|
+
});
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Task Priorities
|
|
222
|
+
|
|
223
|
+
Tasks can be assigned different priority levels:
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
// High priority task (priority 0)
|
|
227
|
+
expressQueue.addTask('image-processing', processImage, { filename: 'urgent.jpg' }, 0);
|
|
228
|
+
|
|
229
|
+
// Medium priority task (priority 5)
|
|
230
|
+
expressQueue.addTask('image-processing', processImage, { filename: 'normal.jpg' }, 5);
|
|
231
|
+
|
|
232
|
+
// Low priority task (priority 10)
|
|
233
|
+
expressQueue.addTask('image-processing', processImage, { filename: 'optional.jpg' }, 10);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Queue Management via API
|
|
237
|
+
|
|
238
|
+
```javascript
|
|
239
|
+
// Pause a queue
|
|
240
|
+
app.post('/pause-queue/:queueName', (req, res) => {
|
|
241
|
+
const { queueName } = req.params;
|
|
242
|
+
expressQueue.pauseQueue(queueName);
|
|
243
|
+
res.json({ message: `Queue ${queueName} paused` });
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
// Resume a queue
|
|
247
|
+
app.post('/resume-queue/:queueName', (req, res) => {
|
|
248
|
+
const { queueName } = req.params;
|
|
249
|
+
expressQueue.resumeQueue(queueName);
|
|
250
|
+
res.json({ message: `Queue ${queueName} resumed` });
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Clear a queue
|
|
254
|
+
app.post('/clear-queue/:queueName', (req, res) => {
|
|
255
|
+
const { queueName } = req.params;
|
|
256
|
+
expressQueue.clearQueue(queueName);
|
|
257
|
+
res.json({ message: `Queue ${queueName} cleared` });
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Retry failed tasks
|
|
261
|
+
app.post('/retry-failed/:queueName', (req, res) => {
|
|
262
|
+
const { queueName } = req.params;
|
|
263
|
+
expressQueue.retryFailedTasks(queueName);
|
|
264
|
+
res.json({ message: `Retrying failed tasks in queue ${queueName}` });
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## API
|
|
269
|
+
|
|
270
|
+
### ExpressQueueIntegration
|
|
271
|
+
|
|
272
|
+
#### constructor(options = {})
|
|
273
|
+
|
|
274
|
+
- `options.concurrency`: Default number of concurrent workers (default: 1)
|
|
275
|
+
- `options.retryAttempts`: Default number of retries (default: 3)
|
|
276
|
+
- `options.retryDelay`: Default delay between retries in ms (default: 1000)
|
|
277
|
+
|
|
278
|
+
#### createQueue(queueName, options = {}, hooks = null)
|
|
279
|
+
|
|
280
|
+
Creates a queue with the specified configuration.
|
|
281
|
+
|
|
282
|
+
- `queueName`: Name of the queue
|
|
283
|
+
- `options.concurrency`: Number of concurrent workers
|
|
284
|
+
- `options.retryAttempts`: Number of retries
|
|
285
|
+
- `options.retryDelay`: Delay between retries in ms
|
|
286
|
+
- `hooks`: Hook system for this queue
|
|
287
|
+
|
|
288
|
+
#### addTask(queueName, task, data = {}, priority = 0)
|
|
289
|
+
|
|
290
|
+
Adds a task to the specified queue.
|
|
291
|
+
|
|
292
|
+
- `queueName`: Name of the queue
|
|
293
|
+
- `task`: Function representing the task
|
|
294
|
+
- `data`: Data for the task
|
|
295
|
+
- `priority`: Task priority (lower number = higher priority)
|
|
296
|
+
|
|
297
|
+
#### start()
|
|
298
|
+
|
|
299
|
+
Starts task execution in all queues.
|
|
300
|
+
|
|
301
|
+
#### stop()
|
|
302
|
+
|
|
303
|
+
Stops task execution in all queues.
|
|
304
|
+
|
|
305
|
+
#### getStatus()
|
|
306
|
+
|
|
307
|
+
Gets the current status of the queue system.
|
|
308
|
+
|
|
309
|
+
#### retryFailedTasks(queueName)
|
|
310
|
+
|
|
311
|
+
Retries all failed tasks in the specified queue.
|
|
312
|
+
|
|
313
|
+
#### queueMiddleware()
|
|
314
|
+
|
|
315
|
+
Middleware to inject the queue system into Express requests.
|
|
316
|
+
|
|
317
|
+
#### pauseQueue(queueName)
|
|
318
|
+
|
|
319
|
+
Pauses the specified queue.
|
|
320
|
+
|
|
321
|
+
#### resumeQueue(queueName)
|
|
322
|
+
|
|
323
|
+
Resumes the specified queue.
|
|
324
|
+
|
|
325
|
+
#### clearQueue(queueName)
|
|
326
|
+
|
|
327
|
+
Clears pending tasks from the specified queue.
|
|
328
|
+
|
|
329
|
+
## Repository
|
|
330
|
+
|
|
331
|
+
Source code available at: https://gitlab.com/bytedogssyndicate1/express-queued
|
|
332
|
+
|
|
333
|
+
## License
|
|
334
|
+
|
|
335
|
+
Apache 2.0
|