acrylblends 1.0.4 → 1.0.6
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/docs/framework/agents/index.md +7 -5
- package/lib/accept-CNNHu4Cf.js +193 -0
- package/lib/{accepts-XBuZPVRI.js → accepts-Btq83xPd.js} +1 -1
- package/lib/accepts.js +1 -1
- package/lib/acryl-base.js +1 -331
- package/lib/adapter-CaZ6FZUU.js +37 -0
- package/lib/adapter.js +1 -36
- package/lib/{app-BM0rTCp7.js → app-CQcGWjrk.js} +4 -4
- package/lib/app-base-CpRMZL4v.js +332 -0
- package/lib/{audit-D5z9uwOP.d.ts → audit-GcLtvNLV.d.ts} +4 -2
- package/lib/{base-NSN_SNv-.js → base-D_6kfOr-.js} +1 -1
- package/lib/basic-auth-C0HTRpXh.js +20 -0
- package/lib/basic-auth-DFLflXNe.js +95 -0
- package/lib/basic-auth.js +1 -94
- package/lib/bearer-auth-Cwxt-vgS.js +94 -0
- package/lib/bearer-auth.js +1 -93
- package/lib/body-D7f4e7w_.js +94 -0
- package/lib/body-limit-WmIjWRLt.js +66 -0
- package/lib/body-limit.js +1 -65
- package/lib/buffer-CkEOJCcY.js +51 -0
- package/lib/bun.js +3 -3
- package/lib/cache-B0bHH7s5.js +169 -0
- package/lib/cache.js +1 -168
- package/lib/{client-DDLXwhBo.js → client-BrMFnMEd.js} +1 -1
- package/lib/{client-modules-CLvWOjbd.js → client-modules-drj4mjhj.js} +4 -4
- package/lib/client.js +1 -1
- package/lib/color-COa3DplO.js +37 -0
- package/lib/combine-TWuGdcbC.js +137 -0
- package/lib/combine.js +1 -136
- package/lib/{components-cEW3ovK0.js → components-B2ka9Ax1.js} +4 -4
- package/lib/{components-JXVm45kK.js → components-PVXwaOaC.js} +2 -2
- package/lib/compress-BzWqsHF1.js +79 -0
- package/lib/compress-C-9vK4B2.d.ts +11 -0
- package/lib/compress-DCyrrQ5D.js +11 -0
- package/lib/compress.d.ts +1 -1
- package/lib/compress.js +2 -78
- package/lib/concurrent-DrF3d2c-.js +30 -0
- package/lib/conninfo-BCROmdnf.d.ts +11 -0
- package/lib/conninfo-CWJwieh4.js +19 -0
- package/lib/constants-CBSEudrb.js +7 -0
- package/lib/{context-DDO0cfuP.js → context-CkOh7Ygv.js} +2 -2
- package/lib/context-storage-iuPoI_CR.js +52 -0
- package/lib/context-storage.js +1 -51
- package/lib/cookie-B1LlkzOe.js +125 -0
- package/lib/cookie-BHIduy2T.js +82 -0
- package/lib/cookie.js +1 -81
- package/lib/cordis/db-sqlite.d.ts +1 -1
- package/lib/cordis/door.d.ts +99 -5
- package/lib/cordis/door.js +562 -20
- package/lib/cordis/inspect.js +4 -4
- package/lib/cordis/kv-db.d.ts +1 -1
- package/lib/cordis/kv-db.js +1 -1
- package/lib/cordis/kv-json.d.ts +1 -1
- package/lib/cordis/kv-json.js +1 -1
- package/lib/cordis/node-server.d.ts +1 -1
- package/lib/cordis/node-server.js +3 -116
- package/lib/cordis/router-http.js +2 -2
- package/lib/cordis/router.js +4 -4
- package/lib/cordis/state.js +7 -7
- package/lib/{core-CaY8XDZ6.js → core-BOu1jYua.js} +1 -1
- package/lib/cors-CbAQ-8qU.js +106 -0
- package/lib/cors.js +1 -105
- package/lib/crypto-iVP-N-tS.js +34 -0
- package/lib/csrf-DqqOZtgy.js +101 -0
- package/lib/csrf.js +1 -100
- package/lib/css-C5CPVMvM.js +134 -0
- package/lib/css.js +2 -133
- package/lib/db/sqlite.d.ts +1 -25
- package/lib/dev-CLgu-JRe.js +50 -0
- package/lib/dev.js +1 -49
- package/lib/dom-YjND9Jt3.js +74 -0
- package/lib/door/host.d.ts +2 -2
- package/lib/door/host.js +1 -1
- package/lib/door/page.d.ts +3 -1
- package/lib/door/page.js +2 -2
- package/lib/door/protocol.d.ts +1 -1
- package/lib/door/protocol.js +1 -212
- package/lib/encode-BhbNLrjp.js +33 -0
- package/lib/factory-CLdSf-xS.js +30 -0
- package/lib/factory.js +1 -29
- package/lib/handler-C0wZ0KwO.js +12 -0
- package/lib/helpers-BEjcdbgw.js +5 -0
- package/lib/{hooks-w72iLeFR.js → hooks-CfC07ri0.js} +1 -1
- package/lib/html-CgNa89xw.js +31 -0
- package/lib/html-DGExBFNg.js +103 -0
- package/lib/html.d.ts +2 -5
- package/lib/html.js +2 -30
- package/lib/http-exception-MjWkT89V.js +54 -0
- package/lib/http-exception.js +1 -53
- package/lib/index-dAzQsJG9.d.ts +6 -0
- package/lib/index.js +3 -3
- package/lib/ip-restriction-jKtKCRM_.js +166 -0
- package/lib/ip-restriction.js +1 -165
- package/lib/ipaddr-DCoIo528.js +238 -0
- package/lib/jsx/dom/client.js +1 -1
- package/lib/jsx/dom/jsx-dev-runtime.js +1 -1
- package/lib/jsx/dom/jsx-runtime.js +2 -1
- package/lib/jsx/dom/server.js +3 -3
- package/lib/jsx/dom.js +5 -73
- package/lib/jsx/jsx-dev-runtime.d.ts +2 -5
- package/lib/jsx/jsx-dev-runtime.js +2 -13
- package/lib/jsx/jsx-runtime.d.ts +2 -2
- package/lib/jsx/jsx-runtime.js +4 -4
- package/lib/jsx/streaming.js +1 -1
- package/lib/jsx-CUQgttxU.js +47 -0
- package/lib/jsx-dev-runtime-B4WTyq8r.js +14 -0
- package/lib/{jsx-dev-runtime-CWLRA2F3.js → jsx-dev-runtime-BLfA-EhI.js} +2 -2
- package/lib/jsx-dev-runtime-CGt4kNYr.d.ts +6 -0
- package/lib/jsx-renderer-CfifM4hT.js +99 -0
- package/lib/jsx-renderer.js +1 -98
- package/lib/jsx-runtime-COCRWBJ9.js +2 -0
- package/lib/jsx.js +5 -46
- package/lib/{jwk-LkzeoaU8.js → jwk-CDPpYQpD.js} +3 -3
- package/lib/jwk.js +1 -1
- package/lib/{jwt-BGJBw5AF.js → jwt-BXoIA2fQ.js} +2 -2
- package/lib/{jwt-CskdhEW9.js → jwt-lyS4Q3mT.js} +3 -3
- package/lib/jwt.js +2 -2
- package/lib/kv/db.d.ts +1 -10
- package/lib/kv/db.js +1 -56
- package/lib/kv/json.d.ts +1 -9
- package/lib/kv/json.js +1 -223
- package/lib/{language-D9a4zqvn.js → language-DeGRtLJt.js} +2 -2
- package/lib/language.js +1 -1
- package/lib/{linear-router-C3FPib6h.js → linear-router-CmZn_JLV.js} +2 -2
- package/lib/logger-Ckxu8diz.js +54 -0
- package/lib/logger.js +1 -53
- package/lib/loopback-only-BbasoF7R.js +90 -0
- package/lib/loopback-only.js +1 -89
- package/lib/method-not-allowed-TO2_hnfl.js +82 -0
- package/lib/method-not-allowed.js +1 -81
- package/lib/method-override-DnZKfJbV.js +103 -0
- package/lib/method-override.js +1 -102
- package/lib/middleware-BfG_fp8P.js +12 -0
- package/lib/mime-BnScXkQn.js +77 -0
- package/lib/mount-QkK_3NtJ.js +67 -0
- package/lib/mount.js +1 -66
- package/lib/node-server/conninfo.d.ts +1 -10
- package/lib/node-server/conninfo.js +1 -18
- package/lib/node-server/register.js +25 -2
- package/lib/node-server/serve-static.d.ts +1 -17
- package/lib/node-server/serve-static.js +1 -1
- package/lib/node-server.d.ts +2 -2
- package/lib/node-server.js +4 -4
- package/lib/open-BqK4D2Wn.d.ts +11 -0
- package/lib/open-But9E2rL.js +57 -0
- package/lib/open-CULVJgOc.d.ts +12 -0
- package/lib/open-Dp4sxspc.js +224 -0
- package/lib/open-T7kgbO2O.d.ts +27 -0
- package/lib/{pattern-router-HZxjDGEQ.js → pattern-router-CJBecJBd.js} +1 -1
- package/lib/powered-by-CXQNjNIX.js +24 -0
- package/lib/powered-by.js +1 -23
- package/lib/pretty-json-CeC1yvYt.js +39 -0
- package/lib/pretty-json.js +1 -38
- package/lib/{protocol-C37gPePD.d.ts → protocol-CR31M7K_.d.ts} +2 -0
- package/lib/protocol-Dt0AZBOz.js +213 -0
- package/lib/proxy-C2w_mH7k.js +121 -0
- package/lib/proxy.js +1 -120
- package/lib/quick.js +4 -4
- package/lib/{reg-exp-router-DC1R3qoY.js → reg-exp-router-C_WV84eV.js} +2 -2
- package/lib/request-DvMgGtlW.js +323 -0
- package/lib/request.js +1 -322
- package/lib/route-D8m-a2I1.js +126 -0
- package/lib/route.js +1 -125
- package/lib/router/linear-router.js +1 -1
- package/lib/router/pattern-router.js +1 -1
- package/lib/router/reg-exp-router.js +1 -1
- package/lib/router/smart-router.js +1 -1
- package/lib/router/trie-router.js +1 -1
- package/lib/router-Be_o6nFu.js +35 -0
- package/lib/router.js +1 -34
- package/lib/schema-validator-EK3cUUCt.js +22 -0
- package/lib/schema-validator.js +1 -21
- package/lib/{secure-headers-mP3j6Hm6.js → secure-headers-C5ZOcXqk.js} +1 -1
- package/lib/secure-headers.js +1 -1
- package/lib/serve-static-B7sqnftW.d.ts +18 -0
- package/lib/{serve-static-3uo_9rjF.js → serve-static-C1Nkj_xB.js} +2 -2
- package/lib/{serve-static-Cp5adzGo.js → serve-static-EiJf1zkO.js} +4 -4
- package/lib/serve-static.js +1 -1
- package/lib/{smart-router-C5CZ5XSM.js → smart-router-BjxkDQCE.js} +1 -1
- package/lib/{snapshot-text-BLz8nlSc.js → snapshot-text-CtQm3n8n.js} +23 -14
- package/lib/{src-dy3Fk9tA.js → src-BTBm4OPD.js} +6 -6
- package/lib/src-LX0E4ec4.js +117 -0
- package/lib/{ssg-BwjcA-Ge.js → ssg-BEl7MHqg.js} +5 -5
- package/lib/ssg.js +1 -1
- package/lib/stream-CzM_SHkq.js +88 -0
- package/lib/{streaming-DHST3Scg.js → streaming-BlDaph8U.js} +3 -3
- package/lib/streaming.js +1 -1
- package/lib/{test-websocket-D8WWqE5G.js → test-websocket-BLeEvybj.js} +2 -2
- package/lib/testing-BQx5T_UX.js +17 -0
- package/lib/testing.js +1 -16
- package/lib/timeout-FeqZ9A-0.js +42 -0
- package/lib/timeout.js +1 -41
- package/lib/tiny.js +2 -2
- package/lib/trailing-slash-DwTx-1sk.js +85 -0
- package/lib/trailing-slash.js +1 -84
- package/lib/{trie-router-CfFbapzL.js → trie-router-JydLKUa2.js} +2 -2
- package/lib/url-BPh4d6j-.js +197 -0
- package/lib/utils/accept.js +1 -192
- package/lib/utils/basic-auth.js +1 -19
- package/lib/utils/body.js +1 -93
- package/lib/utils/buffer.js +1 -50
- package/lib/utils/color.js +1 -36
- package/lib/utils/compress.d.ts +1 -10
- package/lib/utils/compress.js +1 -10
- package/lib/utils/concurrent.js +1 -29
- package/lib/utils/constants.js +1 -6
- package/lib/utils/cookie.js +1 -124
- package/lib/utils/crypto.js +1 -33
- package/lib/utils/encode.js +1 -32
- package/lib/utils/handler.js +1 -11
- package/lib/utils/html.js +1 -102
- package/lib/utils/ipaddr.js +1 -237
- package/lib/utils/jwt.js +1 -1
- package/lib/utils/mime.js +1 -76
- package/lib/utils/stream.js +1 -87
- package/lib/utils/url.js +1 -196
- package/lib/{validator-D84mq-dO.js → validator-Btiyt5VJ.js} +3 -3
- package/lib/validator.js +1 -1
- package/lib/websocket-DsyBIKVA.js +56 -0
- package/lib/ws.js +1 -55
- package/package.json +1 -1
- package/plugins/acryl-door/src/cli/acryl.ts +36 -5
- package/plugins/acryl-door/src/host/channel.ts +14 -6
- package/plugins/acryl-door/src/host/chat-tools.ts +2 -0
- package/plugins/acryl-door/src/host/door.ts +97 -12
- package/plugins/acryl-door/src/host/page-routes.ts +3 -1
- package/plugins/acryl-door/src/host/shell.ts +147 -0
- package/plugins/acryl-door/src/host/shim.ts +39 -3
- package/plugins/acryl-door/src/host/verbs.ts +39 -2
- package/plugins/acryl-door/src/index.ts +22 -3
- package/plugins/acryl-door/src/page/channel.ts +3 -1
- package/plugins/acryl-door/src/page/index.ts +2 -1
- package/plugins/acryl-door/src/page/protocol.ts +2 -0
- package/plugins/acryl-door/src/shell/protocol.ts +130 -0
- package/plugins/acryl-node-server/src/register.ts +29 -2
- package/plugins/agent/model.ts +6 -1
- package/plugins/agent/tools.ts +12 -2
- package/plugins/agent-panel/client/describe.ts +44 -0
- package/plugins/agent-panel/client/main.ts +4 -1
- package/plugins/agent-panel/headless.ts +29 -8
- package/plugins/agent-panel/index.ts +22 -10
- package/plugins/agent-panel/launch.ts +67 -0
- package/plugins/desktop/attach.ts +72 -0
- package/plugins/desktop/door-shell.ts +379 -0
- package/plugins/desktop/main.ts +82 -15
- package/plugins/extensions/index.ts +3 -4
- package/plugins/extensions/stage.ts +33 -5
- package/plugins/openai/index.ts +1 -1
- package/templates/agent/AGENTS.md +4 -0
- package/templates/agent/blend.yaml +4 -1
- package/templates/agent/src/app.ts +2 -0
- package/templates/agent/src/routes.ts +1 -1
- package/templates/agent/template.json +1 -0
- package/templates/agent/test/builder.test.ts +26 -21
- package/lib/helpers-CvTauQT5.js +0 -5
- package/lib/middleware-CPQ8himN.js +0 -12
- package/plugins/acryl-router/src/connection.d.ts +0 -25
- package/plugins/acryl-router/src/core/app-base.d.ts +0 -215
- package/plugins/acryl-router/src/core/app.d.ts +0 -19
- package/plugins/acryl-router/src/core/client/client.d.ts +0 -4
- package/plugins/acryl-router/src/core/client/fetch-result-please.d.ts +0 -35
- package/plugins/acryl-router/src/core/client/index.d.ts +0 -7
- package/plugins/acryl-router/src/core/client/types.d.ts +0 -229
- package/plugins/acryl-router/src/core/client/utils.d.ts +0 -18
- package/plugins/acryl-router/src/core/compose.d.ts +0 -14
- package/plugins/acryl-router/src/core/context.d.ts +0 -443
- package/plugins/acryl-router/src/core/helper/accepts/accepts.d.ts +0 -30
- package/plugins/acryl-router/src/core/helper/accepts/index.d.ts +0 -5
- package/plugins/acryl-router/src/core/helper/conninfo/index.d.ts +0 -5
- package/plugins/acryl-router/src/core/helper/conninfo/types.d.ts +0 -36
- package/plugins/acryl-router/src/core/helper/cookie/index.d.ts +0 -25
- package/plugins/acryl-router/src/core/helper/css/common.d.ts +0 -59
- package/plugins/acryl-router/src/core/helper/css/index.d.ts +0 -80
- package/plugins/acryl-router/src/core/helper/dev/index.d.ts +0 -20
- package/plugins/acryl-router/src/core/helper/factory/index.d.ts +0 -82
- package/plugins/acryl-router/src/core/helper/html/index.d.ts +0 -8
- package/plugins/acryl-router/src/core/helper/proxy/index.d.ts +0 -73
- package/plugins/acryl-router/src/core/helper/route/index.d.ts +0 -75
- package/plugins/acryl-router/src/core/helper/ssg/index.d.ts +0 -7
- package/plugins/acryl-router/src/core/helper/ssg/middleware.d.ts +0 -44
- package/plugins/acryl-router/src/core/helper/ssg/plugins.d.ts +0 -27
- package/plugins/acryl-router/src/core/helper/ssg/ssg.d.ts +0 -91
- package/plugins/acryl-router/src/core/helper/ssg/utils.d.ts +0 -16
- package/plugins/acryl-router/src/core/helper/streaming/index.d.ts +0 -8
- package/plugins/acryl-router/src/core/helper/streaming/sse.d.ts +0 -13
- package/plugins/acryl-router/src/core/helper/streaming/stream.d.ts +0 -3
- package/plugins/acryl-router/src/core/helper/streaming/text.d.ts +0 -3
- package/plugins/acryl-router/src/core/helper/streaming/utils.d.ts +0 -1
- package/plugins/acryl-router/src/core/helper/testing/index.d.ts +0 -13
- package/plugins/acryl-router/src/core/helper/websocket/index.d.ts +0 -70
- package/plugins/acryl-router/src/core/http-exception.d.ts +0 -58
- package/plugins/acryl-router/src/core/index.d.ts +0 -37
- package/plugins/acryl-router/src/core/jsx/base.d.ts +0 -61
- package/plugins/acryl-router/src/core/jsx/children.d.ts +0 -9
- package/plugins/acryl-router/src/core/jsx/components.d.ts +0 -15
- package/plugins/acryl-router/src/core/jsx/constants.d.ts +0 -6
- package/plugins/acryl-router/src/core/jsx/context.d.ts +0 -51
- package/plugins/acryl-router/src/core/jsx/dom/components.d.ts +0 -10
- package/plugins/acryl-router/src/core/jsx/dom/context.d.ts +0 -3
- package/plugins/acryl-router/src/core/jsx/dom/css.d.ts +0 -83
- package/plugins/acryl-router/src/core/jsx/dom/hooks/index.d.ts +0 -39
- package/plugins/acryl-router/src/core/jsx/dom/intrinsic-element/components.d.ts +0 -16
- package/plugins/acryl-router/src/core/jsx/dom/jsx-dev-runtime.d.ts +0 -8
- package/plugins/acryl-router/src/core/jsx/dom/jsx-runtime.d.ts +0 -7
- package/plugins/acryl-router/src/core/jsx/dom/render.d.ts +0 -73
- package/plugins/acryl-router/src/core/jsx/dom/utils.d.ts +0 -1
- package/plugins/acryl-router/src/core/jsx/hooks/index.d.ts +0 -47
- package/plugins/acryl-router/src/core/jsx/index.d.ts +0 -76
- package/plugins/acryl-router/src/core/jsx/intrinsic-element/common.d.ts +0 -6
- package/plugins/acryl-router/src/core/jsx/intrinsic-element/components.d.ts +0 -13
- package/plugins/acryl-router/src/core/jsx/intrinsic-elements.d.ts +0 -735
- package/plugins/acryl-router/src/core/jsx/streaming.d.ts +0 -36
- package/plugins/acryl-router/src/core/jsx/types.d.ts +0 -36
- package/plugins/acryl-router/src/core/jsx/utils.d.ts +0 -4
- package/plugins/acryl-router/src/core/request/constants.d.ts +0 -1
- package/plugins/acryl-router/src/core/request.d.ts +0 -306
- package/plugins/acryl-router/src/core/router/reg-exp-router/index.d.ts +0 -6
- package/plugins/acryl-router/src/core/router/reg-exp-router/matcher.d.ts +0 -7
- package/plugins/acryl-router/src/core/router/reg-exp-router/node.d.ts +0 -13
- package/plugins/acryl-router/src/core/router/reg-exp-router/prepared-router.d.ts +0 -17
- package/plugins/acryl-router/src/core/router/reg-exp-router/router.d.ts +0 -11
- package/plugins/acryl-router/src/core/router/reg-exp-router/trie.d.ts +0 -8
- package/plugins/acryl-router/src/core/router/smart-router/index.d.ts +0 -5
- package/plugins/acryl-router/src/core/router/smart-router/router.d.ts +0 -11
- package/plugins/acryl-router/src/core/router/trie-router/index.d.ts +0 -5
- package/plugins/acryl-router/src/core/router/trie-router/node.d.ts +0 -6
- package/plugins/acryl-router/src/core/router/trie-router/router.d.ts +0 -7
- package/plugins/acryl-router/src/core/router/utils.d.ts +0 -1
- package/plugins/acryl-router/src/core/router.d.ts +0 -97
- package/plugins/acryl-router/src/core/types.d.ts +0 -573
- package/plugins/acryl-router/src/core/utils/accept.d.ts +0 -6
- package/plugins/acryl-router/src/core/utils/body.d.ts +0 -79
- package/plugins/acryl-router/src/core/utils/buffer.d.ts +0 -17
- package/plugins/acryl-router/src/core/utils/color.d.ts +0 -21
- package/plugins/acryl-router/src/core/utils/concurrent.d.ts +0 -11
- package/plugins/acryl-router/src/core/utils/constants.d.ts +0 -4
- package/plugins/acryl-router/src/core/utils/cookie.d.ts +0 -41
- package/plugins/acryl-router/src/core/utils/crypto.d.ts +0 -15
- package/plugins/acryl-router/src/core/utils/handler.d.ts +0 -6
- package/plugins/acryl-router/src/core/utils/headers.d.ts +0 -8
- package/plugins/acryl-router/src/core/utils/html.d.ts +0 -44
- package/plugins/acryl-router/src/core/utils/http-status.d.ts +0 -32
- package/plugins/acryl-router/src/core/utils/mime.d.ts +0 -70
- package/plugins/acryl-router/src/core/utils/stream.d.ts +0 -31
- package/plugins/acryl-router/src/core/utils/types.d.ts +0 -128
- package/plugins/acryl-router/src/core/utils/url.d.ts +0 -44
- package/plugins/acryl-router/src/core/validator/index.d.ts +0 -7
- package/plugins/acryl-router/src/core/validator/utils.d.ts +0 -29
- package/plugins/acryl-router/src/core/validator/validator.d.ts +0 -16
- package/plugins/acryl-router/src/helpers/index.d.ts +0 -17
- package/plugins/acryl-router/src/helpers/schema-validator.d.ts +0 -54
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { t as HTTPException } from "./http-exception-MjWkT89V.js";
|
|
2
|
+
import { a as convertIPv6BinaryToString, i as convertIPv4ToBinary, l as isIPv4MappedIPv6, o as convertIPv6ToBinary, r as convertIPv4MappedIPv6ToIPv4, s as distinctRemoteAddr } from "./ipaddr-DCoIo528.js";
|
|
3
|
+
//#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.ts
|
|
4
|
+
const IS_CIDR_NOTATION_REGEX = /\/[^/]*$/;
|
|
5
|
+
const parseCidrPrefix = (rule, prefix, max) => {
|
|
6
|
+
if (!/^[0-9]{1,3}$/.test(prefix)) throw new TypeError(`Invalid rule: ${rule}`);
|
|
7
|
+
const parsedPrefix = parseInt(prefix);
|
|
8
|
+
if (parsedPrefix > max) throw new TypeError(`Invalid rule: ${rule}`);
|
|
9
|
+
return parsedPrefix;
|
|
10
|
+
};
|
|
11
|
+
const buildMatcher = (rules) => {
|
|
12
|
+
const functionRules = [];
|
|
13
|
+
const staticRules = /* @__PURE__ */ new Set();
|
|
14
|
+
const staticIPv4Rules = /* @__PURE__ */ new Set();
|
|
15
|
+
const staticIPv6Rules = /* @__PURE__ */ new Set();
|
|
16
|
+
const cidrRules = [];
|
|
17
|
+
const registerStaticRule = (rule) => {
|
|
18
|
+
const type = distinctRemoteAddr(rule);
|
|
19
|
+
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
20
|
+
if (type === "IPv4") {
|
|
21
|
+
const ipv4binary = convertIPv4ToBinary(rule);
|
|
22
|
+
staticRules.add(rule);
|
|
23
|
+
staticRules.add(`::ffff:${rule}`);
|
|
24
|
+
staticIPv4Rules.add(ipv4binary);
|
|
25
|
+
staticIPv6Rules.add(65535n << 32n | ipv4binary);
|
|
26
|
+
} else {
|
|
27
|
+
const ipv6binary = convertIPv6ToBinary(rule);
|
|
28
|
+
const ipv6Addr = convertIPv6BinaryToString(ipv6binary);
|
|
29
|
+
staticRules.add(ipv6Addr);
|
|
30
|
+
staticIPv6Rules.add(ipv6binary);
|
|
31
|
+
if (isIPv4MappedIPv6(ipv6binary)) {
|
|
32
|
+
staticRules.add(ipv6Addr.substring(7));
|
|
33
|
+
staticIPv4Rules.add(convertIPv4MappedIPv6ToIPv4(ipv6binary));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
for (let rule of rules) if (rule === "*") return () => true;
|
|
38
|
+
else if (typeof rule === "function") functionRules.push(rule);
|
|
39
|
+
else {
|
|
40
|
+
if (IS_CIDR_NOTATION_REGEX.test(rule)) {
|
|
41
|
+
const separatedRule = rule.split("/");
|
|
42
|
+
const addrStr = separatedRule[0];
|
|
43
|
+
const type = distinctRemoteAddr(addrStr);
|
|
44
|
+
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
45
|
+
let isIPv4 = type === "IPv4";
|
|
46
|
+
let prefix = parseCidrPrefix(rule, separatedRule[1], isIPv4 ? 32 : 128);
|
|
47
|
+
if (isIPv4 ? prefix === 32 : prefix === 128) rule = addrStr;
|
|
48
|
+
else {
|
|
49
|
+
let addr = (isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(addrStr);
|
|
50
|
+
if (type === "IPv6" && isIPv4MappedIPv6(addr) && prefix >= 96) {
|
|
51
|
+
isIPv4 = true;
|
|
52
|
+
addr = convertIPv4MappedIPv6ToIPv4(addr);
|
|
53
|
+
prefix -= 96;
|
|
54
|
+
}
|
|
55
|
+
const mask = (1n << BigInt(prefix)) - 1n << BigInt((isIPv4 ? 32 : 128) - prefix);
|
|
56
|
+
cidrRules.push([
|
|
57
|
+
isIPv4,
|
|
58
|
+
addr & mask,
|
|
59
|
+
mask
|
|
60
|
+
]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
registerStaticRule(rule);
|
|
65
|
+
}
|
|
66
|
+
return (remote) => {
|
|
67
|
+
if (staticRules.has(remote.addr)) return true;
|
|
68
|
+
const remoteAddr = remote.binaryAddr ||= (remote.isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(remote.addr);
|
|
69
|
+
const remoteIPv4Addr = remote.isIPv4 || isIPv4MappedIPv6(remoteAddr) ? remote.isIPv4 ? remoteAddr : convertIPv4MappedIPv6ToIPv4(remoteAddr) : void 0;
|
|
70
|
+
if ((remote.isIPv4 ? staticIPv4Rules : staticIPv6Rules).has(remoteAddr)) return true;
|
|
71
|
+
for (const [isIPv4, addr, mask] of cidrRules) {
|
|
72
|
+
if (isIPv4) {
|
|
73
|
+
if (remoteIPv4Addr === void 0) continue;
|
|
74
|
+
if ((remoteIPv4Addr & mask) === addr) return true;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (remote.isIPv4) continue;
|
|
78
|
+
if ((remoteAddr & mask) === addr) return true;
|
|
79
|
+
}
|
|
80
|
+
for (const rule of functionRules) if (rule({
|
|
81
|
+
addr: remote.addr,
|
|
82
|
+
type: remote.type
|
|
83
|
+
})) return true;
|
|
84
|
+
return false;
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* IP Restriction Middleware for Acryl.
|
|
89
|
+
*
|
|
90
|
+
*
|
|
91
|
+
* @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
|
|
92
|
+
* @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
|
|
93
|
+
* @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
|
|
94
|
+
* @returns {MiddlewareHandler} The middleware handler function.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```ts
|
|
98
|
+
* import { Acryl } from 'acrylblends'
|
|
99
|
+
* import { ipRestriction } from 'acrylblends/ip-restriction'
|
|
100
|
+
* import { getConnInfo } from 'acrylblends/cloudflare-workers'
|
|
101
|
+
*
|
|
102
|
+
* const app = new Acryl()
|
|
103
|
+
*
|
|
104
|
+
* app.use(
|
|
105
|
+
* '*',
|
|
106
|
+
* ipRestriction(getConnInfo, {
|
|
107
|
+
* // Block a specific IP and an entire subnet
|
|
108
|
+
* denyList: ['192.168.0.5', '10.0.0.0/8'],
|
|
109
|
+
* // Only allow requests from localhost and a private range
|
|
110
|
+
* allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
|
|
111
|
+
* })
|
|
112
|
+
* )
|
|
113
|
+
*
|
|
114
|
+
* // With a custom error handler
|
|
115
|
+
* app.use(
|
|
116
|
+
* '/admin/*',
|
|
117
|
+
* ipRestriction(
|
|
118
|
+
* getConnInfo,
|
|
119
|
+
* { allowList: ['203.0.113.0/24'] },
|
|
120
|
+
* (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
|
|
121
|
+
* )
|
|
122
|
+
* )
|
|
123
|
+
*
|
|
124
|
+
* app.get('/', (c) => c.text('Hello!'))
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
const ipRestriction = (getIP, { denyList = [], allowList = [] }, onError) => {
|
|
128
|
+
const allowLength = allowList.length;
|
|
129
|
+
const denyMatcher = buildMatcher(denyList);
|
|
130
|
+
const allowMatcher = buildMatcher(allowList);
|
|
131
|
+
const blockError = (c) => new HTTPException(403, { res: c.text("Forbidden", { status: 403 }) });
|
|
132
|
+
return async function ipRestriction(c, next) {
|
|
133
|
+
const connInfo = getIP(c);
|
|
134
|
+
const addr = typeof connInfo === "string" ? connInfo : connInfo.remote.address;
|
|
135
|
+
if (!addr) throw blockError(c);
|
|
136
|
+
const type = typeof connInfo !== "string" && connInfo.remote.addressType || distinctRemoteAddr(addr);
|
|
137
|
+
const remoteData = {
|
|
138
|
+
addr,
|
|
139
|
+
type,
|
|
140
|
+
isIPv4: type === "IPv4"
|
|
141
|
+
};
|
|
142
|
+
try {
|
|
143
|
+
if (denyMatcher(remoteData)) {
|
|
144
|
+
if (onError) return onError({
|
|
145
|
+
addr,
|
|
146
|
+
type
|
|
147
|
+
}, c);
|
|
148
|
+
throw blockError(c);
|
|
149
|
+
}
|
|
150
|
+
if (allowMatcher(remoteData)) return await next();
|
|
151
|
+
} catch (e) {
|
|
152
|
+
if (e instanceof TypeError && e.code === "ERR_INVALID_IP_ADDRESS") throw blockError(c);
|
|
153
|
+
throw e;
|
|
154
|
+
}
|
|
155
|
+
if (allowLength === 0) return await next();
|
|
156
|
+
else {
|
|
157
|
+
if (onError) return await onError({
|
|
158
|
+
addr,
|
|
159
|
+
type
|
|
160
|
+
}, c);
|
|
161
|
+
throw blockError(c);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
//#endregion
|
|
166
|
+
export { ipRestriction as t };
|
package/lib/ip-restriction.js
CHANGED
|
@@ -1,166 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { convertIPv4MappedIPv6ToIPv4, convertIPv4ToBinary, convertIPv6BinaryToString, convertIPv6ToBinary, distinctRemoteAddr, isIPv4MappedIPv6 } from "./utils/ipaddr.js";
|
|
3
|
-
//#region ../../plugins/acryl-router/src/core/middleware/ip-restriction/index.ts
|
|
4
|
-
const IS_CIDR_NOTATION_REGEX = /\/[^/]*$/;
|
|
5
|
-
const parseCidrPrefix = (rule, prefix, max) => {
|
|
6
|
-
if (!/^[0-9]{1,3}$/.test(prefix)) throw new TypeError(`Invalid rule: ${rule}`);
|
|
7
|
-
const parsedPrefix = parseInt(prefix);
|
|
8
|
-
if (parsedPrefix > max) throw new TypeError(`Invalid rule: ${rule}`);
|
|
9
|
-
return parsedPrefix;
|
|
10
|
-
};
|
|
11
|
-
const buildMatcher = (rules) => {
|
|
12
|
-
const functionRules = [];
|
|
13
|
-
const staticRules = /* @__PURE__ */ new Set();
|
|
14
|
-
const staticIPv4Rules = /* @__PURE__ */ new Set();
|
|
15
|
-
const staticIPv6Rules = /* @__PURE__ */ new Set();
|
|
16
|
-
const cidrRules = [];
|
|
17
|
-
const registerStaticRule = (rule) => {
|
|
18
|
-
const type = distinctRemoteAddr(rule);
|
|
19
|
-
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
20
|
-
if (type === "IPv4") {
|
|
21
|
-
const ipv4binary = convertIPv4ToBinary(rule);
|
|
22
|
-
staticRules.add(rule);
|
|
23
|
-
staticRules.add(`::ffff:${rule}`);
|
|
24
|
-
staticIPv4Rules.add(ipv4binary);
|
|
25
|
-
staticIPv6Rules.add(65535n << 32n | ipv4binary);
|
|
26
|
-
} else {
|
|
27
|
-
const ipv6binary = convertIPv6ToBinary(rule);
|
|
28
|
-
const ipv6Addr = convertIPv6BinaryToString(ipv6binary);
|
|
29
|
-
staticRules.add(ipv6Addr);
|
|
30
|
-
staticIPv6Rules.add(ipv6binary);
|
|
31
|
-
if (isIPv4MappedIPv6(ipv6binary)) {
|
|
32
|
-
staticRules.add(ipv6Addr.substring(7));
|
|
33
|
-
staticIPv4Rules.add(convertIPv4MappedIPv6ToIPv4(ipv6binary));
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
for (let rule of rules) if (rule === "*") return () => true;
|
|
38
|
-
else if (typeof rule === "function") functionRules.push(rule);
|
|
39
|
-
else {
|
|
40
|
-
if (IS_CIDR_NOTATION_REGEX.test(rule)) {
|
|
41
|
-
const separatedRule = rule.split("/");
|
|
42
|
-
const addrStr = separatedRule[0];
|
|
43
|
-
const type = distinctRemoteAddr(addrStr);
|
|
44
|
-
if (type === void 0) throw new TypeError(`Invalid rule: ${rule}`);
|
|
45
|
-
let isIPv4 = type === "IPv4";
|
|
46
|
-
let prefix = parseCidrPrefix(rule, separatedRule[1], isIPv4 ? 32 : 128);
|
|
47
|
-
if (isIPv4 ? prefix === 32 : prefix === 128) rule = addrStr;
|
|
48
|
-
else {
|
|
49
|
-
let addr = (isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(addrStr);
|
|
50
|
-
if (type === "IPv6" && isIPv4MappedIPv6(addr) && prefix >= 96) {
|
|
51
|
-
isIPv4 = true;
|
|
52
|
-
addr = convertIPv4MappedIPv6ToIPv4(addr);
|
|
53
|
-
prefix -= 96;
|
|
54
|
-
}
|
|
55
|
-
const mask = (1n << BigInt(prefix)) - 1n << BigInt((isIPv4 ? 32 : 128) - prefix);
|
|
56
|
-
cidrRules.push([
|
|
57
|
-
isIPv4,
|
|
58
|
-
addr & mask,
|
|
59
|
-
mask
|
|
60
|
-
]);
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
registerStaticRule(rule);
|
|
65
|
-
}
|
|
66
|
-
return (remote) => {
|
|
67
|
-
if (staticRules.has(remote.addr)) return true;
|
|
68
|
-
const remoteAddr = remote.binaryAddr ||= (remote.isIPv4 ? convertIPv4ToBinary : convertIPv6ToBinary)(remote.addr);
|
|
69
|
-
const remoteIPv4Addr = remote.isIPv4 || isIPv4MappedIPv6(remoteAddr) ? remote.isIPv4 ? remoteAddr : convertIPv4MappedIPv6ToIPv4(remoteAddr) : void 0;
|
|
70
|
-
if ((remote.isIPv4 ? staticIPv4Rules : staticIPv6Rules).has(remoteAddr)) return true;
|
|
71
|
-
for (const [isIPv4, addr, mask] of cidrRules) {
|
|
72
|
-
if (isIPv4) {
|
|
73
|
-
if (remoteIPv4Addr === void 0) continue;
|
|
74
|
-
if ((remoteIPv4Addr & mask) === addr) return true;
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
if (remote.isIPv4) continue;
|
|
78
|
-
if ((remoteAddr & mask) === addr) return true;
|
|
79
|
-
}
|
|
80
|
-
for (const rule of functionRules) if (rule({
|
|
81
|
-
addr: remote.addr,
|
|
82
|
-
type: remote.type
|
|
83
|
-
})) return true;
|
|
84
|
-
return false;
|
|
85
|
-
};
|
|
86
|
-
};
|
|
87
|
-
/**
|
|
88
|
-
* IP Restriction Middleware for Acryl.
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* @param {GetConnInfo | ((c: Context) => string)} getIP - A function to retrieve the client IP address. Use `getConnInfo` from the appropriate runtime adapter.
|
|
92
|
-
* @param {IPRestrictionRules} rules - An object with optional `denyList` and `allowList` arrays of IP rules. Each rule can be a static IP, a CIDR range, or a custom function.
|
|
93
|
-
* @param {(remote: { addr: string; type: AddressType }, c: Context) => Response | Promise<Response>} [onError] - Optional custom handler invoked when a request is blocked. Defaults to returning a 403 Forbidden response.
|
|
94
|
-
* @returns {MiddlewareHandler} The middleware handler function.
|
|
95
|
-
*
|
|
96
|
-
* @example
|
|
97
|
-
* ```ts
|
|
98
|
-
* import { Acryl } from 'acrylblends'
|
|
99
|
-
* import { ipRestriction } from 'acrylblends/ip-restriction'
|
|
100
|
-
* import { getConnInfo } from 'acrylblends/cloudflare-workers'
|
|
101
|
-
*
|
|
102
|
-
* const app = new Acryl()
|
|
103
|
-
*
|
|
104
|
-
* app.use(
|
|
105
|
-
* '*',
|
|
106
|
-
* ipRestriction(getConnInfo, {
|
|
107
|
-
* // Block a specific IP and an entire subnet
|
|
108
|
-
* denyList: ['192.168.0.5', '10.0.0.0/8'],
|
|
109
|
-
* // Only allow requests from localhost and a private range
|
|
110
|
-
* allowList: ['127.0.0.1', '::1', '192.168.1.0/24'],
|
|
111
|
-
* })
|
|
112
|
-
* )
|
|
113
|
-
*
|
|
114
|
-
* // With a custom error handler
|
|
115
|
-
* app.use(
|
|
116
|
-
* '/admin/*',
|
|
117
|
-
* ipRestriction(
|
|
118
|
-
* getConnInfo,
|
|
119
|
-
* { allowList: ['203.0.113.0/24'] },
|
|
120
|
-
* (remote, c) => c.text(`Access denied for ${remote.addr}`, 403)
|
|
121
|
-
* )
|
|
122
|
-
* )
|
|
123
|
-
*
|
|
124
|
-
* app.get('/', (c) => c.text('Hello!'))
|
|
125
|
-
* ```
|
|
126
|
-
*/
|
|
127
|
-
const ipRestriction = (getIP, { denyList = [], allowList = [] }, onError) => {
|
|
128
|
-
const allowLength = allowList.length;
|
|
129
|
-
const denyMatcher = buildMatcher(denyList);
|
|
130
|
-
const allowMatcher = buildMatcher(allowList);
|
|
131
|
-
const blockError = (c) => new HTTPException(403, { res: c.text("Forbidden", { status: 403 }) });
|
|
132
|
-
return async function ipRestriction(c, next) {
|
|
133
|
-
const connInfo = getIP(c);
|
|
134
|
-
const addr = typeof connInfo === "string" ? connInfo : connInfo.remote.address;
|
|
135
|
-
if (!addr) throw blockError(c);
|
|
136
|
-
const type = typeof connInfo !== "string" && connInfo.remote.addressType || distinctRemoteAddr(addr);
|
|
137
|
-
const remoteData = {
|
|
138
|
-
addr,
|
|
139
|
-
type,
|
|
140
|
-
isIPv4: type === "IPv4"
|
|
141
|
-
};
|
|
142
|
-
try {
|
|
143
|
-
if (denyMatcher(remoteData)) {
|
|
144
|
-
if (onError) return onError({
|
|
145
|
-
addr,
|
|
146
|
-
type
|
|
147
|
-
}, c);
|
|
148
|
-
throw blockError(c);
|
|
149
|
-
}
|
|
150
|
-
if (allowMatcher(remoteData)) return await next();
|
|
151
|
-
} catch (e) {
|
|
152
|
-
if (e instanceof TypeError && e.code === "ERR_INVALID_IP_ADDRESS") throw blockError(c);
|
|
153
|
-
throw e;
|
|
154
|
-
}
|
|
155
|
-
if (allowLength === 0) return await next();
|
|
156
|
-
else {
|
|
157
|
-
if (onError) return await onError({
|
|
158
|
-
addr,
|
|
159
|
-
type
|
|
160
|
-
}, c);
|
|
161
|
-
throw blockError(c);
|
|
162
|
-
}
|
|
163
|
-
};
|
|
164
|
-
};
|
|
165
|
-
//#endregion
|
|
1
|
+
import { t as ipRestriction } from "./ip-restriction-jKtKCRM_.js";
|
|
166
2
|
export { ipRestriction };
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
//#region ../../plugins/acryl-router/src/core/utils/ipaddr.ts
|
|
2
|
+
/**
|
|
3
|
+
* Expand IPv6 Address
|
|
4
|
+
* @param ipV6 Shorten IPv6 Address
|
|
5
|
+
* @return expanded IPv6 Address
|
|
6
|
+
*/
|
|
7
|
+
const expandIPv6 = (ipV6) => {
|
|
8
|
+
const sections = ipV6.split(":");
|
|
9
|
+
const lastSection = sections.at(-1);
|
|
10
|
+
if (IPV4_REGEX.test(lastSection)) {
|
|
11
|
+
const octets = lastSection.split(".").map(Number);
|
|
12
|
+
sections.splice(-1, 1, (octets[0] << 8 | octets[1]).toString(16), (octets[2] << 8 | octets[3]).toString(16));
|
|
13
|
+
}
|
|
14
|
+
for (let i = 0; i < sections.length; i++) {
|
|
15
|
+
const node = sections[i];
|
|
16
|
+
if (node !== "") sections[i] = node.padStart(4, "0");
|
|
17
|
+
else {
|
|
18
|
+
while (sections[i + 1] === "") sections.splice(i + 1, 1);
|
|
19
|
+
sections[i] = new Array(8 - sections.length + 1).fill("0000").join(":");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return sections.join(":");
|
|
23
|
+
};
|
|
24
|
+
const IPV4_OCTET_PART = "(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])";
|
|
25
|
+
const IPV4_REGEX = new RegExp(`^(?:${IPV4_OCTET_PART}\\.){3}${IPV4_OCTET_PART}$`);
|
|
26
|
+
const INVALID_IP_ADDRESS_ERROR_CODE = "ERR_INVALID_IP_ADDRESS";
|
|
27
|
+
const CHAR_CODE_0 = 48;
|
|
28
|
+
const CHAR_CODE_9 = 57;
|
|
29
|
+
const CHAR_CODE_A = 65;
|
|
30
|
+
const CHAR_CODE_F = 70;
|
|
31
|
+
const CHAR_CODE_a = 97;
|
|
32
|
+
const CHAR_CODE_f = 102;
|
|
33
|
+
const CHAR_CODE_DOT = 46;
|
|
34
|
+
const CHAR_CODE_COLON = 58;
|
|
35
|
+
const CHAR_CODE_PERCENT = 37;
|
|
36
|
+
/**
|
|
37
|
+
* Distinct Remote Addr
|
|
38
|
+
* @param remoteAddr Remote Addr
|
|
39
|
+
*/
|
|
40
|
+
const distinctRemoteAddr = (remoteAddr) => {
|
|
41
|
+
if (IPV4_REGEX.test(remoteAddr)) return "IPv4";
|
|
42
|
+
if (remoteAddr.includes(":")) return "IPv6";
|
|
43
|
+
};
|
|
44
|
+
const createInvalidIPAddressError = (message) => {
|
|
45
|
+
const error = new TypeError(message);
|
|
46
|
+
error.code = INVALID_IP_ADDRESS_ERROR_CODE;
|
|
47
|
+
return error;
|
|
48
|
+
};
|
|
49
|
+
const throwInvalidIPv4Address = (ipv4) => {
|
|
50
|
+
throw createInvalidIPAddressError(`Invalid IPv4 address: ${ipv4}`);
|
|
51
|
+
};
|
|
52
|
+
const throwInvalidIPv6Address = (ipv6) => {
|
|
53
|
+
throw createInvalidIPAddressError(`Invalid IPv6 address: ${ipv6}`);
|
|
54
|
+
};
|
|
55
|
+
const parseIPv4ToBinary = (ipv4, start, end, onInvalid) => {
|
|
56
|
+
let result = 0n;
|
|
57
|
+
let octets = 0;
|
|
58
|
+
let octet = 0;
|
|
59
|
+
let digits = 0;
|
|
60
|
+
let firstDigit = 0;
|
|
61
|
+
for (let i = start; i <= end; i++) {
|
|
62
|
+
const code = i < end ? ipv4.charCodeAt(i) : CHAR_CODE_DOT;
|
|
63
|
+
if (code >= CHAR_CODE_0 && code <= CHAR_CODE_9) {
|
|
64
|
+
if (digits === 0) firstDigit = code;
|
|
65
|
+
else if (firstDigit === CHAR_CODE_0) onInvalid();
|
|
66
|
+
octet = octet * 10 + code - CHAR_CODE_0;
|
|
67
|
+
if (octet > 255) onInvalid();
|
|
68
|
+
digits++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (code !== CHAR_CODE_DOT || digits === 0 || octets === 4) onInvalid();
|
|
72
|
+
result = (result << 8n) + BigInt(octet);
|
|
73
|
+
octets++;
|
|
74
|
+
octet = 0;
|
|
75
|
+
digits = 0;
|
|
76
|
+
}
|
|
77
|
+
if (octets !== 4) onInvalid();
|
|
78
|
+
return result;
|
|
79
|
+
};
|
|
80
|
+
const parseIPv6HexCode = (code) => {
|
|
81
|
+
if (code >= CHAR_CODE_0 && code <= CHAR_CODE_9) return code - CHAR_CODE_0;
|
|
82
|
+
if (code >= CHAR_CODE_A && code <= CHAR_CODE_F) return code - CHAR_CODE_A + 10;
|
|
83
|
+
if (code >= CHAR_CODE_a && code <= CHAR_CODE_f) return code - CHAR_CODE_a + 10;
|
|
84
|
+
return -1;
|
|
85
|
+
};
|
|
86
|
+
const isIPv6LinkLocal = (ipv6binary) => ipv6binary >> 118n === 1018n;
|
|
87
|
+
/**
|
|
88
|
+
* Convert IPv4 to Uint8Array
|
|
89
|
+
* @param ipv4 IPv4 Address
|
|
90
|
+
* @returns BigInt
|
|
91
|
+
*/
|
|
92
|
+
const convertIPv4ToBinary = (ipv4) => {
|
|
93
|
+
return parseIPv4ToBinary(ipv4, 0, ipv4.length, () => throwInvalidIPv4Address(ipv4));
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Convert IPv6 to Uint8Array
|
|
97
|
+
* @param ipv6 IPv6 Address
|
|
98
|
+
* @returns BigInt
|
|
99
|
+
*/
|
|
100
|
+
const convertIPv6ToBinary = (ipv6) => {
|
|
101
|
+
const length = ipv6.length;
|
|
102
|
+
const sections = [];
|
|
103
|
+
let hasZoneId = false;
|
|
104
|
+
let compressAt = -1;
|
|
105
|
+
let index = 0;
|
|
106
|
+
if (length === 0) throwInvalidIPv6Address(ipv6);
|
|
107
|
+
while (index < length) {
|
|
108
|
+
if (sections.length > 8) throwInvalidIPv6Address(ipv6);
|
|
109
|
+
let code = ipv6.charCodeAt(index);
|
|
110
|
+
if (code === CHAR_CODE_PERCENT) {
|
|
111
|
+
if (index + 1 === length) throwInvalidIPv6Address(ipv6);
|
|
112
|
+
hasZoneId = true;
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (code === CHAR_CODE_COLON) {
|
|
116
|
+
if (index + 1 < length && ipv6.charCodeAt(index + 1) === CHAR_CODE_COLON) {
|
|
117
|
+
if (compressAt !== -1) throwInvalidIPv6Address(ipv6);
|
|
118
|
+
compressAt = sections.length;
|
|
119
|
+
index += 2;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
throwInvalidIPv6Address(ipv6);
|
|
123
|
+
}
|
|
124
|
+
let value = 0;
|
|
125
|
+
let digits = 0;
|
|
126
|
+
const sectionStart = index;
|
|
127
|
+
while (index < length) {
|
|
128
|
+
code = ipv6.charCodeAt(index);
|
|
129
|
+
const hex = parseIPv6HexCode(code);
|
|
130
|
+
if (hex === -1) break;
|
|
131
|
+
if (digits === 4) throwInvalidIPv6Address(ipv6);
|
|
132
|
+
value = value << 4 | hex;
|
|
133
|
+
digits++;
|
|
134
|
+
index++;
|
|
135
|
+
}
|
|
136
|
+
if (index < length && ipv6.charCodeAt(index) === CHAR_CODE_DOT) {
|
|
137
|
+
let ipv4End = length;
|
|
138
|
+
for (let i = index; i < length; i++) if (ipv6.charCodeAt(i) === CHAR_CODE_PERCENT) {
|
|
139
|
+
if (i + 1 === length) throwInvalidIPv6Address(ipv6);
|
|
140
|
+
hasZoneId = true;
|
|
141
|
+
ipv4End = i;
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
const ipv4 = parseIPv4ToBinary(ipv6, sectionStart, ipv4End, () => throwInvalidIPv6Address(ipv6));
|
|
145
|
+
sections.push(Number(ipv4 >> 16n & 65535n), Number(ipv4 & 65535n));
|
|
146
|
+
index = length;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
if (digits === 0) throwInvalidIPv6Address(ipv6);
|
|
150
|
+
sections.push(value);
|
|
151
|
+
if (index === length) break;
|
|
152
|
+
code = ipv6.charCodeAt(index);
|
|
153
|
+
if (code === CHAR_CODE_PERCENT) {
|
|
154
|
+
if (index + 1 === length) throwInvalidIPv6Address(ipv6);
|
|
155
|
+
hasZoneId = true;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
if (code !== CHAR_CODE_COLON) throwInvalidIPv6Address(ipv6);
|
|
159
|
+
if (index + 1 < length && ipv6.charCodeAt(index + 1) === CHAR_CODE_COLON) {
|
|
160
|
+
if (compressAt !== -1) throwInvalidIPv6Address(ipv6);
|
|
161
|
+
compressAt = sections.length;
|
|
162
|
+
index += 2;
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
index++;
|
|
166
|
+
if (index === length) throwInvalidIPv6Address(ipv6);
|
|
167
|
+
}
|
|
168
|
+
if (compressAt === -1 ? sections.length !== 8 : sections.length >= 8) throwInvalidIPv6Address(ipv6);
|
|
169
|
+
let result = 0n;
|
|
170
|
+
const zeros = compressAt === -1 ? 0 : 8 - sections.length;
|
|
171
|
+
const firstSectionEnd = compressAt === -1 ? sections.length : compressAt;
|
|
172
|
+
for (let i = 0; i < firstSectionEnd; i++) {
|
|
173
|
+
result <<= 16n;
|
|
174
|
+
result += BigInt(sections[i]);
|
|
175
|
+
}
|
|
176
|
+
for (let i = 0; i < zeros; i++) result <<= 16n;
|
|
177
|
+
for (let i = firstSectionEnd; i < sections.length; i++) {
|
|
178
|
+
result <<= 16n;
|
|
179
|
+
result += BigInt(sections[i]);
|
|
180
|
+
}
|
|
181
|
+
if (hasZoneId && !isIPv6LinkLocal(result)) throwInvalidIPv6Address(ipv6);
|
|
182
|
+
return result;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Convert a binary representation of an IPv4 address to a string.
|
|
186
|
+
* @param ipV4 binary IPv4 Address
|
|
187
|
+
* @return IPv4 Address in string
|
|
188
|
+
*/
|
|
189
|
+
const convertIPv4BinaryToString = (ipV4) => {
|
|
190
|
+
const sections = [];
|
|
191
|
+
for (let i = 0; i < 4; i++) sections.push(ipV4 >> BigInt(8 * (3 - i)) & 255n);
|
|
192
|
+
return sections.join(".");
|
|
193
|
+
};
|
|
194
|
+
/**
|
|
195
|
+
* Check if a binary IPv6 address is an IPv4-mapped IPv6 address (::ffff:x.x.x.x)
|
|
196
|
+
* @param ipv6binary binary IPv6 Address
|
|
197
|
+
* @return true if the address is an IPv4-mapped IPv6 address
|
|
198
|
+
*/
|
|
199
|
+
const isIPv4MappedIPv6 = (ipv6binary) => ipv6binary >> 32n === 65535n;
|
|
200
|
+
/**
|
|
201
|
+
* Extract the IPv4 portion from an IPv4-mapped IPv6 address
|
|
202
|
+
* @param ipv6binary binary IPv4-mapped IPv6 Address
|
|
203
|
+
* @return binary IPv4 Address
|
|
204
|
+
*/
|
|
205
|
+
const convertIPv4MappedIPv6ToIPv4 = (ipv6binary) => ipv6binary & 4294967295n;
|
|
206
|
+
/**
|
|
207
|
+
* Convert a binary representation of an IPv6 address to a string.
|
|
208
|
+
* @param ipV6 binary IPv6 Address
|
|
209
|
+
* @return normalized IPv6 Address in string
|
|
210
|
+
*/
|
|
211
|
+
const convertIPv6BinaryToString = (ipV6) => {
|
|
212
|
+
if (ipV6 === 0n) return "::";
|
|
213
|
+
if (isIPv4MappedIPv6(ipV6)) return `::ffff:${convertIPv4BinaryToString(convertIPv4MappedIPv6ToIPv4(ipV6))}`;
|
|
214
|
+
const sections = [];
|
|
215
|
+
for (let i = 0; i < 8; i++) sections.push((ipV6 >> BigInt(16 * (7 - i)) & 65535n).toString(16));
|
|
216
|
+
let currentZeroStart = -1;
|
|
217
|
+
let maxZeroStart = -1;
|
|
218
|
+
let maxZeroEnd = -1;
|
|
219
|
+
for (let i = 0; i < 8; i++) if (sections[i] === "0") {
|
|
220
|
+
if (currentZeroStart === -1) currentZeroStart = i;
|
|
221
|
+
} else if (currentZeroStart > -1) {
|
|
222
|
+
if (i - currentZeroStart > maxZeroEnd - maxZeroStart) {
|
|
223
|
+
maxZeroStart = currentZeroStart;
|
|
224
|
+
maxZeroEnd = i;
|
|
225
|
+
}
|
|
226
|
+
currentZeroStart = -1;
|
|
227
|
+
}
|
|
228
|
+
if (currentZeroStart > -1) {
|
|
229
|
+
if (8 - currentZeroStart > maxZeroEnd - maxZeroStart) {
|
|
230
|
+
maxZeroStart = currentZeroStart;
|
|
231
|
+
maxZeroEnd = 8;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (maxZeroStart !== -1 && maxZeroEnd - maxZeroStart > 1) sections.splice(maxZeroStart, maxZeroEnd - maxZeroStart, ":");
|
|
235
|
+
return sections.join(":").replace(/:{2,}/g, "::");
|
|
236
|
+
};
|
|
237
|
+
//#endregion
|
|
238
|
+
export { convertIPv6BinaryToString as a, expandIPv6 as c, convertIPv4ToBinary as i, isIPv4MappedIPv6 as l, convertIPv4BinaryToString as n, convertIPv6ToBinary as o, convertIPv4MappedIPv6ToIPv4 as r, distinctRemoteAddr as s, INVALID_IP_ADDRESS_ERROR_CODE as t };
|
package/lib/jsx/dom/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { D as renderNode, S as buildNode, _ as useState } from "../../hooks-
|
|
1
|
+
import { D as renderNode, S as buildNode, _ as useState } from "../../hooks-CfC07ri0.js";
|
|
2
2
|
//#region ../../plugins/acryl-router/src/core/jsx/dom/client.ts
|
|
3
3
|
/**
|
|
4
4
|
* Create a root object for rendering
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as jsxDEV, t as Fragment } from "../../jsx-dev-runtime-
|
|
1
|
+
import { n as jsxDEV, t as Fragment } from "../../jsx-dev-runtime-BLfA-EhI.js";
|
|
2
2
|
export { Fragment, jsxDEV };
|
package/lib/jsx/dom/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { u as renderChildren } from "../../base-
|
|
2
|
-
import { i as renderToReadableStream$1 } from "../../components-
|
|
3
|
-
import dom_default from "
|
|
1
|
+
import { u as renderChildren } from "../../base-D_6kfOr-.js";
|
|
2
|
+
import { i as renderToReadableStream$1 } from "../../components-B2ka9Ax1.js";
|
|
3
|
+
import { r as dom_default } from "../../dom-YjND9Jt3.js";
|
|
4
4
|
//#region ../../plugins/acryl-router/src/core/jsx/dom/server.ts
|
|
5
5
|
const prepareRoot = (element) => typeof element === "string" || Array.isArray(element) ? renderChildren([element]) : element;
|
|
6
6
|
/**
|
package/lib/jsx/dom.js
CHANGED
|
@@ -1,74 +1,6 @@
|
|
|
1
|
-
import { D as createContext, E as useContext, a as isValidElement,
|
|
2
|
-
import { r as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import "
|
|
6
|
-
import { n as Suspense, t as ErrorBoundary } from "../components-JXVm45kK.js";
|
|
7
|
-
//#region ../../plugins/acryl-router/src/core/jsx/dom/index.ts
|
|
8
|
-
/**
|
|
9
|
-
* @module
|
|
10
|
-
* This module provides APIs for `acryl-router/jsx/dom`.
|
|
11
|
-
*/
|
|
12
|
-
const createElement = (tag, props, ...children) => {
|
|
13
|
-
const jsxProps = props ? { ...props } : {};
|
|
14
|
-
if (children.length) jsxProps.children = children.length === 1 ? children[0] : children;
|
|
15
|
-
let key = void 0;
|
|
16
|
-
if ("key" in jsxProps) {
|
|
17
|
-
key = jsxProps.key;
|
|
18
|
-
delete jsxProps.key;
|
|
19
|
-
}
|
|
20
|
-
return jsxDEV(tag, jsxProps, key);
|
|
21
|
-
};
|
|
22
|
-
const cloneElement = (element, props, ...children) => {
|
|
23
|
-
return jsxDEV(element.tag, {
|
|
24
|
-
...element.props,
|
|
25
|
-
...props,
|
|
26
|
-
children: children.length ? children : element.props.children
|
|
27
|
-
}, element.key);
|
|
28
|
-
};
|
|
29
|
-
const memo = (component, propsAreEqual = shallowEqual) => {
|
|
30
|
-
const wrapper = ((props) => component(props));
|
|
31
|
-
wrapper[DOM_MEMO] = propsAreEqual;
|
|
32
|
-
return wrapper;
|
|
33
|
-
};
|
|
34
|
-
var dom_default = {
|
|
35
|
-
version: reactAPICompatVersion,
|
|
36
|
-
useState,
|
|
37
|
-
useEffect,
|
|
38
|
-
useRef,
|
|
39
|
-
useCallback,
|
|
40
|
-
use,
|
|
41
|
-
startTransition,
|
|
42
|
-
useTransition,
|
|
43
|
-
useDeferredValue,
|
|
44
|
-
startViewTransition,
|
|
45
|
-
useViewTransition,
|
|
46
|
-
useMemo,
|
|
47
|
-
useLayoutEffect,
|
|
48
|
-
useInsertionEffect,
|
|
49
|
-
useReducer,
|
|
50
|
-
useId,
|
|
51
|
-
useDebugValue,
|
|
52
|
-
createRef,
|
|
53
|
-
forwardRef,
|
|
54
|
-
useImperativeHandle,
|
|
55
|
-
useSyncExternalStore,
|
|
56
|
-
useFormStatus,
|
|
57
|
-
useActionState,
|
|
58
|
-
useOptimistic,
|
|
59
|
-
Suspense,
|
|
60
|
-
ErrorBoundary,
|
|
61
|
-
createContext,
|
|
62
|
-
useContext,
|
|
63
|
-
memo,
|
|
64
|
-
isValidElement,
|
|
65
|
-
createElement,
|
|
66
|
-
cloneElement,
|
|
67
|
-
Children,
|
|
68
|
-
Fragment,
|
|
69
|
-
StrictMode: Fragment,
|
|
70
|
-
flushSync,
|
|
71
|
-
createPortal
|
|
72
|
-
};
|
|
73
|
-
//#endregion
|
|
1
|
+
import { D as createContext, E as useContext, a as isValidElement, g as Children, l as reactAPICompatVersion } from "../base-D_6kfOr-.js";
|
|
2
|
+
import { C as createPortal, E as render, _ as useState, a as use, b as useViewTransition, c as useDeferredValue, d as useImperativeHandle, f as useInsertionEffect, g as useRef, h as useReducer, i as startViewTransition, l as useEffect, m as useMemo, n as forwardRef, o as useCallback, p as useLayoutEffect, r as startTransition, s as useDebugValue, t as createRef, u as useId, v as useSyncExternalStore, w as flushSync, y as useTransition } from "../hooks-CfC07ri0.js";
|
|
3
|
+
import { a as useOptimistic, i as useFormStatus, r as useActionState, t as Fragment } from "../jsx-dev-runtime-BLfA-EhI.js";
|
|
4
|
+
import { n as Suspense, t as ErrorBoundary } from "../components-PVXwaOaC.js";
|
|
5
|
+
import { i as memo, n as createElement, r as dom_default, t as cloneElement } from "../dom-YjND9Jt3.js";
|
|
74
6
|
export { Children, ErrorBoundary, Fragment, Fragment as StrictMode, Suspense, cloneElement, createContext, createElement, createElement as jsx, createPortal, createRef, dom_default as default, flushSync, forwardRef, isValidElement, memo, render, startTransition, startViewTransition, use, useActionState, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useFormStatus, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition, useViewTransition, reactAPICompatVersion as version };
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import { a as JSX, i as Fragment
|
|
2
|
-
|
|
3
|
-
//#region ../../plugins/acryl-router/src/core/jsx/jsx-dev-runtime.d.ts
|
|
4
|
-
declare function jsxDEV(tag: string | Function, props: Record<string, unknown>, key?: string): JSXNode;
|
|
5
|
-
//#endregion
|
|
1
|
+
import { a as JSX, i as Fragment } from "../base-BpQy2Rk7.js";
|
|
2
|
+
import { t as jsxDEV } from "../jsx-dev-runtime-CGt4kNYr.js";
|
|
6
3
|
export { Fragment, type JSX, jsxDEV };
|