@unieojs/unieo 0.0.0-rc.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 +661 -0
- package/dist/cjs/Route.d.ts +21 -0
- package/dist/cjs/Route.d.ts.map +1 -0
- package/dist/cjs/Route.js +62 -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/CommonRouteExecutor.d.ts +17 -0
- package/dist/cjs/core/CommonRouteExecutor.d.ts.map +1 -0
- package/dist/cjs/core/CommonRouteExecutor.js +43 -0
- package/dist/cjs/core/CommonRouteExecutor.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/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 +200 -0
- package/dist/cjs/core/RouteContext.js.map +1 -0
- package/dist/cjs/core/executor/BaseExecutor.d.ts +32 -0
- package/dist/cjs/core/executor/BaseExecutor.d.ts.map +1 -0
- package/dist/cjs/core/executor/BaseExecutor.js +14 -0
- package/dist/cjs/core/executor/BaseExecutor.js.map +1 -0
- package/dist/cjs/core/executor/Factory.d.ts +18 -0
- package/dist/cjs/core/executor/Factory.d.ts.map +1 -0
- package/dist/cjs/core/executor/Factory.js +55 -0
- package/dist/cjs/core/executor/Factory.js.map +1 -0
- package/dist/cjs/core/executor/RouteExecutor.d.ts +12 -0
- package/dist/cjs/core/executor/RouteExecutor.d.ts.map +1 -0
- package/dist/cjs/core/executor/RouteExecutor.js +25 -0
- package/dist/cjs/core/executor/RouteExecutor.js.map +1 -0
- package/dist/cjs/core/executor/impl/RedirectExecutor.d.ts +14 -0
- package/dist/cjs/core/executor/impl/RedirectExecutor.d.ts.map +1 -0
- package/dist/cjs/core/executor/impl/RedirectExecutor.js +88 -0
- package/dist/cjs/core/executor/impl/RedirectExecutor.js.map +1 -0
- package/dist/cjs/core/executor/impl/RequestRewriteExecutor.d.ts +23 -0
- package/dist/cjs/core/executor/impl/RequestRewriteExecutor.d.ts.map +1 -0
- package/dist/cjs/core/executor/impl/RequestRewriteExecutor.js +104 -0
- package/dist/cjs/core/executor/impl/RequestRewriteExecutor.js.map +1 -0
- package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.d.ts +14 -0
- package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.d.ts.map +1 -0
- package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.js +94 -0
- package/dist/cjs/core/executor/impl/ResponseRewriteExecutor.js.map +1 -0
- package/dist/cjs/core/executor/index.d.ts +8 -0
- package/dist/cjs/core/executor/index.d.ts.map +1 -0
- package/dist/cjs/core/executor/index.js +16 -0
- package/dist/cjs/core/executor/index.js.map +1 -0
- package/dist/cjs/core/index.d.ts +10 -0
- package/dist/cjs/core/index.d.ts.map +1 -0
- package/dist/cjs/core/index.js +26 -0
- package/dist/cjs/core/index.js.map +1 -0
- package/dist/cjs/core/meta/BaseMeta.d.ts +20 -0
- package/dist/cjs/core/meta/BaseMeta.d.ts.map +1 -0
- package/dist/cjs/core/meta/BaseMeta.js +14 -0
- package/dist/cjs/core/meta/BaseMeta.js.map +1 -0
- package/dist/cjs/core/meta/Factory.d.ts +28 -0
- package/dist/cjs/core/meta/Factory.d.ts.map +1 -0
- package/dist/cjs/core/meta/Factory.js +63 -0
- package/dist/cjs/core/meta/Factory.js.map +1 -0
- package/dist/cjs/core/meta/enum.d.ts +6 -0
- package/dist/cjs/core/meta/enum.d.ts.map +1 -0
- package/dist/cjs/core/meta/enum.js +10 -0
- package/dist/cjs/core/meta/enum.js.map +1 -0
- package/dist/cjs/core/meta/impl/RedirectMeta.d.ts +18 -0
- package/dist/cjs/core/meta/impl/RedirectMeta.d.ts.map +1 -0
- package/dist/cjs/core/meta/impl/RedirectMeta.js +25 -0
- package/dist/cjs/core/meta/impl/RedirectMeta.js.map +1 -0
- package/dist/cjs/core/meta/impl/RequestRewriteMeta.d.ts +18 -0
- package/dist/cjs/core/meta/impl/RequestRewriteMeta.d.ts.map +1 -0
- package/dist/cjs/core/meta/impl/RequestRewriteMeta.js +22 -0
- package/dist/cjs/core/meta/impl/RequestRewriteMeta.js.map +1 -0
- package/dist/cjs/core/meta/impl/ResponseRewriteMeta.d.ts +18 -0
- package/dist/cjs/core/meta/impl/ResponseRewriteMeta.d.ts.map +1 -0
- package/dist/cjs/core/meta/impl/ResponseRewriteMeta.js +22 -0
- package/dist/cjs/core/meta/impl/ResponseRewriteMeta.js.map +1 -0
- package/dist/cjs/core/meta/index.d.ts +8 -0
- package/dist/cjs/core/meta/index.d.ts.map +1 -0
- package/dist/cjs/core/meta/index.js +16 -0
- package/dist/cjs/core/meta/index.js.map +1 -0
- package/dist/cjs/core/processor/BaseProcessor.d.ts +37 -0
- package/dist/cjs/core/processor/BaseProcessor.d.ts.map +1 -0
- package/dist/cjs/core/processor/BaseProcessor.js +28 -0
- package/dist/cjs/core/processor/BaseProcessor.js.map +1 -0
- package/dist/cjs/core/processor/Factory.d.ts +26 -0
- package/dist/cjs/core/processor/Factory.d.ts.map +1 -0
- package/dist/cjs/core/processor/Factory.js +70 -0
- package/dist/cjs/core/processor/Factory.js.map +1 -0
- package/dist/cjs/core/processor/GroupProcessor.d.ts +21 -0
- package/dist/cjs/core/processor/GroupProcessor.d.ts.map +1 -0
- package/dist/cjs/core/processor/GroupProcessor.js +23 -0
- package/dist/cjs/core/processor/GroupProcessor.js.map +1 -0
- package/dist/cjs/core/processor/RouteProcessor.d.ts +9 -0
- package/dist/cjs/core/processor/RouteProcessor.d.ts.map +1 -0
- package/dist/cjs/core/processor/RouteProcessor.js +10 -0
- package/dist/cjs/core/processor/RouteProcessor.js.map +1 -0
- package/dist/cjs/core/processor/SubProcessor.d.ts +25 -0
- package/dist/cjs/core/processor/SubProcessor.d.ts.map +1 -0
- package/dist/cjs/core/processor/SubProcessor.js +56 -0
- package/dist/cjs/core/processor/SubProcessor.js.map +1 -0
- package/dist/cjs/core/processor/index.d.ts +6 -0
- package/dist/cjs/core/processor/index.d.ts.map +1 -0
- package/dist/cjs/core/processor/index.js +22 -0
- package/dist/cjs/core/processor/index.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/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +20 -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/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 +58 -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/CommonRouteExecutor.d.ts +17 -0
- package/dist/esm/core/CommonRouteExecutor.d.ts.map +1 -0
- package/dist/esm/core/CommonRouteExecutor.js +39 -0
- package/dist/esm/core/CommonRouteExecutor.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/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 +196 -0
- package/dist/esm/core/RouteContext.js.map +1 -0
- package/dist/esm/core/executor/BaseExecutor.d.ts +32 -0
- package/dist/esm/core/executor/BaseExecutor.d.ts.map +1 -0
- package/dist/esm/core/executor/BaseExecutor.js +10 -0
- package/dist/esm/core/executor/BaseExecutor.js.map +1 -0
- package/dist/esm/core/executor/Factory.d.ts +18 -0
- package/dist/esm/core/executor/Factory.d.ts.map +1 -0
- package/dist/esm/core/executor/Factory.js +51 -0
- package/dist/esm/core/executor/Factory.js.map +1 -0
- package/dist/esm/core/executor/RouteExecutor.d.ts +12 -0
- package/dist/esm/core/executor/RouteExecutor.d.ts.map +1 -0
- package/dist/esm/core/executor/RouteExecutor.js +21 -0
- package/dist/esm/core/executor/RouteExecutor.js.map +1 -0
- package/dist/esm/core/executor/impl/RedirectExecutor.d.ts +14 -0
- package/dist/esm/core/executor/impl/RedirectExecutor.d.ts.map +1 -0
- package/dist/esm/core/executor/impl/RedirectExecutor.js +84 -0
- package/dist/esm/core/executor/impl/RedirectExecutor.js.map +1 -0
- package/dist/esm/core/executor/impl/RequestRewriteExecutor.d.ts +23 -0
- package/dist/esm/core/executor/impl/RequestRewriteExecutor.d.ts.map +1 -0
- package/dist/esm/core/executor/impl/RequestRewriteExecutor.js +100 -0
- package/dist/esm/core/executor/impl/RequestRewriteExecutor.js.map +1 -0
- package/dist/esm/core/executor/impl/ResponseRewriteExecutor.d.ts +14 -0
- package/dist/esm/core/executor/impl/ResponseRewriteExecutor.d.ts.map +1 -0
- package/dist/esm/core/executor/impl/ResponseRewriteExecutor.js +90 -0
- package/dist/esm/core/executor/impl/ResponseRewriteExecutor.js.map +1 -0
- package/dist/esm/core/executor/index.d.ts +8 -0
- package/dist/esm/core/executor/index.d.ts.map +1 -0
- package/dist/esm/core/executor/index.js +7 -0
- package/dist/esm/core/executor/index.js.map +1 -0
- package/dist/esm/core/index.d.ts +10 -0
- package/dist/esm/core/index.d.ts.map +1 -0
- package/dist/esm/core/index.js +10 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/meta/BaseMeta.d.ts +20 -0
- package/dist/esm/core/meta/BaseMeta.d.ts.map +1 -0
- package/dist/esm/core/meta/BaseMeta.js +10 -0
- package/dist/esm/core/meta/BaseMeta.js.map +1 -0
- package/dist/esm/core/meta/Factory.d.ts +28 -0
- package/dist/esm/core/meta/Factory.d.ts.map +1 -0
- package/dist/esm/core/meta/Factory.js +59 -0
- package/dist/esm/core/meta/Factory.js.map +1 -0
- package/dist/esm/core/meta/enum.d.ts +6 -0
- package/dist/esm/core/meta/enum.d.ts.map +1 -0
- package/dist/esm/core/meta/enum.js +7 -0
- package/dist/esm/core/meta/enum.js.map +1 -0
- package/dist/esm/core/meta/impl/RedirectMeta.d.ts +18 -0
- package/dist/esm/core/meta/impl/RedirectMeta.d.ts.map +1 -0
- package/dist/esm/core/meta/impl/RedirectMeta.js +21 -0
- package/dist/esm/core/meta/impl/RedirectMeta.js.map +1 -0
- package/dist/esm/core/meta/impl/RequestRewriteMeta.d.ts +18 -0
- package/dist/esm/core/meta/impl/RequestRewriteMeta.d.ts.map +1 -0
- package/dist/esm/core/meta/impl/RequestRewriteMeta.js +18 -0
- package/dist/esm/core/meta/impl/RequestRewriteMeta.js.map +1 -0
- package/dist/esm/core/meta/impl/ResponseRewriteMeta.d.ts +18 -0
- package/dist/esm/core/meta/impl/ResponseRewriteMeta.d.ts.map +1 -0
- package/dist/esm/core/meta/impl/ResponseRewriteMeta.js +18 -0
- package/dist/esm/core/meta/impl/ResponseRewriteMeta.js.map +1 -0
- package/dist/esm/core/meta/index.d.ts +8 -0
- package/dist/esm/core/meta/index.d.ts.map +1 -0
- package/dist/esm/core/meta/index.js +7 -0
- package/dist/esm/core/meta/index.js.map +1 -0
- package/dist/esm/core/processor/BaseProcessor.d.ts +37 -0
- package/dist/esm/core/processor/BaseProcessor.d.ts.map +1 -0
- package/dist/esm/core/processor/BaseProcessor.js +24 -0
- package/dist/esm/core/processor/BaseProcessor.js.map +1 -0
- package/dist/esm/core/processor/Factory.d.ts +26 -0
- package/dist/esm/core/processor/Factory.d.ts.map +1 -0
- package/dist/esm/core/processor/Factory.js +66 -0
- package/dist/esm/core/processor/Factory.js.map +1 -0
- package/dist/esm/core/processor/GroupProcessor.d.ts +21 -0
- package/dist/esm/core/processor/GroupProcessor.d.ts.map +1 -0
- package/dist/esm/core/processor/GroupProcessor.js +19 -0
- package/dist/esm/core/processor/GroupProcessor.js.map +1 -0
- package/dist/esm/core/processor/RouteProcessor.d.ts +9 -0
- package/dist/esm/core/processor/RouteProcessor.d.ts.map +1 -0
- package/dist/esm/core/processor/RouteProcessor.js +6 -0
- package/dist/esm/core/processor/RouteProcessor.js.map +1 -0
- package/dist/esm/core/processor/SubProcessor.d.ts +25 -0
- package/dist/esm/core/processor/SubProcessor.d.ts.map +1 -0
- package/dist/esm/core/processor/SubProcessor.js +52 -0
- package/dist/esm/core/processor/SubProcessor.js.map +1 -0
- package/dist/esm/core/processor/index.d.ts +6 -0
- package/dist/esm/core/processor/index.d.ts.map +1 -0
- package/dist/esm/core/processor/index.js +6 -0
- package/dist/esm/core/processor/index.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/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -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/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 +76 -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,661 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<h1>π₯ Unieo</h1>
|
|
3
|
+
π A schema-driven routing engine for edge computing environments.
|
|
4
|
+
</div>
|
|
5
|
+
<br>
|
|
6
|
+
|
|
7
|
+
Unieo `[/juΛniΛoΚ/]` brings code-free routing management to edge computing, with built-in **[WinterTC standards](https://wintertc.org/)** compliance for seamless deployment across Cloudflare Workers, Vercel Edge Functions, Aliyun EdgeRoutine, and other modern edge runtimes.
|
|
8
|
+
|
|
9
|
+
## π‘ Motivation
|
|
10
|
+
|
|
11
|
+
### π Understanding Edge Computing
|
|
12
|
+
|
|
13
|
+
Edge computing runs your code at data centers closest to your users, rather than in a single centralized location. This distributed approach delivers faster response times and better user experiences globally.
|
|
14
|
+
|
|
15
|
+
The Benefits:
|
|
16
|
+
- π Lower Latency - Users connect to nearby servers instead of distant ones
|
|
17
|
+
- π Global Scale - Deploy once and run everywhere automatically
|
|
18
|
+
- πͺ Improved Performance - Faster page loads and better user experience
|
|
19
|
+
|
|
20
|
+
Popular edge platforms include Cloudflare Workers, Vercel Edge Functions, and Aliyun EdgeRoutine.
|
|
21
|
+
|
|
22
|
+
### π― The Routing Challenge
|
|
23
|
+
|
|
24
|
+
Edge computing unlocks performance benefits, but introduces complexity in managing routing logic across distributed environments.
|
|
25
|
+
|
|
26
|
+
**Common Requirements:**
|
|
27
|
+
- π Serve localized content based on user geography
|
|
28
|
+
- π± Provide optimized experiences for different device types
|
|
29
|
+
- π Route premium users to enhanced features
|
|
30
|
+
- π§ͺ Implement A/B testing and feature flags
|
|
31
|
+
|
|
32
|
+
**The Traditional Problem:** Every routing change requires code modifications and redeployment across all edge locations.
|
|
33
|
+
|
|
34
|
+
### π‘ How Unieo Solves This
|
|
35
|
+
|
|
36
|
+
Unieo separates routing logic from application code through declarative configuration. Update routing rules instantly without touching your codebase.
|
|
37
|
+
|
|
38
|
+
**The Unieo Approach:**
|
|
39
|
+
```typescript
|
|
40
|
+
// Route users by geography
|
|
41
|
+
{
|
|
42
|
+
name: 'geo-routing',
|
|
43
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
44
|
+
meta: {
|
|
45
|
+
match: {
|
|
46
|
+
list: [{
|
|
47
|
+
origin: { source: 'country', sourceType: 'edge_info' },
|
|
48
|
+
criteria: { source: 'CN', sourceType: 'literal' },
|
|
49
|
+
operator: 'equal'
|
|
50
|
+
}]
|
|
51
|
+
},
|
|
52
|
+
requestRewrites: [{
|
|
53
|
+
type: 'url',
|
|
54
|
+
value: { source: '/zh/home', sourceType: 'literal' },
|
|
55
|
+
operation: 'set'
|
|
56
|
+
}]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Key Benefits:**
|
|
62
|
+
- π **Instant Updates** - Change routing rules without code deployment
|
|
63
|
+
- π **WinterTC Compliance** - Built on web standards for universal compatibility
|
|
64
|
+
- π― **Smart Routing** - Route based on location, device, headers, or custom criteria
|
|
65
|
+
- π§ **Schema-Driven** - Define complex logic through declarative configuration
|
|
66
|
+
- β‘ **Edge-Optimized** - Minimal overhead for maximum performance
|
|
67
|
+
|
|
68
|
+
This approach enables dynamic routing rule distribution across edge environments while seamlessly integrating with existing development and configuration platforms.
|
|
69
|
+
|
|
70
|
+
## π₯ Installation
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
npm install @unieojs/unieo --save
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## πββοΈ Quick Start
|
|
77
|
+
|
|
78
|
+
> [!WARNING]
|
|
79
|
+
> π§ **Development Notice**: Unieo is currently under active development, 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.
|
|
80
|
+
|
|
81
|
+
### π‘ Basic Usage
|
|
82
|
+
|
|
83
|
+
This example demonstrates a health check route that matches when the request URL path equals `/health` and rewrites the response header `content-type` to `application/json`:
|
|
84
|
+
|
|
85
|
+
- **Match condition**: `origin.source: 'path'` extracts the URL path, `criteria.source: '/health'` defines the target value, `operator: 'equal'` performs exact matching
|
|
86
|
+
- **Response rewrite**: Sets the `content-type` header to `application/json` when the route matches
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { Route } from 'unieo';
|
|
90
|
+
|
|
91
|
+
addEventListener('fetch', (event: FetchEvent) => {
|
|
92
|
+
// Create Route instance
|
|
93
|
+
const route = new Route({ event });
|
|
94
|
+
|
|
95
|
+
// Define routes configuration
|
|
96
|
+
const routes = [
|
|
97
|
+
{
|
|
98
|
+
name: 'api-routes',
|
|
99
|
+
type: 'api',
|
|
100
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
101
|
+
routes: [
|
|
102
|
+
{
|
|
103
|
+
name: 'health-check',
|
|
104
|
+
type: 'health',
|
|
105
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
106
|
+
meta: {
|
|
107
|
+
match: {
|
|
108
|
+
list: [
|
|
109
|
+
{
|
|
110
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
111
|
+
criteria: { source: '/health', sourceType: 'literal' },
|
|
112
|
+
operator: 'equal'
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
},
|
|
116
|
+
responseRewrites: [
|
|
117
|
+
{
|
|
118
|
+
type: 'header',
|
|
119
|
+
field: 'content-type',
|
|
120
|
+
value: { source: 'application/json', sourceType: 'literal' },
|
|
121
|
+
operation: 'set'
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
];
|
|
129
|
+
|
|
130
|
+
// Execute routes
|
|
131
|
+
const response = route.execute(routes);
|
|
132
|
+
|
|
133
|
+
// Respond
|
|
134
|
+
event.respondWith(response);
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## π¨ Real-World Examples
|
|
139
|
+
|
|
140
|
+
### π API Gateway
|
|
141
|
+
|
|
142
|
+
Perfect for building API gateways that need request routing, authentication, and response transformation:
|
|
143
|
+
|
|
144
|
+
- **Match logic**: Uses `operator: 'regexp'` to match paths starting with `/api/private` using the pattern `^/api/private`
|
|
145
|
+
- **Request rewrite**: Adds `x-auth-required: true` header to mark the request as requiring authentication
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
const apiGatewayRoutes = [
|
|
149
|
+
{
|
|
150
|
+
name: 'auth-group',
|
|
151
|
+
type: 'authentication',
|
|
152
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
153
|
+
routes: [
|
|
154
|
+
{
|
|
155
|
+
name: 'require-auth',
|
|
156
|
+
type: 'auth-check',
|
|
157
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
158
|
+
meta: {
|
|
159
|
+
match: {
|
|
160
|
+
list: [
|
|
161
|
+
{
|
|
162
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
163
|
+
criteria: { source: '^/api/private', sourceType: 'literal' },
|
|
164
|
+
operator: 'regexp'
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
},
|
|
168
|
+
requestRewrites: [
|
|
169
|
+
{
|
|
170
|
+
type: 'header',
|
|
171
|
+
field: 'x-auth-required',
|
|
172
|
+
value: { source: 'true', sourceType: 'literal' },
|
|
173
|
+
operation: 'set'
|
|
174
|
+
}
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
];
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### π CDN Edge Logic
|
|
184
|
+
|
|
185
|
+
Implement sophisticated CDN logic with cache control and content optimization:
|
|
186
|
+
|
|
187
|
+
- **Match logic**: Uses `operator: 'regexp'` with pattern `\\.(jpg|jpeg|png|webp)$` to match image file extensions
|
|
188
|
+
- **Middleware chain**: Applies `ImageOptimization` middleware with quality settings, followed by `DefaultFetch`
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
const cdnRoutes = [
|
|
192
|
+
{
|
|
193
|
+
name: 'static-assets',
|
|
194
|
+
type: 'cdn',
|
|
195
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
196
|
+
routes: [
|
|
197
|
+
{
|
|
198
|
+
name: 'image-optimization',
|
|
199
|
+
type: 'image',
|
|
200
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
201
|
+
meta: {
|
|
202
|
+
match: {
|
|
203
|
+
list: [
|
|
204
|
+
{
|
|
205
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
206
|
+
criteria: { source: '\\.(jpg|jpeg|png|webp)$', sourceType: 'literal' },
|
|
207
|
+
operator: 'regexp'
|
|
208
|
+
}
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
requestRewrites: [
|
|
212
|
+
{
|
|
213
|
+
type: 'middleware',
|
|
214
|
+
value: {
|
|
215
|
+
source: [
|
|
216
|
+
['ImageOptimization', { quality: 80, format: 'webp' }],
|
|
217
|
+
['DefaultFetch', {}]
|
|
218
|
+
],
|
|
219
|
+
sourceType: 'literal'
|
|
220
|
+
},
|
|
221
|
+
operation: 'set'
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
}
|
|
228
|
+
];
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### π§ͺ A/B Testing
|
|
232
|
+
|
|
233
|
+
Implement dynamic A/B testing based on user characteristics:
|
|
234
|
+
|
|
235
|
+
- **Match logic**: Combines two conditions with `operator: 'and'`:
|
|
236
|
+
- Checks `x-user-segment` header equals `beta`
|
|
237
|
+
- Checks URL path starts with `/app` using `operator: 'prefix'`
|
|
238
|
+
- **URL rewrite**: Redirects matching requests to `/app-beta` path
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
const abTestingRoutes = [
|
|
242
|
+
{
|
|
243
|
+
name: 'feature-toggle',
|
|
244
|
+
type: 'ab-test',
|
|
245
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
246
|
+
routes: [
|
|
247
|
+
{
|
|
248
|
+
name: 'new-ui-test',
|
|
249
|
+
type: 'ui-variant',
|
|
250
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
251
|
+
meta: {
|
|
252
|
+
match: {
|
|
253
|
+
list: [
|
|
254
|
+
{
|
|
255
|
+
origin: { source: 'x-user-segment', sourceType: 'request_header' },
|
|
256
|
+
criteria: { source: 'beta', sourceType: 'literal' },
|
|
257
|
+
operator: 'equal'
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
261
|
+
criteria: { source: '/app', sourceType: 'literal' },
|
|
262
|
+
operator: 'prefix'
|
|
263
|
+
}
|
|
264
|
+
],
|
|
265
|
+
operator: 'and'
|
|
266
|
+
},
|
|
267
|
+
requestRewrites: [
|
|
268
|
+
{
|
|
269
|
+
type: 'url',
|
|
270
|
+
value: { source: '/app-beta', sourceType: 'literal' },
|
|
271
|
+
operation: 'set'
|
|
272
|
+
}
|
|
273
|
+
]
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
]
|
|
277
|
+
}
|
|
278
|
+
];
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
### π± Device-Based Routing
|
|
282
|
+
|
|
283
|
+
Route requests based on device characteristics for optimal user experience:
|
|
284
|
+
|
|
285
|
+
- **Match logic**: Uses `sourceType: 'device'` with `source: 'type'` to detect device type, matches when equal to `mobile`
|
|
286
|
+
- **Request rewrite**: Adds `x-mobile-optimized: true` header for mobile-specific processing
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const deviceRoutes = [
|
|
290
|
+
{
|
|
291
|
+
name: 'device-routing',
|
|
292
|
+
type: 'responsive',
|
|
293
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
294
|
+
routes: [
|
|
295
|
+
{
|
|
296
|
+
name: 'mobile-optimization',
|
|
297
|
+
type: 'mobile',
|
|
298
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
299
|
+
meta: {
|
|
300
|
+
match: {
|
|
301
|
+
list: [
|
|
302
|
+
{
|
|
303
|
+
origin: { source: 'type', sourceType: 'device' },
|
|
304
|
+
criteria: { source: 'mobile', sourceType: 'literal' },
|
|
305
|
+
operator: 'equal'
|
|
306
|
+
}
|
|
307
|
+
]
|
|
308
|
+
},
|
|
309
|
+
requestRewrites: [
|
|
310
|
+
{
|
|
311
|
+
type: 'header',
|
|
312
|
+
field: 'x-mobile-optimized',
|
|
313
|
+
value: { source: 'true', sourceType: 'literal' },
|
|
314
|
+
operation: 'set'
|
|
315
|
+
}
|
|
316
|
+
]
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
}
|
|
321
|
+
];
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### π Geo-based Routing
|
|
325
|
+
|
|
326
|
+
Serve localized content based on user location:
|
|
327
|
+
|
|
328
|
+
- **Match logic**: Uses `sourceType: 'edge_info'` with `source: 'country'` to get user's country, checks if it's `in` the EU region
|
|
329
|
+
- **Response rewrite**: Sets `x-privacy-policy: gdpr-compliant` header for EU users
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
const geoRoutes = [
|
|
333
|
+
{
|
|
334
|
+
name: 'geo-routing',
|
|
335
|
+
type: 'localization',
|
|
336
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
337
|
+
routes: [
|
|
338
|
+
{
|
|
339
|
+
name: 'eu-compliance',
|
|
340
|
+
type: 'gdpr',
|
|
341
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
342
|
+
meta: {
|
|
343
|
+
match: {
|
|
344
|
+
list: [
|
|
345
|
+
{
|
|
346
|
+
origin: { source: 'country', sourceType: 'edge_info' },
|
|
347
|
+
criteria: { source: 'EU', sourceType: 'literal' },
|
|
348
|
+
operator: 'in'
|
|
349
|
+
}
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
responseRewrites: [
|
|
353
|
+
{
|
|
354
|
+
type: 'header',
|
|
355
|
+
field: 'x-privacy-policy',
|
|
356
|
+
value: { source: 'gdpr-compliant', sourceType: 'literal' },
|
|
357
|
+
operation: 'set'
|
|
358
|
+
}
|
|
359
|
+
]
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
]
|
|
363
|
+
}
|
|
364
|
+
];
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## βοΈ Advanced Configuration
|
|
368
|
+
|
|
369
|
+
### π Middleware Integration
|
|
370
|
+
|
|
371
|
+
Unieo supports a comprehensive middleware system with custom middleware registration:
|
|
372
|
+
|
|
373
|
+
#### π Creating Custom Middleware
|
|
374
|
+
|
|
375
|
+
First, create your custom middleware following the `MiddlewareGen` pattern:
|
|
376
|
+
|
|
377
|
+
```typescript
|
|
378
|
+
import type { MiddlewareGen, BaseMiddlewareOption, RouteContext, MiddlewareNext } from 'unieo';
|
|
379
|
+
|
|
380
|
+
// Define your middleware options interface
|
|
381
|
+
interface AuthMiddlewareOption extends BaseMiddlewareOption {
|
|
382
|
+
secret: string;
|
|
383
|
+
headerName?: string;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Create the middleware generator
|
|
387
|
+
const AuthMiddleware: MiddlewareGen<AuthMiddlewareOption> = (opt) => {
|
|
388
|
+
return async (ctx: RouteContext, next: MiddlewareNext) => {
|
|
389
|
+
const { secret, headerName = 'authorization' } = opt;
|
|
390
|
+
|
|
391
|
+
// Get auth header from request
|
|
392
|
+
const authHeader = ctx.request.headers.get(headerName);
|
|
393
|
+
|
|
394
|
+
if (!authHeader || !authHeader.includes(secret)) {
|
|
395
|
+
// Set unauthorized response
|
|
396
|
+
const response = new Response('Unauthorized', {
|
|
397
|
+
status: 401,
|
|
398
|
+
headers: { 'content-type': 'text/plain' }
|
|
399
|
+
});
|
|
400
|
+
ctx.setResponse(response);
|
|
401
|
+
return; // Don't call next() to short-circuit the middleware chain
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
// Add custom header to indicate auth success
|
|
405
|
+
ctx.request = new Request(ctx.request, {
|
|
406
|
+
headers: {
|
|
407
|
+
...Object.fromEntries(ctx.request.headers),
|
|
408
|
+
'x-auth-verified': 'true'
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
await next(); // Continue to next middleware
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
// Rate limiting middleware example
|
|
417
|
+
interface RateLimitMiddlewareOption extends BaseMiddlewareOption {
|
|
418
|
+
limit: number;
|
|
419
|
+
window: number; // in milliseconds
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
const RateLimitMiddleware: MiddlewareGen<RateLimitMiddlewareOption> = (opt) => {
|
|
423
|
+
const requestCounts = new Map<string, { count: number; resetTime: number }>();
|
|
424
|
+
|
|
425
|
+
return async (ctx: RouteContext, next: MiddlewareNext) => {
|
|
426
|
+
const { limit, window } = opt;
|
|
427
|
+
const clientIP = ctx.request.headers.get('cf-connecting-ip') || 'unknown';
|
|
428
|
+
const now = Date.now();
|
|
429
|
+
|
|
430
|
+
// Get or initialize request count for this IP
|
|
431
|
+
let clientData = requestCounts.get(clientIP);
|
|
432
|
+
if (!clientData || now > clientData.resetTime) {
|
|
433
|
+
clientData = { count: 0, resetTime: now + window };
|
|
434
|
+
requestCounts.set(clientIP, clientData);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
clientData.count++;
|
|
438
|
+
|
|
439
|
+
if (clientData.count > limit) {
|
|
440
|
+
const response = new Response('Rate limit exceeded', {
|
|
441
|
+
status: 429,
|
|
442
|
+
headers: {
|
|
443
|
+
'content-type': 'text/plain',
|
|
444
|
+
'retry-after': Math.ceil((clientData.resetTime - now) / 1000).toString()
|
|
445
|
+
}
|
|
446
|
+
});
|
|
447
|
+
ctx.setResponse(response);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
await next();
|
|
452
|
+
};
|
|
453
|
+
};
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
#### π§ Registering Custom Middleware
|
|
457
|
+
|
|
458
|
+
Register your custom middleware when creating the Route instance:
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
import { Route } from 'unieo';
|
|
462
|
+
|
|
463
|
+
const route = new Route({
|
|
464
|
+
event,
|
|
465
|
+
logger: console, // Custom logger
|
|
466
|
+
httpClient: { // Custom HTTP client
|
|
467
|
+
request: async (request, options) => {
|
|
468
|
+
// Custom fetch logic
|
|
469
|
+
return fetch(request, options);
|
|
470
|
+
}
|
|
471
|
+
},
|
|
472
|
+
// Register custom middleware
|
|
473
|
+
middlewares: [
|
|
474
|
+
['Auth', AuthMiddleware],
|
|
475
|
+
['RateLimit', RateLimitMiddleware],
|
|
476
|
+
// Add more custom middleware here
|
|
477
|
+
]
|
|
478
|
+
});
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
#### π Using Custom Middleware in Routes
|
|
482
|
+
|
|
483
|
+
Now you can use your custom middleware in route configurations:
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
// Routes with custom middleware configuration
|
|
487
|
+
const routesWithMiddleware = [
|
|
488
|
+
{
|
|
489
|
+
name: 'api-with-middleware',
|
|
490
|
+
type: 'api',
|
|
491
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
492
|
+
routes: [
|
|
493
|
+
{
|
|
494
|
+
name: 'protected-endpoint',
|
|
495
|
+
type: 'protected',
|
|
496
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
497
|
+
meta: {
|
|
498
|
+
requestRewrites: [
|
|
499
|
+
{
|
|
500
|
+
type: 'middleware',
|
|
501
|
+
value: {
|
|
502
|
+
source: [
|
|
503
|
+
['Auth', { secret: 'your-secret-key', headerName: 'x-api-key' }],
|
|
504
|
+
['RateLimit', { limit: 100, window: 60000 }], // 100 requests per minute
|
|
505
|
+
['DefaultFetch', {}] // Always include DefaultFetch as the last middleware
|
|
506
|
+
],
|
|
507
|
+
sourceType: 'literal'
|
|
508
|
+
},
|
|
509
|
+
operation: 'set'
|
|
510
|
+
}
|
|
511
|
+
]
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
]
|
|
515
|
+
}
|
|
516
|
+
];
|
|
517
|
+
```
|
|
518
|
+
|
|
519
|
+
### π§ Complex Matching Logic
|
|
520
|
+
|
|
521
|
+
Create sophisticated matching conditions:
|
|
522
|
+
|
|
523
|
+
```typescript
|
|
524
|
+
const complexRoutes = [
|
|
525
|
+
{
|
|
526
|
+
name: 'complex-matching',
|
|
527
|
+
type: 'advanced',
|
|
528
|
+
processor: 'COMMON_GROUP_PROCESSOR',
|
|
529
|
+
routes: [
|
|
530
|
+
{
|
|
531
|
+
name: 'multi-condition-route',
|
|
532
|
+
type: 'conditional',
|
|
533
|
+
processor: 'COMMON_SUB_PROCESSOR',
|
|
534
|
+
meta: {
|
|
535
|
+
match: {
|
|
536
|
+
list: [
|
|
537
|
+
{
|
|
538
|
+
// Match specific user agent
|
|
539
|
+
origin: { source: 'user-agent', sourceType: 'request_header' },
|
|
540
|
+
criteria: { source: 'bot|crawler', sourceType: 'literal' },
|
|
541
|
+
operator: 'regexp'
|
|
542
|
+
},
|
|
543
|
+
{
|
|
544
|
+
// Match specific time range
|
|
545
|
+
origin: { source: 'hour', sourceType: 'edge_info' },
|
|
546
|
+
criteria: { source: '9', sourceType: 'literal' },
|
|
547
|
+
operator: 'gte'
|
|
548
|
+
},
|
|
549
|
+
{
|
|
550
|
+
// Match specific path
|
|
551
|
+
origin: { source: 'path', sourceType: 'url' },
|
|
552
|
+
criteria: { source: '/api/', sourceType: 'literal' },
|
|
553
|
+
operator: 'prefix'
|
|
554
|
+
}
|
|
555
|
+
],
|
|
556
|
+
operator: 'and' // All conditions must match
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
]
|
|
561
|
+
}
|
|
562
|
+
];
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
## π Route Configuration Reference
|
|
566
|
+
|
|
567
|
+
### π GroupRouteConfig
|
|
568
|
+
|
|
569
|
+
```typescript
|
|
570
|
+
interface GroupRouteConfig {
|
|
571
|
+
name: string; // Unique identifier for the route group
|
|
572
|
+
type: string; // Route type for categorization
|
|
573
|
+
processor: GroupProcessorType; // Processor type to handle the group
|
|
574
|
+
routes: SubRouteConfig[]; // Array of sub-routes
|
|
575
|
+
status?: RouteStatus; // ONLINE | OFFLINE
|
|
576
|
+
meta?: object; // Additional metadata
|
|
577
|
+
args?: Record<string, unknown>; // Processor arguments
|
|
578
|
+
}
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### π SubRouteConfig
|
|
582
|
+
|
|
583
|
+
```typescript
|
|
584
|
+
interface SubRouteConfig {
|
|
585
|
+
name: string; // Unique identifier for the sub-route
|
|
586
|
+
type: string; // Route type for categorization
|
|
587
|
+
processor: SubProcessorType; // Processor type to handle the route
|
|
588
|
+
status?: RouteStatus; // ONLINE | OFFLINE
|
|
589
|
+
meta?: {
|
|
590
|
+
match?: MatchConfig; // Matching conditions
|
|
591
|
+
redirects?: RedirectConfig[]; // Redirect rules
|
|
592
|
+
requestRewrites?: RequestRewriteConfig[]; // Request modifications
|
|
593
|
+
responseRewrites?: ResponseRewriteConfig[]; // Response modifications
|
|
594
|
+
};
|
|
595
|
+
args?: Record<string, unknown>; // Processor arguments
|
|
596
|
+
}
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## π§© Extending Unieo
|
|
600
|
+
|
|
601
|
+
**Note: The extension system is currently under development. π§ The following represents the planned architecture.**
|
|
602
|
+
|
|
603
|
+
### π§ Custom Processors
|
|
604
|
+
|
|
605
|
+
```typescript
|
|
606
|
+
// Custom Group Processor (planned)
|
|
607
|
+
class CustomGroupProcessor extends BaseGroupProcessor {
|
|
608
|
+
static processorType = 'CUSTOM_GROUP_PROCESSOR';
|
|
609
|
+
|
|
610
|
+
async checkMatch(): Promise<boolean> {
|
|
611
|
+
// Custom matching logic
|
|
612
|
+
return true;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
// Custom Sub Processor (planned)
|
|
617
|
+
class CustomSubProcessor extends BaseSubProcessor {
|
|
618
|
+
static processorType = 'CUSTOM_SUB_PROCESSOR';
|
|
619
|
+
|
|
620
|
+
async beforeRequest(): Promise<void> {
|
|
621
|
+
// Custom request processing
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
async beforeResponse(): Promise<void> {
|
|
625
|
+
// Custom response processing
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### ποΈ Custom Route Class
|
|
631
|
+
|
|
632
|
+
```typescript
|
|
633
|
+
// Extended Route class (planned)
|
|
634
|
+
class CustomRoute extends Route {
|
|
635
|
+
constructor(data: RouteRawData) {
|
|
636
|
+
super(data);
|
|
637
|
+
// Register custom processors
|
|
638
|
+
this.registerCustomProcessors();
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
private registerCustomProcessors() {
|
|
642
|
+
// Registration logic (under development)
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
## π€ Contributing
|
|
648
|
+
|
|
649
|
+
We welcome contributions! π Please see our [Contributing Guide](.github/CONTRIBUTING.md) for details on how to get started.
|
|
650
|
+
|
|
651
|
+
## π License
|
|
652
|
+
|
|
653
|
+
MIT License - see the [LICENSE](LICENSE) file for details.
|
|
654
|
+
|
|
655
|
+
## π Related Projects
|
|
656
|
+
|
|
657
|
+
- π [WinterTC](https://wintertc.org/) - Web-interoperable Server Runtimes Technical Committee standards
|
|
658
|
+
- π [Cloudflare Workers](https://workers.cloudflare.com/) - Deploy serverless code instantly across the globe
|
|
659
|
+
- β‘ [Vercel Edge Functions](https://vercel.com/docs/functions/edge-functions) - Edge-side server functions
|
|
660
|
+
- πΊοΈ [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
|
|
661
|
+
- π£οΈ [path-to-regexp](https://github.com/pillarjs/path-to-regexp) - Express-style path matching
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { GroupRawRoute } from './core';
|
|
2
|
+
import { RouteContext } from './core';
|
|
3
|
+
import { ERPerformance } from './core/ERPerformance';
|
|
4
|
+
import type { ERFetchEvent, HttpClient, ILogger } from './types';
|
|
5
|
+
import type { MiddlewareGen } from './middleware';
|
|
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: GroupRawRoute[]): 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,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAoC,YAAY,EAAgB,MAAM,QAAQ,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlD,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,aAAa,EAAE;CAWtC"}
|