@unieojs/unieo 0.1.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/LICENSE +21 -0
- package/README.md +586 -0
- package/dist/cjs/Route.d.ts +21 -0
- package/dist/cjs/Route.d.ts.map +1 -0
- package/dist/cjs/Route.js +60 -0
- package/dist/cjs/Route.js.map +1 -0
- package/dist/cjs/common/Enum.d.ts +158 -0
- package/dist/cjs/common/Enum.d.ts.map +1 -0
- package/dist/cjs/common/Enum.js +222 -0
- package/dist/cjs/common/Enum.js.map +1 -0
- package/dist/cjs/common/Error/Base.d.ts +18 -0
- package/dist/cjs/common/Error/Base.d.ts.map +1 -0
- package/dist/cjs/common/Error/Base.js +25 -0
- package/dist/cjs/common/Error/Base.js.map +1 -0
- package/dist/cjs/common/Error/index.d.ts +59 -0
- package/dist/cjs/common/Error/index.d.ts.map +1 -0
- package/dist/cjs/common/Error/index.js +312 -0
- package/dist/cjs/common/Error/index.js.map +1 -0
- package/dist/cjs/common/constants.d.ts +2 -0
- package/dist/cjs/common/constants.d.ts.map +1 -0
- package/dist/cjs/common/constants.js +5 -0
- package/dist/cjs/common/constants.js.map +1 -0
- package/dist/cjs/core/ERPerformance.d.ts +30 -0
- package/dist/cjs/core/ERPerformance.d.ts.map +1 -0
- package/dist/cjs/core/ERPerformance.js +77 -0
- package/dist/cjs/core/ERPerformance.js.map +1 -0
- package/dist/cjs/core/Fetch.d.ts +9 -0
- package/dist/cjs/core/Fetch.d.ts.map +1 -0
- package/dist/cjs/core/Fetch.js +76 -0
- package/dist/cjs/core/Fetch.js.map +1 -0
- package/dist/cjs/core/Match.d.ts +35 -0
- package/dist/cjs/core/Match.d.ts.map +1 -0
- package/dist/cjs/core/Match.js +158 -0
- package/dist/cjs/core/Match.js.map +1 -0
- package/dist/cjs/core/Processor.d.ts +28 -0
- package/dist/cjs/core/Processor.d.ts.map +1 -0
- package/dist/cjs/core/Processor.js +3 -0
- package/dist/cjs/core/Processor.js.map +1 -0
- package/dist/cjs/core/Redirect.d.ts +17 -0
- package/dist/cjs/core/Redirect.d.ts.map +1 -0
- package/dist/cjs/core/Redirect.js +30 -0
- package/dist/cjs/core/Redirect.js.map +1 -0
- package/dist/cjs/core/RequestRewrite.d.ts +31 -0
- package/dist/cjs/core/RequestRewrite.d.ts.map +1 -0
- package/dist/cjs/core/RequestRewrite.js +201 -0
- package/dist/cjs/core/RequestRewrite.js.map +1 -0
- package/dist/cjs/core/ResponseRewrite.d.ts +26 -0
- package/dist/cjs/core/ResponseRewrite.d.ts.map +1 -0
- package/dist/cjs/core/ResponseRewrite.js +55 -0
- package/dist/cjs/core/ResponseRewrite.js.map +1 -0
- package/dist/cjs/core/RouteConfig.d.ts +21 -0
- package/dist/cjs/core/RouteConfig.d.ts.map +1 -0
- package/dist/cjs/core/RouteConfig.js +3 -0
- package/dist/cjs/core/RouteConfig.js.map +1 -0
- package/dist/cjs/core/RouteContext.d.ts +55 -0
- package/dist/cjs/core/RouteContext.d.ts.map +1 -0
- package/dist/cjs/core/RouteContext.js +199 -0
- package/dist/cjs/core/RouteContext.js.map +1 -0
- package/dist/cjs/core/Value/SourceProcessor.d.ts +47 -0
- package/dist/cjs/core/Value/SourceProcessor.d.ts.map +1 -0
- package/dist/cjs/core/Value/SourceProcessor.js +121 -0
- package/dist/cjs/core/Value/SourceProcessor.js.map +1 -0
- package/dist/cjs/core/Value/SourceProcessorManager.d.ts +7 -0
- package/dist/cjs/core/Value/SourceProcessorManager.d.ts.map +1 -0
- package/dist/cjs/core/Value/SourceProcessorManager.js +33 -0
- package/dist/cjs/core/Value/SourceProcessorManager.js.map +1 -0
- package/dist/cjs/core/Value/ValueProcessor.d.ts +25 -0
- package/dist/cjs/core/Value/ValueProcessor.d.ts.map +1 -0
- package/dist/cjs/core/Value/ValueProcessor.js +57 -0
- package/dist/cjs/core/Value/ValueProcessor.js.map +1 -0
- package/dist/cjs/core/Value/ValueProcessorManager.d.ts +8 -0
- package/dist/cjs/core/Value/ValueProcessorManager.d.ts.map +1 -0
- package/dist/cjs/core/Value/ValueProcessorManager.js +28 -0
- package/dist/cjs/core/Value/ValueProcessorManager.js.map +1 -0
- package/dist/cjs/core/Value/index.d.ts +35 -0
- package/dist/cjs/core/Value/index.d.ts.map +1 -0
- package/dist/cjs/core/Value/index.js +57 -0
- package/dist/cjs/core/Value/index.js.map +1 -0
- package/dist/cjs/core/index.d.ts +9 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +25 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/executor/GroupExecutor.d.ts +29 -0
- package/dist/cjs/executor/GroupExecutor.d.ts.map +1 -0
- package/dist/cjs/executor/GroupExecutor.js +174 -0
- package/dist/cjs/executor/GroupExecutor.js.map +1 -0
- package/dist/cjs/executor/RouteExecutor.d.ts +26 -0
- package/dist/cjs/executor/RouteExecutor.d.ts.map +1 -0
- package/dist/cjs/executor/RouteExecutor.js +71 -0
- package/dist/cjs/executor/RouteExecutor.js.map +1 -0
- package/dist/cjs/executor/SubExecutor.d.ts +20 -0
- package/dist/cjs/executor/SubExecutor.d.ts.map +1 -0
- package/dist/cjs/executor/SubExecutor.js +127 -0
- package/dist/cjs/executor/SubExecutor.js.map +1 -0
- package/dist/cjs/executor/enum.d.ts +5 -0
- package/dist/cjs/executor/enum.d.ts.map +1 -0
- package/dist/cjs/executor/enum.js +9 -0
- package/dist/cjs/executor/enum.js.map +1 -0
- package/dist/cjs/executor/index.d.ts +5 -0
- package/dist/cjs/executor/index.d.ts.map +1 -0
- package/dist/cjs/executor/index.js +21 -0
- package/dist/cjs/executor/index.js.map +1 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +22 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/middleware/DefaultFetch.d.ts +8 -0
- package/dist/cjs/middleware/DefaultFetch.d.ts.map +1 -0
- package/dist/cjs/middleware/DefaultFetch.js +36 -0
- package/dist/cjs/middleware/DefaultFetch.js.map +1 -0
- package/dist/cjs/middleware/ErrorFallback.d.ts +7 -0
- package/dist/cjs/middleware/ErrorFallback.d.ts.map +1 -0
- package/dist/cjs/middleware/ErrorFallback.js +30 -0
- package/dist/cjs/middleware/ErrorFallback.js.map +1 -0
- package/dist/cjs/middleware/index.d.ts +16 -0
- package/dist/cjs/middleware/index.d.ts.map +1 -0
- package/dist/cjs/middleware/index.js +119 -0
- package/dist/cjs/middleware/index.js.map +1 -0
- package/dist/cjs/middleware/types.d.ts +13 -0
- package/dist/cjs/middleware/types.d.ts.map +1 -0
- package/dist/cjs/middleware/types.js +3 -0
- package/dist/cjs/middleware/types.js.map +1 -0
- package/dist/cjs/processor/Factory.d.ts +19 -0
- package/dist/cjs/processor/Factory.d.ts.map +1 -0
- package/dist/cjs/processor/Factory.js +72 -0
- package/dist/cjs/processor/Factory.js.map +1 -0
- package/dist/cjs/processor/RouteProcessor.d.ts +13 -0
- package/dist/cjs/processor/RouteProcessor.d.ts.map +1 -0
- package/dist/cjs/processor/RouteProcessor.js +12 -0
- package/dist/cjs/processor/RouteProcessor.js.map +1 -0
- package/dist/cjs/processor/group/CommonGroupProcessor.d.ts +36 -0
- package/dist/cjs/processor/group/CommonGroupProcessor.d.ts.map +1 -0
- package/dist/cjs/processor/group/CommonGroupProcessor.js +41 -0
- package/dist/cjs/processor/group/CommonGroupProcessor.js.map +1 -0
- package/dist/cjs/processor/index.d.ts +4 -0
- package/dist/cjs/processor/index.d.ts.map +1 -0
- package/dist/cjs/processor/index.js +8 -0
- package/dist/cjs/processor/index.js.map +1 -0
- package/dist/cjs/processor/sub/CommonSubProcessor.d.ts +46 -0
- package/dist/cjs/processor/sub/CommonSubProcessor.d.ts.map +1 -0
- package/dist/cjs/processor/sub/CommonSubProcessor.js +68 -0
- package/dist/cjs/processor/sub/CommonSubProcessor.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/util/Array.d.ts +3 -0
- package/dist/cjs/util/Array.d.ts.map +1 -0
- package/dist/cjs/util/Array.js +15 -0
- package/dist/cjs/util/Array.js.map +1 -0
- package/dist/cjs/util/Header.d.ts +5 -0
- package/dist/cjs/util/Header.d.ts.map +1 -0
- package/dist/cjs/util/Header.js +87 -0
- package/dist/cjs/util/Header.js.map +1 -0
- package/dist/cjs/util/LogUtil.d.ts +2 -0
- package/dist/cjs/util/LogUtil.d.ts.map +1 -0
- package/dist/cjs/util/LogUtil.js +10 -0
- package/dist/cjs/util/LogUtil.js.map +1 -0
- package/dist/cjs/util/PathRegexp.d.ts +12 -0
- package/dist/cjs/util/PathRegexp.d.ts.map +1 -0
- package/dist/cjs/util/PathRegexp.js +74 -0
- package/dist/cjs/util/PathRegexp.js.map +1 -0
- package/dist/cjs/util/PrefixLogger.d.ts +13 -0
- package/dist/cjs/util/PrefixLogger.d.ts.map +1 -0
- package/dist/cjs/util/PrefixLogger.js +38 -0
- package/dist/cjs/util/PrefixLogger.js.map +1 -0
- package/dist/cjs/util/RedirectHelper.d.ts +29 -0
- package/dist/cjs/util/RedirectHelper.d.ts.map +1 -0
- package/dist/cjs/util/RedirectHelper.js +140 -0
- package/dist/cjs/util/RedirectHelper.js.map +1 -0
- package/dist/cjs/util/Request.d.ts +11 -0
- package/dist/cjs/util/Request.d.ts.map +1 -0
- package/dist/cjs/util/Request.js +25 -0
- package/dist/cjs/util/Request.js.map +1 -0
- package/dist/cjs/util/Response.d.ts +12 -0
- package/dist/cjs/util/Response.d.ts.map +1 -0
- package/dist/cjs/util/Response.js +31 -0
- package/dist/cjs/util/Response.js.map +1 -0
- package/dist/cjs/util/Template.d.ts +2 -0
- package/dist/cjs/util/Template.d.ts.map +1 -0
- package/dist/cjs/util/Template.js +14 -0
- package/dist/cjs/util/Template.js.map +1 -0
- package/dist/cjs/util/Url.d.ts +19 -0
- package/dist/cjs/util/Url.d.ts.map +1 -0
- package/dist/cjs/util/Url.js +112 -0
- package/dist/cjs/util/Url.js.map +1 -0
- package/dist/esm/Route.d.ts +21 -0
- package/dist/esm/Route.d.ts.map +1 -0
- package/dist/esm/Route.js +56 -0
- package/dist/esm/Route.js.map +1 -0
- package/dist/esm/common/Enum.d.ts +158 -0
- package/dist/esm/common/Enum.d.ts.map +1 -0
- package/dist/esm/common/Enum.js +219 -0
- package/dist/esm/common/Enum.js.map +1 -0
- package/dist/esm/common/Error/Base.d.ts +18 -0
- package/dist/esm/common/Error/Base.d.ts.map +1 -0
- package/dist/esm/common/Error/Base.js +21 -0
- package/dist/esm/common/Error/Base.js.map +1 -0
- package/dist/esm/common/Error/index.d.ts +59 -0
- package/dist/esm/common/Error/index.d.ts.map +1 -0
- package/dist/esm/common/Error/index.js +294 -0
- package/dist/esm/common/Error/index.js.map +1 -0
- package/dist/esm/common/constants.d.ts +2 -0
- package/dist/esm/common/constants.d.ts.map +1 -0
- package/dist/esm/common/constants.js +2 -0
- package/dist/esm/common/constants.js.map +1 -0
- package/dist/esm/core/ERPerformance.d.ts +30 -0
- package/dist/esm/core/ERPerformance.d.ts.map +1 -0
- package/dist/esm/core/ERPerformance.js +72 -0
- package/dist/esm/core/ERPerformance.js.map +1 -0
- package/dist/esm/core/Fetch.d.ts +9 -0
- package/dist/esm/core/Fetch.d.ts.map +1 -0
- package/dist/esm/core/Fetch.js +72 -0
- package/dist/esm/core/Fetch.js.map +1 -0
- package/dist/esm/core/Match.d.ts +35 -0
- package/dist/esm/core/Match.d.ts.map +1 -0
- package/dist/esm/core/Match.js +154 -0
- package/dist/esm/core/Match.js.map +1 -0
- package/dist/esm/core/Processor.d.ts +28 -0
- package/dist/esm/core/Processor.d.ts.map +1 -0
- package/dist/esm/core/Processor.js +2 -0
- package/dist/esm/core/Processor.js.map +1 -0
- package/dist/esm/core/Redirect.d.ts +17 -0
- package/dist/esm/core/Redirect.d.ts.map +1 -0
- package/dist/esm/core/Redirect.js +26 -0
- package/dist/esm/core/Redirect.js.map +1 -0
- package/dist/esm/core/RequestRewrite.d.ts +31 -0
- package/dist/esm/core/RequestRewrite.d.ts.map +1 -0
- package/dist/esm/core/RequestRewrite.js +194 -0
- package/dist/esm/core/RequestRewrite.js.map +1 -0
- package/dist/esm/core/ResponseRewrite.d.ts +26 -0
- package/dist/esm/core/ResponseRewrite.d.ts.map +1 -0
- package/dist/esm/core/ResponseRewrite.js +51 -0
- package/dist/esm/core/ResponseRewrite.js.map +1 -0
- package/dist/esm/core/RouteConfig.d.ts +21 -0
- package/dist/esm/core/RouteConfig.d.ts.map +1 -0
- package/dist/esm/core/RouteConfig.js +2 -0
- package/dist/esm/core/RouteConfig.js.map +1 -0
- package/dist/esm/core/RouteContext.d.ts +55 -0
- package/dist/esm/core/RouteContext.d.ts.map +1 -0
- package/dist/esm/core/RouteContext.js +195 -0
- package/dist/esm/core/RouteContext.js.map +1 -0
- package/dist/esm/core/Value/SourceProcessor.d.ts +47 -0
- package/dist/esm/core/Value/SourceProcessor.d.ts.map +1 -0
- package/dist/esm/core/Value/SourceProcessor.js +105 -0
- package/dist/esm/core/Value/SourceProcessor.js.map +1 -0
- package/dist/esm/core/Value/SourceProcessorManager.d.ts +7 -0
- package/dist/esm/core/Value/SourceProcessorManager.d.ts.map +1 -0
- package/dist/esm/core/Value/SourceProcessorManager.js +29 -0
- package/dist/esm/core/Value/SourceProcessorManager.js.map +1 -0
- package/dist/esm/core/Value/ValueProcessor.d.ts +25 -0
- package/dist/esm/core/Value/ValueProcessor.d.ts.map +1 -0
- package/dist/esm/core/Value/ValueProcessor.js +48 -0
- package/dist/esm/core/Value/ValueProcessor.js.map +1 -0
- package/dist/esm/core/Value/ValueProcessorManager.d.ts +8 -0
- package/dist/esm/core/Value/ValueProcessorManager.d.ts.map +1 -0
- package/dist/esm/core/Value/ValueProcessorManager.js +24 -0
- package/dist/esm/core/Value/ValueProcessorManager.js.map +1 -0
- package/dist/esm/core/Value/index.d.ts +35 -0
- package/dist/esm/core/Value/index.d.ts.map +1 -0
- package/dist/esm/core/Value/index.js +53 -0
- package/dist/esm/core/Value/index.js.map +1 -0
- package/dist/esm/core/index.d.ts +9 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +9 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/executor/GroupExecutor.d.ts +29 -0
- package/dist/esm/executor/GroupExecutor.d.ts.map +1 -0
- package/dist/esm/executor/GroupExecutor.js +170 -0
- package/dist/esm/executor/GroupExecutor.js.map +1 -0
- package/dist/esm/executor/RouteExecutor.d.ts +26 -0
- package/dist/esm/executor/RouteExecutor.d.ts.map +1 -0
- package/dist/esm/executor/RouteExecutor.js +67 -0
- package/dist/esm/executor/RouteExecutor.js.map +1 -0
- package/dist/esm/executor/SubExecutor.d.ts +20 -0
- package/dist/esm/executor/SubExecutor.d.ts.map +1 -0
- package/dist/esm/executor/SubExecutor.js +123 -0
- package/dist/esm/executor/SubExecutor.js.map +1 -0
- package/dist/esm/executor/enum.d.ts +5 -0
- package/dist/esm/executor/enum.d.ts.map +1 -0
- package/dist/esm/executor/enum.js +6 -0
- package/dist/esm/executor/enum.js.map +1 -0
- package/dist/esm/executor/index.d.ts +5 -0
- package/dist/esm/executor/index.d.ts.map +1 -0
- package/dist/esm/executor/index.js +5 -0
- package/dist/esm/executor/index.js.map +1 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/middleware/DefaultFetch.d.ts +8 -0
- package/dist/esm/middleware/DefaultFetch.d.ts.map +1 -0
- package/dist/esm/middleware/DefaultFetch.js +34 -0
- package/dist/esm/middleware/DefaultFetch.js.map +1 -0
- package/dist/esm/middleware/ErrorFallback.d.ts +7 -0
- package/dist/esm/middleware/ErrorFallback.d.ts.map +1 -0
- package/dist/esm/middleware/ErrorFallback.js +28 -0
- package/dist/esm/middleware/ErrorFallback.js.map +1 -0
- package/dist/esm/middleware/index.d.ts +16 -0
- package/dist/esm/middleware/index.d.ts.map +1 -0
- package/dist/esm/middleware/index.js +112 -0
- package/dist/esm/middleware/index.js.map +1 -0
- package/dist/esm/middleware/types.d.ts +13 -0
- package/dist/esm/middleware/types.d.ts.map +1 -0
- package/dist/esm/middleware/types.js +2 -0
- package/dist/esm/middleware/types.js.map +1 -0
- package/dist/esm/processor/Factory.d.ts +19 -0
- package/dist/esm/processor/Factory.d.ts.map +1 -0
- package/dist/esm/processor/Factory.js +68 -0
- package/dist/esm/processor/Factory.js.map +1 -0
- package/dist/esm/processor/RouteProcessor.d.ts +13 -0
- package/dist/esm/processor/RouteProcessor.d.ts.map +1 -0
- package/dist/esm/processor/RouteProcessor.js +8 -0
- package/dist/esm/processor/RouteProcessor.js.map +1 -0
- package/dist/esm/processor/group/CommonGroupProcessor.d.ts +36 -0
- package/dist/esm/processor/group/CommonGroupProcessor.d.ts.map +1 -0
- package/dist/esm/processor/group/CommonGroupProcessor.js +37 -0
- package/dist/esm/processor/group/CommonGroupProcessor.js.map +1 -0
- package/dist/esm/processor/index.d.ts +4 -0
- package/dist/esm/processor/index.d.ts.map +1 -0
- package/dist/esm/processor/index.js +3 -0
- package/dist/esm/processor/index.js.map +1 -0
- package/dist/esm/processor/sub/CommonSubProcessor.d.ts +46 -0
- package/dist/esm/processor/sub/CommonSubProcessor.d.ts.map +1 -0
- package/dist/esm/processor/sub/CommonSubProcessor.js +64 -0
- package/dist/esm/processor/sub/CommonSubProcessor.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/util/Array.d.ts +3 -0
- package/dist/esm/util/Array.d.ts.map +1 -0
- package/dist/esm/util/Array.js +11 -0
- package/dist/esm/util/Array.js.map +1 -0
- package/dist/esm/util/Header.d.ts +5 -0
- package/dist/esm/util/Header.d.ts.map +1 -0
- package/dist/esm/util/Header.js +81 -0
- package/dist/esm/util/Header.js.map +1 -0
- package/dist/esm/util/LogUtil.d.ts +2 -0
- package/dist/esm/util/LogUtil.d.ts.map +1 -0
- package/dist/esm/util/LogUtil.js +7 -0
- package/dist/esm/util/LogUtil.js.map +1 -0
- package/dist/esm/util/PathRegexp.d.ts +12 -0
- package/dist/esm/util/PathRegexp.d.ts.map +1 -0
- package/dist/esm/util/PathRegexp.js +69 -0
- package/dist/esm/util/PathRegexp.js.map +1 -0
- package/dist/esm/util/PrefixLogger.d.ts +13 -0
- package/dist/esm/util/PrefixLogger.d.ts.map +1 -0
- package/dist/esm/util/PrefixLogger.js +34 -0
- package/dist/esm/util/PrefixLogger.js.map +1 -0
- package/dist/esm/util/RedirectHelper.d.ts +29 -0
- package/dist/esm/util/RedirectHelper.d.ts.map +1 -0
- package/dist/esm/util/RedirectHelper.js +136 -0
- package/dist/esm/util/RedirectHelper.js.map +1 -0
- package/dist/esm/util/Request.d.ts +11 -0
- package/dist/esm/util/Request.d.ts.map +1 -0
- package/dist/esm/util/Request.js +20 -0
- package/dist/esm/util/Request.js.map +1 -0
- package/dist/esm/util/Response.d.ts +12 -0
- package/dist/esm/util/Response.d.ts.map +1 -0
- package/dist/esm/util/Response.js +25 -0
- package/dist/esm/util/Response.js.map +1 -0
- package/dist/esm/util/Template.d.ts +2 -0
- package/dist/esm/util/Template.d.ts.map +1 -0
- package/dist/esm/util/Template.js +11 -0
- package/dist/esm/util/Template.js.map +1 -0
- package/dist/esm/util/Url.d.ts +19 -0
- package/dist/esm/util/Url.d.ts.map +1 -0
- package/dist/esm/util/Url.js +99 -0
- package/dist/esm/util/Url.js.map +1 -0
- package/package.json +69 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Unieo Team
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,586 @@
|
|
|
1
|
+
# π₯ Unieo
|
|
2
|
+
|
|
3
|
+
πͺπ» A powerful router core library for edge computing environments.
|
|
4
|
+
|
|
5
|
+
Unieo `[/juΛniΛoΚ/]` provides a flexible and extensible routing system designed specifically for edge runtimes. It is built with **WinterTC (Web-interoperable Server Runtimes Technical Committee) standards compliance**, ensuring seamless operation on any WinterTC-compliant web runtime, including Cloudflare Workers, Vercel Edge Functions, Aliyun EdgeRoutine, and other modern edge platforms.
|
|
6
|
+
|
|
7
|
+
## β¨ Features
|
|
8
|
+
|
|
9
|
+
- π **WinterTC Standards Compliance** - Compatible with Web-interoperable Server Runtimes Technical Committee standards, ensuring cross-platform compatibility
|
|
10
|
+
- π **High-performance routing** - Optimized for edge environments with minimal overhead
|
|
11
|
+
- π¦ **Universal runtime support** - Runs on any WinterTC-compliant runtime including Cloudflare Workers, Vercel Edge, Deno Deploy, Bun, Node.js, and more
|
|
12
|
+
- π οΈ **Extensible executor system** - Pluggable processor architecture for custom routing logic
|
|
13
|
+
- π§ **Middleware support** - Comprehensive middleware system for request/response transformation
|
|
14
|
+
- π― **Advanced matching** - Flexible matching system with multiple operators and conditions
|
|
15
|
+
- π **Request/Response rewriting** - Powerful URL, header, and content transformation capabilities
|
|
16
|
+
- π¦ **Conditional routing** - Route based on headers, cookies, device types, and more
|
|
17
|
+
|
|
18
|
+
## π₯ Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npm install unieo --save
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## πββοΈ Quick Start
|
|
25
|
+
|
|
26
|
+
> π§ **Simplifying in Progress** - The current route configuration schema is relatively complex. We are developing a more concise and intuitive routing API. Stay tuned! You'll be able to achieve the same functionality with much less code in the future.
|
|
27
|
+
|
|
28
|
+
### π‘ Basic Usage
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { Route } from 'unieo';
|
|
32
|
+
|
|
33
|
+
addEventListener('fetch', (event: FetchEvent) => {
|
|
34
|
+
// Create Route instance
|
|
35
|
+
const route = new Route({ event });
|
|
36
|
+
|
|
37
|
+
// Define routes configuration
|
|
38
|
+
const routes = [
|
|
39
|
+
{
|
|
40
|
+
name: 'api-routes',
|
|
41
|
+
type: 'api',
|
|
42
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
43
|
+
routes: [
|
|
44
|
+
{
|
|
45
|
+
name: 'health-check',
|
|
46
|
+
type: 'health',
|
|
47
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
48
|
+
meta: {
|
|
49
|
+
match: {
|
|
50
|
+
list: [
|
|
51
|
+
{
|
|
52
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
53
|
+
criteria: { source: '/health', sourceType: 'literal' },
|
|
54
|
+
operator: 'equal'
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
responseRewrites: [
|
|
59
|
+
{
|
|
60
|
+
type: 'header',
|
|
61
|
+
field: 'content-type',
|
|
62
|
+
value: { source: 'application/json', sourceType: 'literal' },
|
|
63
|
+
operation: 'set'
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
];
|
|
71
|
+
|
|
72
|
+
// Execute routes
|
|
73
|
+
const response = route.execute(routes);
|
|
74
|
+
|
|
75
|
+
// Respond
|
|
76
|
+
event.respondWith(response);
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## π¨ Use Cases
|
|
81
|
+
|
|
82
|
+
### π 1. API Gateway
|
|
83
|
+
|
|
84
|
+
Perfect for building API gateways that need request routing, authentication, and response transformation:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const apiGatewayRoutes = [
|
|
88
|
+
{
|
|
89
|
+
name: 'auth-group',
|
|
90
|
+
type: 'authentication',
|
|
91
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
92
|
+
routes: [
|
|
93
|
+
{
|
|
94
|
+
name: 'require-auth',
|
|
95
|
+
type: 'auth-check',
|
|
96
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
97
|
+
meta: {
|
|
98
|
+
match: {
|
|
99
|
+
list: [
|
|
100
|
+
{
|
|
101
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
102
|
+
criteria: { source: '^/api/private', sourceType: 'literal' },
|
|
103
|
+
operator: 'regexp'
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
requestRewrites: [
|
|
108
|
+
{
|
|
109
|
+
type: 'header',
|
|
110
|
+
field: 'x-auth-required',
|
|
111
|
+
value: { source: 'true', sourceType: 'literal' },
|
|
112
|
+
operation: 'set'
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### π 2. CDN Edge Logic
|
|
123
|
+
|
|
124
|
+
Implement sophisticated CDN logic with cache control and content optimization:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
const cdnRoutes = [
|
|
128
|
+
{
|
|
129
|
+
name: 'static-assets',
|
|
130
|
+
type: 'cdn',
|
|
131
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
132
|
+
routes: [
|
|
133
|
+
{
|
|
134
|
+
name: 'image-optimization',
|
|
135
|
+
type: 'image',
|
|
136
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
137
|
+
meta: {
|
|
138
|
+
match: {
|
|
139
|
+
list: [
|
|
140
|
+
{
|
|
141
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
142
|
+
criteria: { source: '\\.(jpg|jpeg|png|webp)$', sourceType: 'literal' },
|
|
143
|
+
operator: 'regexp'
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
requestRewrites: [
|
|
148
|
+
{
|
|
149
|
+
type: 'middleware',
|
|
150
|
+
value: {
|
|
151
|
+
source: [
|
|
152
|
+
['ImageOptimization', { quality: 80, format: 'webp' }],
|
|
153
|
+
['DefaultFetch', {}]
|
|
154
|
+
],
|
|
155
|
+
sourceType: 'literal'
|
|
156
|
+
},
|
|
157
|
+
operation: 'set'
|
|
158
|
+
}
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
];
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### π§ͺ 3. A/B Testing and Feature Flags
|
|
168
|
+
|
|
169
|
+
Implement dynamic A/B testing based on user characteristics:
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
const abTestingRoutes = [
|
|
173
|
+
{
|
|
174
|
+
name: 'feature-toggle',
|
|
175
|
+
type: 'ab-test',
|
|
176
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
177
|
+
routes: [
|
|
178
|
+
{
|
|
179
|
+
name: 'new-ui-test',
|
|
180
|
+
type: 'ui-variant',
|
|
181
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
182
|
+
meta: {
|
|
183
|
+
match: {
|
|
184
|
+
list: [
|
|
185
|
+
{
|
|
186
|
+
origin: { source: 'x-user-segment', sourceType: 'request_header' },
|
|
187
|
+
criteria: { source: 'beta', sourceType: 'literal' },
|
|
188
|
+
operator: 'equal'
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
192
|
+
criteria: { source: '/app', sourceType: 'literal' },
|
|
193
|
+
operator: 'prefix'
|
|
194
|
+
}
|
|
195
|
+
],
|
|
196
|
+
operator: 'and'
|
|
197
|
+
},
|
|
198
|
+
requestRewrites: [
|
|
199
|
+
{
|
|
200
|
+
type: 'url',
|
|
201
|
+
value: { source: '/app-beta', sourceType: 'literal' },
|
|
202
|
+
operation: 'set'
|
|
203
|
+
}
|
|
204
|
+
]
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
]
|
|
208
|
+
}
|
|
209
|
+
];
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### π± 4. Device-Based Routing
|
|
213
|
+
|
|
214
|
+
Route requests based on device characteristics for optimal user experience:
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
const deviceRoutes = [
|
|
218
|
+
{
|
|
219
|
+
name: 'device-routing',
|
|
220
|
+
type: 'responsive',
|
|
221
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
222
|
+
routes: [
|
|
223
|
+
{
|
|
224
|
+
name: 'mobile-optimization',
|
|
225
|
+
type: 'mobile',
|
|
226
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
227
|
+
meta: {
|
|
228
|
+
match: {
|
|
229
|
+
list: [
|
|
230
|
+
{
|
|
231
|
+
origin: { source: 'type', sourceType: 'device' },
|
|
232
|
+
criteria: { source: 'mobile', sourceType: 'literal' },
|
|
233
|
+
operator: 'equal'
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
},
|
|
237
|
+
requestRewrites: [
|
|
238
|
+
{
|
|
239
|
+
type: 'header',
|
|
240
|
+
field: 'x-mobile-optimized',
|
|
241
|
+
value: { source: 'true', sourceType: 'literal' },
|
|
242
|
+
operation: 'set'
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
}
|
|
249
|
+
];
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### π 5. Geographical Content Delivery
|
|
253
|
+
|
|
254
|
+
Serve localized content based on user location:
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
const geoRoutes = [
|
|
258
|
+
{
|
|
259
|
+
name: 'geo-routing',
|
|
260
|
+
type: 'localization',
|
|
261
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
262
|
+
routes: [
|
|
263
|
+
{
|
|
264
|
+
name: 'eu-compliance',
|
|
265
|
+
type: 'gdpr',
|
|
266
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
267
|
+
meta: {
|
|
268
|
+
match: {
|
|
269
|
+
list: [
|
|
270
|
+
{
|
|
271
|
+
origin: { source: 'country', sourceType: 'edge_info' },
|
|
272
|
+
criteria: { source: 'EU', sourceType: 'literal' },
|
|
273
|
+
operator: 'in'
|
|
274
|
+
}
|
|
275
|
+
]
|
|
276
|
+
},
|
|
277
|
+
responseRewrites: [
|
|
278
|
+
{
|
|
279
|
+
type: 'header',
|
|
280
|
+
field: 'x-privacy-policy',
|
|
281
|
+
value: { source: 'gdpr-compliant', sourceType: 'literal' },
|
|
282
|
+
operation: 'set'
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
];
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## βοΈ Advanced Configuration
|
|
293
|
+
|
|
294
|
+
### π Middleware Integration
|
|
295
|
+
|
|
296
|
+
Unieo supports a comprehensive middleware system with custom middleware registration:
|
|
297
|
+
|
|
298
|
+
#### π Creating Custom Middleware
|
|
299
|
+
|
|
300
|
+
First, create your custom middleware following the `MiddlewareGen` pattern:
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
import type { MiddlewareGen, BaseMiddlewareOption, RouteContext, MiddlewareNext } from 'unieo';
|
|
304
|
+
|
|
305
|
+
// Define your middleware options interface
|
|
306
|
+
interface AuthMiddlewareOption extends BaseMiddlewareOption {
|
|
307
|
+
secret: string;
|
|
308
|
+
headerName?: string;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
// Create the middleware generator
|
|
312
|
+
const AuthMiddleware: MiddlewareGen<AuthMiddlewareOption> = (opt) => {
|
|
313
|
+
return async (ctx: RouteContext, next: MiddlewareNext) => {
|
|
314
|
+
const { secret, headerName = 'authorization' } = opt;
|
|
315
|
+
|
|
316
|
+
// Get auth header from request
|
|
317
|
+
const authHeader = ctx.request.headers.get(headerName);
|
|
318
|
+
|
|
319
|
+
if (!authHeader || !authHeader.includes(secret)) {
|
|
320
|
+
// Set unauthorized response
|
|
321
|
+
const response = new Response('Unauthorized', {
|
|
322
|
+
status: 401,
|
|
323
|
+
headers: { 'content-type': 'text/plain' }
|
|
324
|
+
});
|
|
325
|
+
ctx.setResponse(response);
|
|
326
|
+
return; // Don't call next() to short-circuit the middleware chain
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// Add custom header to indicate auth success
|
|
330
|
+
ctx.request = new Request(ctx.request, {
|
|
331
|
+
headers: {
|
|
332
|
+
...Object.fromEntries(ctx.request.headers),
|
|
333
|
+
'x-auth-verified': 'true'
|
|
334
|
+
}
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
await next(); // Continue to next middleware
|
|
338
|
+
};
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
// Rate limiting middleware example
|
|
342
|
+
interface RateLimitMiddlewareOption extends BaseMiddlewareOption {
|
|
343
|
+
limit: number;
|
|
344
|
+
window: number; // in milliseconds
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
const RateLimitMiddleware: MiddlewareGen<RateLimitMiddlewareOption> = (opt) => {
|
|
348
|
+
const requestCounts = new Map<string, { count: number; resetTime: number }>();
|
|
349
|
+
|
|
350
|
+
return async (ctx: RouteContext, next: MiddlewareNext) => {
|
|
351
|
+
const { limit, window } = opt;
|
|
352
|
+
const clientIP = ctx.request.headers.get('cf-connecting-ip') || 'unknown';
|
|
353
|
+
const now = Date.now();
|
|
354
|
+
|
|
355
|
+
// Get or initialize request count for this IP
|
|
356
|
+
let clientData = requestCounts.get(clientIP);
|
|
357
|
+
if (!clientData || now > clientData.resetTime) {
|
|
358
|
+
clientData = { count: 0, resetTime: now + window };
|
|
359
|
+
requestCounts.set(clientIP, clientData);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
clientData.count++;
|
|
363
|
+
|
|
364
|
+
if (clientData.count > limit) {
|
|
365
|
+
const response = new Response('Rate limit exceeded', {
|
|
366
|
+
status: 429,
|
|
367
|
+
headers: {
|
|
368
|
+
'content-type': 'text/plain',
|
|
369
|
+
'retry-after': Math.ceil((clientData.resetTime - now) / 1000).toString()
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
ctx.setResponse(response);
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
await next();
|
|
377
|
+
};
|
|
378
|
+
};
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
#### π§ Registering Custom Middleware
|
|
382
|
+
|
|
383
|
+
Register your custom middleware when creating the Route instance:
|
|
384
|
+
|
|
385
|
+
```typescript
|
|
386
|
+
import { Route } from 'unieo';
|
|
387
|
+
|
|
388
|
+
const route = new Route({
|
|
389
|
+
event,
|
|
390
|
+
logger: console, // Custom logger
|
|
391
|
+
httpClient: { // Custom HTTP client
|
|
392
|
+
request: async (request, options) => {
|
|
393
|
+
// Custom fetch logic
|
|
394
|
+
return fetch(request, options);
|
|
395
|
+
}
|
|
396
|
+
},
|
|
397
|
+
// Register custom middleware
|
|
398
|
+
middlewares: [
|
|
399
|
+
['Auth', AuthMiddleware],
|
|
400
|
+
['RateLimit', RateLimitMiddleware],
|
|
401
|
+
// Add more custom middleware here
|
|
402
|
+
]
|
|
403
|
+
});
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
#### π Using Custom Middleware in Routes
|
|
407
|
+
|
|
408
|
+
Now you can use your custom middleware in route configurations:
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
// Routes with custom middleware configuration
|
|
412
|
+
const routesWithMiddleware = [
|
|
413
|
+
{
|
|
414
|
+
name: 'api-with-middleware',
|
|
415
|
+
type: 'api',
|
|
416
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
417
|
+
routes: [
|
|
418
|
+
{
|
|
419
|
+
name: 'protected-endpoint',
|
|
420
|
+
type: 'protected',
|
|
421
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
422
|
+
meta: {
|
|
423
|
+
requestRewrites: [
|
|
424
|
+
{
|
|
425
|
+
type: 'middleware',
|
|
426
|
+
value: {
|
|
427
|
+
source: [
|
|
428
|
+
['Auth', { secret: 'your-secret-key', headerName: 'x-api-key' }],
|
|
429
|
+
['RateLimit', { limit: 100, window: 60000 }], // 100 requests per minute
|
|
430
|
+
['DefaultFetch', {}] // Always include DefaultFetch as the last middleware
|
|
431
|
+
],
|
|
432
|
+
sourceType: 'literal'
|
|
433
|
+
},
|
|
434
|
+
operation: 'set'
|
|
435
|
+
}
|
|
436
|
+
]
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
];
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### π§ Complex Matching Logic
|
|
445
|
+
|
|
446
|
+
Create sophisticated matching conditions:
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
const complexRoutes = [
|
|
450
|
+
{
|
|
451
|
+
name: 'complex-matching',
|
|
452
|
+
type: 'advanced',
|
|
453
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
454
|
+
routes: [
|
|
455
|
+
{
|
|
456
|
+
name: 'multi-condition-route',
|
|
457
|
+
type: 'conditional',
|
|
458
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
459
|
+
meta: {
|
|
460
|
+
match: {
|
|
461
|
+
list: [
|
|
462
|
+
{
|
|
463
|
+
// Match specific user agent
|
|
464
|
+
origin: { source: 'user-agent', sourceType: 'request_header' },
|
|
465
|
+
criteria: { source: 'bot|crawler', sourceType: 'literal' },
|
|
466
|
+
operator: 'regexp'
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
// Match specific time range
|
|
470
|
+
origin: { source: 'hour', sourceType: 'edge_info' },
|
|
471
|
+
criteria: { source: '9', sourceType: 'literal' },
|
|
472
|
+
operator: 'gte'
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
// Match specific path
|
|
476
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
477
|
+
criteria: { source: '/api/', sourceType: 'literal' },
|
|
478
|
+
operator: 'prefix'
|
|
479
|
+
}
|
|
480
|
+
],
|
|
481
|
+
operator: 'and' // All conditions must match
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
];
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
## π Route Configuration Reference
|
|
491
|
+
|
|
492
|
+
### π GroupRouteConfig
|
|
493
|
+
|
|
494
|
+
```typescript
|
|
495
|
+
interface GroupRouteConfig {
|
|
496
|
+
name: string; // Unique identifier for the route group
|
|
497
|
+
type: string; // Route type for categorization
|
|
498
|
+
processor: GroupProcessorType; // Processor type to handle the group
|
|
499
|
+
routes: SubRouteConfig[]; // Array of sub-routes
|
|
500
|
+
status?: RouteStatus; // ONLINE | OFFLINE
|
|
501
|
+
meta?: object; // Additional metadata
|
|
502
|
+
args?: Record<string, unknown>; // Processor arguments
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### π SubRouteConfig
|
|
507
|
+
|
|
508
|
+
```typescript
|
|
509
|
+
interface SubRouteConfig {
|
|
510
|
+
name: string; // Unique identifier for the sub-route
|
|
511
|
+
type: string; // Route type for categorization
|
|
512
|
+
processor: SubProcessorType; // Processor type to handle the route
|
|
513
|
+
status?: RouteStatus; // ONLINE | OFFLINE
|
|
514
|
+
meta?: {
|
|
515
|
+
match?: MatchConfig; // Matching conditions
|
|
516
|
+
redirects?: RedirectConfig[]; // Redirect rules
|
|
517
|
+
requestRewrites?: RequestRewriteConfig[]; // Request modifications
|
|
518
|
+
responseRewrites?: ResponseRewriteConfig[]; // Response modifications
|
|
519
|
+
};
|
|
520
|
+
args?: Record<string, unknown>; // Processor arguments
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
## π§© Extending Unieo
|
|
525
|
+
|
|
526
|
+
**Note: The extension system is currently under development. π§ The following represents the planned architecture.**
|
|
527
|
+
|
|
528
|
+
### π§ Custom Processors
|
|
529
|
+
|
|
530
|
+
```typescript
|
|
531
|
+
// Custom Group Processor (planned)
|
|
532
|
+
class CustomGroupProcessor extends BaseGroupProcessor {
|
|
533
|
+
static processorType = 'CUSTOM_GROUP_PROCESSOR';
|
|
534
|
+
|
|
535
|
+
async checkMatch(): Promise<boolean> {
|
|
536
|
+
// Custom matching logic
|
|
537
|
+
return true;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Custom Sub Processor (planned)
|
|
542
|
+
class CustomSubProcessor extends BaseSubProcessor {
|
|
543
|
+
static processorType = 'CUSTOM_SUB_PROCESSOR';
|
|
544
|
+
|
|
545
|
+
async beforeRequest(): Promise<void> {
|
|
546
|
+
// Custom request processing
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
async beforeResponse(): Promise<void> {
|
|
550
|
+
// Custom response processing
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
### ποΈ Custom Route Class
|
|
556
|
+
|
|
557
|
+
```typescript
|
|
558
|
+
// Extended Route class (planned)
|
|
559
|
+
class CustomRoute extends Route {
|
|
560
|
+
constructor(data: RouteRawData) {
|
|
561
|
+
super(data);
|
|
562
|
+
// Register custom processors
|
|
563
|
+
this.registerCustomProcessors();
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
private registerCustomProcessors() {
|
|
567
|
+
// Registration logic (under development)
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
```
|
|
571
|
+
|
|
572
|
+
## π€ Contributing
|
|
573
|
+
|
|
574
|
+
We welcome contributions! π Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details on how to get started.
|
|
575
|
+
|
|
576
|
+
## π License
|
|
577
|
+
|
|
578
|
+
MIT License - see the [LICENSE](LICENSE) file for details.
|
|
579
|
+
|
|
580
|
+
## π Related Projects
|
|
581
|
+
|
|
582
|
+
- π [WinterTC](https://wintertc.org/) - Web-interoperable Server Runtimes Technical Committee standards
|
|
583
|
+
- π [Cloudflare Workers](https://workers.cloudflare.com/) - Deploy serverless code instantly across the globe
|
|
584
|
+
- β‘ [Vercel Edge Functions](https://vercel.com/docs/functions/edge-functions) - Edge-side server functions
|
|
585
|
+
- πΊοΈ [Aliyun EdgeRoutine](https://help.aliyun.com/zh/edge-security-acceleration/dcdn/user-guide/what-is-er) - Write JavaScript code and deploy and execute it on Alibaba Cloud points of presence (POPs) worldwide
|
|
586
|
+
- π£οΈ [path-to-regexp](https://github.com/pillarjs/path-to-regexp) - Express-style path matching
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RouteContext } from './core';
|
|
2
|
+
import { ERPerformance } from './core/ERPerformance';
|
|
3
|
+
import type { GroupRouteConfig } from './core';
|
|
4
|
+
import type { ERFetchEvent, HttpClient, ILogger } from './types';
|
|
5
|
+
import type { MiddlewareGen } from './middleware/types';
|
|
6
|
+
interface RouteRawData {
|
|
7
|
+
event: ERFetchEvent;
|
|
8
|
+
logger?: ILogger;
|
|
9
|
+
httpClient?: HttpClient;
|
|
10
|
+
performance?: ERPerformance;
|
|
11
|
+
middlewares?: [string, MiddlewareGen][];
|
|
12
|
+
}
|
|
13
|
+
export declare class Route {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(data: RouteRawData);
|
|
16
|
+
get ctx(): RouteContext;
|
|
17
|
+
private registerProcessor;
|
|
18
|
+
execute(routes: GroupRouteConfig[]): Promise<Response | undefined>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=Route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Route.d.ts","sourceRoot":"","sources":["../../src/Route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,UAAU,YAAY;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;CACzC;AAED,qBAAa,KAAK;;gBAIJ,IAAI,EAAE,YAAY;IAmB9B,IAAI,GAAG,iBAEN;IAED,OAAO,CAAC,iBAAiB;IAKnB,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE;CAQzC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _Route_ctx, _Route_processorFactory;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Route = void 0;
|
|
16
|
+
const core_1 = require("./core");
|
|
17
|
+
const Factory_1 = require("./processor/Factory");
|
|
18
|
+
const ERPerformance_1 = require("./core/ERPerformance");
|
|
19
|
+
const processor_1 = require("./processor");
|
|
20
|
+
const executor_1 = require("./executor");
|
|
21
|
+
class Route {
|
|
22
|
+
constructor(data) {
|
|
23
|
+
_Route_ctx.set(this, void 0);
|
|
24
|
+
_Route_processorFactory.set(this, void 0);
|
|
25
|
+
__classPrivateFieldSet(this, _Route_ctx, new core_1.RouteContext({
|
|
26
|
+
event: data.event,
|
|
27
|
+
request: data.event.request,
|
|
28
|
+
performance: data.performance ?? new ERPerformance_1.ERPerformance(),
|
|
29
|
+
middlewares: data.middlewares,
|
|
30
|
+
helper: {
|
|
31
|
+
logger: data.logger ?? console,
|
|
32
|
+
httpClient: data.httpClient ?? {
|
|
33
|
+
request: async (request, options) => {
|
|
34
|
+
return fetch(request, options);
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
}), "f");
|
|
39
|
+
__classPrivateFieldSet(this, _Route_processorFactory, new Factory_1.ProcessorFactory(this.ctx), "f");
|
|
40
|
+
this.registerProcessor();
|
|
41
|
+
}
|
|
42
|
+
get ctx() {
|
|
43
|
+
return __classPrivateFieldGet(this, _Route_ctx, "f");
|
|
44
|
+
}
|
|
45
|
+
registerProcessor() {
|
|
46
|
+
__classPrivateFieldGet(this, _Route_processorFactory, "f").registerGroupProcessor(processor_1.CommonGroupProcessor.processorType, processor_1.CommonGroupProcessor.create);
|
|
47
|
+
__classPrivateFieldGet(this, _Route_processorFactory, "f").registerSubProcessor(processor_1.CommonSubProcessor.processorType, processor_1.CommonSubProcessor.create);
|
|
48
|
+
}
|
|
49
|
+
async execute(routes) {
|
|
50
|
+
const processor = __classPrivateFieldGet(this, _Route_processorFactory, "f").createRouteProcessor(this.ctx, {
|
|
51
|
+
routes,
|
|
52
|
+
});
|
|
53
|
+
const executor = new executor_1.RouteExecutor(processor, { ctx: __classPrivateFieldGet(this, _Route_ctx, "f") });
|
|
54
|
+
await executor.execute();
|
|
55
|
+
return __classPrivateFieldGet(this, _Route_ctx, "f").response;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.Route = Route;
|
|
59
|
+
_Route_ctx = new WeakMap(), _Route_processorFactory = new WeakMap();
|
|
60
|
+
//# sourceMappingURL=Route.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Route.js","sourceRoot":"","sources":["../../src/Route.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,iCAAsC;AACtC,iDAAuD;AACvD,wDAAqD;AACrD,2CAAuE;AACvE,yCAA2C;AAa3C,MAAa,KAAK;IAIhB,YAAY,IAAkB;QAHrB,6BAAmB;QACnB,0CAAoC;QAG3C,uBAAA,IAAI,cAAQ,IAAI,mBAAY,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,6BAAa,EAAE;YACpD,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,MAAM,EAAE;gBACN,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;gBAC9B,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI;oBAC7B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;wBAClC,OAAO,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACjC,CAAC;iBACF;aACF;SACF,CAAC,MAAA,CAAC;QACH,uBAAA,IAAI,2BAAqB,IAAI,0BAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAA,CAAC;QACxD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,kBAAK,CAAC;IACnB,CAAC;IAEO,iBAAiB;QACvB,uBAAA,IAAI,+BAAkB,CAAC,sBAAsB,CAAC,gCAAoB,CAAC,aAAa,EAAE,gCAAoB,CAAC,MAAM,CAAC,CAAC;QAC/G,uBAAA,IAAI,+BAAkB,CAAC,oBAAoB,CAAC,8BAAkB,CAAC,aAAa,EAAE,8BAAkB,CAAC,MAAM,CAAC,CAAC;IAC3G,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAA0B;QACtC,MAAM,SAAS,GAAG,uBAAA,IAAI,+BAAkB,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE;YACtE,MAAM;SACP,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,wBAAa,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,uBAAA,IAAI,kBAAK,EAAE,CAAC,CAAC;QAClE,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO,uBAAA,IAAI,kBAAK,CAAC,QAAQ,CAAC;IAC5B,CAAC;CACF;AAxCD,sBAwCC"}
|