wao 0.41.3 → 0.41.5
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/.babelrc-cjs +5 -0
- package/.babelrc-esm +5 -0
- package/.gitmodules +4 -0
- package/.prettierrc +6 -0
- package/README.md +90 -0
- package/app/.eslintrc.json +3 -0
- package/app/.mocharc.cjs +6 -0
- package/app/arweave.mjs +87 -0
- package/app/components/Footer.js +76 -0
- package/app/components/Global.js +1128 -0
- package/app/components/Header.js +306 -0
- package/app/components/Left.js +28 -0
- package/app/components/Logo.js +34 -0
- package/app/components/Middle.js +37 -0
- package/app/components/Sidebar.js +93 -0
- package/app/components/Tags.js +42 -0
- package/app/components/editor/Editor.js +322 -0
- package/app/components/editor/FilePath.js +42 -0
- package/app/components/editor/MonacoEditor.js +44 -0
- package/app/components/left/LeftMessages.js +85 -0
- package/app/components/left/LeftModules.js +86 -0
- package/app/components/left/LeftNetworks.js +438 -0
- package/app/components/left/LeftProcesses.js +98 -0
- package/app/components/left/LeftProjects.js +397 -0
- package/app/components/left/LeftTests.js +189 -0
- package/app/components/middle/MiddleBlocks.js +79 -0
- package/app/components/middle/MiddleEntity.js +16 -0
- package/app/components/middle/MiddleEntityAccount.js +264 -0
- package/app/components/middle/MiddleEntityAssignment.js +104 -0
- package/app/components/middle/MiddleEntityBlock.js +148 -0
- package/app/components/middle/MiddleEntityMessage.js +430 -0
- package/app/components/middle/MiddleEntityModule.js +183 -0
- package/app/components/middle/MiddleEntityProcess.js +323 -0
- package/app/components/middle/MiddleEntityTx.js +211 -0
- package/app/components/middle/MiddleMessages.js +87 -0
- package/app/components/middle/MiddleModules.js +89 -0
- package/app/components/middle/MiddleNetworks.js +516 -0
- package/app/components/middle/MiddleProcesses.js +87 -0
- package/app/components/middle/MiddleTests.js +134 -0
- package/app/components/modals/CreateFileModal.js +115 -0
- package/app/components/modals/CreateFolderModal.js +83 -0
- package/app/components/modals/CreateProjectModal.js +63 -0
- package/app/components/modals/FSModal.js +141 -0
- package/app/components/modals/ImportModal.js +105 -0
- package/app/components/modals/LaunchNetworkModal.js +95 -0
- package/app/components/modals/Modal.js +38 -0
- package/app/components/modals/ProxyModal.js +122 -0
- package/app/components/modals/RenameFileModal.js +95 -0
- package/app/components/styles/EditorScrollbarStyle.js +29 -0
- package/app/components/styles/EntityScrollbarStyle.js +29 -0
- package/app/components/styles/GlobalStyle.js +102 -0
- package/app/components/styles/XtermStyle.js +37 -0
- package/app/components/terminal/Terminal.js +132 -0
- package/app/components/terminal/Xterm.js +160 -0
- package/app/components/ui/avatar.jsx +49 -0
- package/app/components/ui/checkbox.jsx +17 -0
- package/app/components/ui/close-button.jsx +20 -0
- package/app/components/ui/color-mode.jsx +61 -0
- package/app/components/ui/dialog.jsx +54 -0
- package/app/components/ui/drawer.jsx +44 -0
- package/app/components/ui/field.jsx +22 -0
- package/app/components/ui/input-group.jsx +39 -0
- package/app/components/ui/popover.jsx +49 -0
- package/app/components/ui/provider.jsx +12 -0
- package/app/components/ui/radio.jsx +17 -0
- package/app/components/ui/slider.jsx +107 -0
- package/app/components/ui/toaster.jsx +69 -0
- package/app/components/ui/tooltip.jsx +35 -0
- package/app/index.js +10 -0
- package/app/jsconfig.json +7 -0
- package/app/lib/GithubCSS.js +1218 -0
- package/app/lib/addon-fit.js +72 -0
- package/app/lib/data.js +31 -0
- package/app/lib/github-markdown.css +1169 -0
- package/app/lib/global.js +1 -0
- package/app/lib/guide.js +82 -0
- package/app/lib/hub.js +109 -0
- package/app/lib/scripts.js +47 -0
- package/app/lib/store.js +34 -0
- package/app/lib/use.js +64 -0
- package/app/lib/utils.js +387 -0
- package/app/lib/webrtc.js +217 -0
- package/app/next.config.js +25 -0
- package/app/package.json +62 -0
- package/app/pages/404.js +9 -0
- package/app/pages/_app.js +10 -0
- package/app/pages/_document.js +14 -0
- package/app/pages/index.js +121 -0
- package/app/playwright.config.mjs +41 -0
- package/app/proxy.mjs +21 -0
- package/app/public/assets/cover.png +0 -0
- package/app/public/blueprints/apm.lua +91 -0
- package/app/public/blueprints/arena.lua +345 -0
- package/app/public/blueprints/arns.lua +318 -0
- package/app/public/blueprints/chat.lua +210 -0
- package/app/public/blueprints/chatroom.lua +56 -0
- package/app/public/blueprints/patch-legacy-reply.lua +13 -0
- package/app/public/blueprints/staking.lua +93 -0
- package/app/public/blueprints/token.lua +298 -0
- package/app/public/blueprints/voting.lua +45 -0
- package/app/public/favicon.ico +0 -0
- package/app/public/logo.png +0 -0
- package/cli-esm.js +55 -0
- package/cli.js +54 -0
- package/devnet/app/api.js +129 -0
- package/devnet/app/components/layout.js +89 -0
- package/devnet/app/components/pagination.js +144 -0
- package/devnet/app/components/search.js +159 -0
- package/devnet/app/components/table.js +124 -0
- package/devnet/app/components/tags.js +89 -0
- package/devnet/app/index.html +14 -0
- package/devnet/app/main.js +215 -0
- package/devnet/app/router.js +59 -0
- package/devnet/app/state.js +19 -0
- package/devnet/app/style.css +1606 -0
- package/devnet/app/utils.js +77 -0
- package/devnet/app/views/blocks.js +75 -0
- package/devnet/app/views/dashboard.js +127 -0
- package/devnet/app/views/entity.js +1473 -0
- package/devnet/app/views/messages.js +90 -0
- package/devnet/app/views/modules.js +165 -0
- package/devnet/app/views/processes.js +90 -0
- package/devnet/app/views/schedulers.js +90 -0
- package/devnet/app/views/transactions.js +88 -0
- package/devnet/migrations/0001_initial.sql +51 -0
- package/devnet/package.json +26 -0
- package/devnet/playwright.config.js +7 -0
- package/devnet/src/cu-worker.js +166 -0
- package/devnet/src/index.js +309 -0
- package/devnet/vite.config.js +17 -0
- package/devnet/vitest.config.js +10 -0
- package/devnet/wrangler-cu.toml +32 -0
- package/devnet/wrangler.toml +38 -0
- package/dhfs-tutorial-app/package.json +15 -0
- package/dist/esm/workspace/dashboard/public/favicon.png +0 -0
- package/dist/esm/workspace/src/counter.lua +14 -0
- package/dist/package.json +82 -0
- package/hb.sh +18 -0
- package/hbsig/.babelrc-cjs +5 -0
- package/hbsig/.babelrc-esm +5 -0
- package/hbsig/README.md +1 -0
- package/hbsig/dist/cjs/bin_to_str.js +44 -0
- package/hbsig/dist/cjs/collect-body-keys.js +470 -0
- package/hbsig/dist/cjs/commit.js +330 -0
- package/hbsig/dist/cjs/encode-array-item.js +110 -0
- package/hbsig/dist/cjs/encode-utils.js +242 -0
- package/hbsig/dist/cjs/encode.js +1365 -0
- package/hbsig/dist/cjs/erl_json.js +326 -0
- package/hbsig/dist/cjs/erl_str.js +1042 -0
- package/hbsig/dist/cjs/flat.js +279 -0
- package/hbsig/dist/cjs/http-message-signatures/httpbis.js +489 -0
- package/hbsig/dist/cjs/http-message-signatures/index.js +25 -0
- package/hbsig/dist/cjs/http-message-signatures/structured-header.js +129 -0
- package/hbsig/dist/cjs/httpsig.js +861 -0
- package/hbsig/dist/cjs/id.js +470 -0
- package/hbsig/dist/cjs/index.js +174 -0
- package/hbsig/dist/cjs/nocrypto.js +51 -0
- package/hbsig/dist/cjs/parser.js +201 -0
- package/hbsig/dist/cjs/send-utils.js +1231 -0
- package/hbsig/dist/cjs/send.js +211 -0
- package/hbsig/dist/cjs/signer-utils.js +494 -0
- package/hbsig/dist/cjs/signer.js +436 -0
- package/hbsig/dist/cjs/structured.js +515 -0
- package/hbsig/dist/cjs/test.js +12 -0
- package/hbsig/dist/cjs/utils.js +44 -0
- package/hbsig/dist/esm/bin_to_str.js +46 -0
- package/hbsig/dist/esm/collect-body-keys.js +436 -0
- package/hbsig/dist/esm/commit.js +219 -0
- package/hbsig/dist/esm/encode-array-item.js +112 -0
- package/hbsig/dist/esm/encode-utils.js +191 -0
- package/hbsig/dist/esm/encode.js +1256 -0
- package/hbsig/dist/esm/erl_json.js +292 -0
- package/hbsig/dist/esm/erl_str.js +1144 -0
- package/hbsig/dist/esm/flat.js +250 -0
- package/hbsig/dist/esm/http-message-signatures/httpbis.js +438 -0
- package/hbsig/dist/esm/http-message-signatures/index.js +4 -0
- package/hbsig/dist/esm/http-message-signatures/structured-header.js +105 -0
- package/hbsig/dist/esm/httpsig.js +866 -0
- package/hbsig/dist/esm/id.js +459 -0
- package/hbsig/dist/esm/index.js +13 -0
- package/hbsig/dist/esm/nocrypto.js +4 -0
- package/hbsig/dist/esm/package.json +3 -0
- package/hbsig/dist/esm/parser.js +171 -0
- package/hbsig/dist/esm/send-utils.js +1132 -0
- package/hbsig/dist/esm/send.js +142 -0
- package/hbsig/dist/esm/signer-utils.js +375 -0
- package/hbsig/dist/esm/signer.js +312 -0
- package/hbsig/dist/esm/structured.js +496 -0
- package/hbsig/dist/esm/test.js +2 -0
- package/hbsig/dist/esm/utils.js +29 -0
- package/hbsig/dist/package.json +39 -0
- package/hbsig/make.js +36 -0
- package/hbsig/package.json +39 -0
- package/hbsig/src/bin_to_str.js +46 -0
- package/hbsig/src/collect-body-keys.js +436 -0
- package/hbsig/src/commit.js +219 -0
- package/hbsig/src/encode-array-item.js +112 -0
- package/hbsig/src/encode-utils.js +191 -0
- package/hbsig/src/encode.js +1256 -0
- package/hbsig/src/erl_json.js +292 -0
- package/hbsig/src/erl_str.js +1144 -0
- package/hbsig/src/flat.js +250 -0
- package/hbsig/src/http-message-signatures/httpbis.js +438 -0
- package/hbsig/src/http-message-signatures/index.js +4 -0
- package/hbsig/src/http-message-signatures/structured-header.js +105 -0
- package/hbsig/src/httpsig.js +866 -0
- package/hbsig/src/id.js +459 -0
- package/hbsig/src/index.js +13 -0
- package/hbsig/src/nocrypto.js +4 -0
- package/hbsig/src/parser.js +171 -0
- package/hbsig/src/send-utils.js +1132 -0
- package/hbsig/src/send.js +142 -0
- package/hbsig/src/signer-utils.js +375 -0
- package/hbsig/src/signer.js +312 -0
- package/hbsig/src/structured.js +496 -0
- package/hbsig/src/test.js +2 -0
- package/hbsig/src/utils.js +29 -0
- package/lp/index.html +25 -0
- package/lp/package.json +19 -0
- package/lp/public/cover.png +0 -0
- package/lp/public/favicon.ico +0 -0
- package/lp/public/favicon.png +0 -0
- package/lp/public/images/book.jpg +0 -0
- package/lp/public/images/dashboard.png +0 -0
- package/lp/public/images/devnet.png +0 -0
- package/lp/public/images/hero-bg.png +0 -0
- package/lp/public/images/hyperadd.png +0 -0
- package/lp/public/images/message-flow.png +0 -0
- package/lp/public/images/mobile.png +0 -0
- package/lp/public/images/og-cover.png +0 -0
- package/lp/public/images/scan.png +0 -0
- package/lp/public/images/wao-hub.png +0 -0
- package/lp/public/images/wao-web.png +0 -0
- package/lp/public/logo.png +0 -0
- package/lp/src/App.jsx +29 -0
- package/lp/src/components/CodeBlock.jsx +37 -0
- package/lp/src/components/CodeBlock.module.css +89 -0
- package/lp/src/components/Footer.jsx +22 -0
- package/lp/src/components/Footer.module.css +60 -0
- package/lp/src/components/Nav.jsx +80 -0
- package/lp/src/components/Nav.module.css +177 -0
- package/lp/src/components/SectionWrapper.jsx +15 -0
- package/lp/src/hooks/useReveal.js +25 -0
- package/lp/src/hooks/useScrolled.js +14 -0
- package/lp/src/main.jsx +10 -0
- package/lp/src/sections/Book.jsx +60 -0
- package/lp/src/sections/Book.module.css +204 -0
- package/lp/src/sections/Browser.jsx +46 -0
- package/lp/src/sections/Browser.module.css +67 -0
- package/lp/src/sections/Devnet.jsx +55 -0
- package/lp/src/sections/Devnet.module.css +136 -0
- package/lp/src/sections/GetStarted.jsx +51 -0
- package/lp/src/sections/GetStarted.module.css +128 -0
- package/lp/src/sections/Hero.jsx +67 -0
- package/lp/src/sections/Hero.module.css +202 -0
- package/lp/src/sections/HyperADD.jsx +46 -0
- package/lp/src/sections/HyperADD.module.css +113 -0
- package/lp/src/sections/SDK.jsx +90 -0
- package/lp/src/sections/SDK.module.css +122 -0
- package/lp/src/sections/Testing.jsx +47 -0
- package/lp/src/sections/Testing.module.css +124 -0
- package/lp/src/sections/Vision.jsx +93 -0
- package/lp/src/sections/Vision.module.css +147 -0
- package/lp/src/styles/globals.css +285 -0
- package/lp/src/utils/scrollTo.js +4 -0
- package/lp/vite.config.js +7 -0
- package/make.js +39 -0
- package/package.json +17 -12
- package/patches/@permaweb+ao-loader+0.0.44.patch +64 -0
- package/plan.md +435 -0
- package/rebar.lock +1 -0
- package/src/accounts-web.js +128 -0
- package/src/accounts.js +124 -0
- package/src/adaptor-base.js +622 -0
- package/src/adaptor-cf.js +11 -0
- package/src/adaptor-web.js +11 -0
- package/src/adaptor.js +10 -0
- package/src/ao-loader.js +30660 -0
- package/src/ao.js +1173 -0
- package/src/aoconnect-base.js +1098 -0
- package/src/aoconnect-cf.js +9 -0
- package/src/aoconnect-web.js +8 -0
- package/src/aoconnect.js +8 -0
- package/src/aos_wamr.js +1 -0
- package/src/ar-remote.js +87 -0
- package/src/ar.js +276 -0
- package/src/armem-base.js +529 -0
- package/src/armem-cf.js +67 -0
- package/src/armem-web.js +19 -0
- package/src/armem.js +26 -0
- package/src/bao.js +141 -0
- package/src/bar.js +366 -0
- package/src/build.js +7 -0
- package/src/bundler.js +119 -0
- package/src/car.js +10 -0
- package/src/cf-env.js +29 -0
- package/src/cf.js +11 -0
- package/src/cli.js +561 -0
- package/src/compress.js +112 -0
- package/src/create.js +415 -0
- package/src/devs.js +86 -0
- package/src/dirname.js +1 -0
- package/src/dodb.js +26 -0
- package/src/erl_json.js +289 -0
- package/src/erl_str.js +1139 -0
- package/src/gql.js +229 -0
- package/src/hb.js +967 -0
- package/src/helpers.js +203 -0
- package/src/http.js +619 -0
- package/src/hub/bundler.js +123 -0
- package/src/hub/cu.js +74 -0
- package/src/hub/fs.js +157 -0
- package/src/hub/index.js +85 -0
- package/src/hub/utils.js +64 -0
- package/src/hub/ws-proxy.js +67 -0
- package/src/hyper-aos.js +1 -0
- package/src/hyperbeam-server.js +21 -0
- package/src/hyperbeam.js +585 -0
- package/src/index.js +5 -0
- package/src/keygen.js +47 -0
- package/src/lfdb.js +67 -0
- package/src/lua/aos.wasm +0 -0
- package/src/lua/aos2_0_1.js +1 -0
- package/src/lua/aos2_0_1.wasm +0 -0
- package/src/lua/aos2_0_3.js +1 -0
- package/src/lua/aos2_0_3.wasm +0 -0
- package/src/lua/aos2_0_4_32.js +1 -0
- package/src/lua/aos2_0_4_32.wasm +0 -0
- package/src/lua/aos2_0_6.wasm +0 -0
- package/src/lua/apm.lua +61 -0
- package/src/lua/llama.wasm +0 -0
- package/src/lua/process.wasm +0 -0
- package/src/lua/sqlite.js +1 -0
- package/src/lua/sqlite.wasm +0 -0
- package/src/lua/weavedb_mock.lua +44 -0
- package/src/lua/weavedrive.lua +53 -0
- package/src/run.js +25 -0
- package/src/server.js +173 -0
- package/src/storage-multi.js +183 -0
- package/src/tao.js +12 -0
- package/src/tar.js +10 -0
- package/src/test.js +42 -0
- package/src/tgql-d1.js +407 -0
- package/src/tgql.js +310 -0
- package/src/toerl.js +162 -0
- package/src/utils.js +777 -0
- package/src/wao.js +29 -0
- package/src/waosm/README.md +81 -0
- package/src/waosm/waosm.d.ts +40 -0
- package/src/waosm/waosm.js +240 -0
- package/src/waosm/waosm_bg.wasm +0 -0
- package/src/waosm/waosm_bg.wasm.d.ts +8 -0
- package/src/waosm-node/README.md +81 -0
- package/src/waosm-node/waosm.d.ts +8 -0
- package/src/waosm-node/waosm.js +4 -0
- package/src/waosm-node/waosm_bg.js +147 -0
- package/src/waosm-node/waosm_bg.wasm +0 -0
- package/src/waosm-node/waosm_bg.wasm.d.ts +8 -0
- package/src/waosm-node/waosm_bg.wasm.js +14 -0
- package/src/waosm-node.js +9 -0
- package/src/war.js +10 -0
- package/src/weavedrive.js +376 -0
- package/src/web.js +11 -0
- package/src/workspace/.mcp.json +8 -0
- package/src/workspace/CLAUDE.md +258 -0
- package/src/workspace/README.md +85 -0
- package/src/workspace/dashboard/index.html +163 -0
- package/src/workspace/dashboard/package.json +18 -0
- package/src/workspace/dashboard/public/favicon.ico +0 -0
- package/src/workspace/dashboard/public/favicon.png +0 -0
- package/src/workspace/dashboard/server.js +224 -0
- package/src/workspace/dashboard/src/App.jsx +2350 -0
- package/{cjs/workspace/frontend → src/workspace/dashboard}/vite.config.js +6 -0
- package/src/workspace/package.json +18 -0
- package/src/workspace/src/counter.lua +14 -0
- package/tsconfig.json +18 -0
- package/types/index.d.ts +329 -0
- package/waollama/.eslintrc.json +3 -0
- package/waollama/README.md +19 -0
- package/waollama/arweave.mjs +87 -0
- package/waollama/components/ui/avatar.jsx +49 -0
- package/waollama/components/ui/checkbox.jsx +17 -0
- package/waollama/components/ui/close-button.jsx +20 -0
- package/waollama/components/ui/color-mode.jsx +61 -0
- package/waollama/components/ui/dialog.jsx +54 -0
- package/waollama/components/ui/drawer.jsx +44 -0
- package/waollama/components/ui/field.jsx +22 -0
- package/waollama/components/ui/input-group.jsx +39 -0
- package/waollama/components/ui/popover.jsx +49 -0
- package/waollama/components/ui/provider.jsx +12 -0
- package/waollama/components/ui/radio.jsx +17 -0
- package/waollama/components/ui/slider.jsx +107 -0
- package/waollama/components/ui/tooltip.jsx +35 -0
- package/waollama/index.js +10 -0
- package/waollama/jsconfig.json +7 -0
- package/waollama/lib/ao-loader.js +30654 -0
- package/waollama/lib/client.js +1 -0
- package/waollama/lib/wasm.js +1 -0
- package/waollama/next.config.js +25 -0
- package/waollama/package.json +43 -0
- package/waollama/pages/404.js +9 -0
- package/waollama/pages/_app.js +9 -0
- package/waollama/pages/_document.js +14 -0
- package/waollama/pages/index.js +212 -0
- package/waollama/playwright.config.js +31 -0
- package/waollama/proxy.mjs +21 -0
- package/waollama/public/favicon.ico +0 -0
- package/waollama/public/human.png +0 -0
- package/waollama/public/llama.png +0 -0
- package/waosm/Cargo.toml +11 -0
- package/waosm/README.md +81 -0
- package/waosm/compress.js +112 -0
- package/waosm/make.js +33 -0
- package/waosm/package.json +10 -0
- package/waosm/src/lib.rs +180 -0
- package/waosm/test.js +16 -0
- package/cjs/workspace/.claude/agents/builder.md +0 -99
- package/cjs/workspace/.claude/agents/device-builder.md +0 -86
- package/cjs/workspace/.claude/agents/tester.md +0 -90
- package/cjs/workspace/.claude/mcp/dashboard/server.js +0 -128
- package/cjs/workspace/.claude/rules/deploy.md +0 -45
- package/cjs/workspace/.claude/rules/frontend.md +0 -69
- package/cjs/workspace/.claude/rules/hyperbeam.md +0 -104
- package/cjs/workspace/.claude/rules/lua.md +0 -108
- package/cjs/workspace/.claude/rules/testing.md +0 -257
- package/cjs/workspace/.claude/settings.json +0 -109
- package/cjs/workspace/.claude/skills/build/SKILL.md +0 -214
- package/cjs/workspace/.claude/skills/build-aos/SKILL.md +0 -129
- package/cjs/workspace/.claude/skills/build-device/SKILL.md +0 -192
- package/cjs/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
- package/cjs/workspace/.claude/skills/build-module/SKILL.md +0 -281
- package/cjs/workspace/.claude/skills/create-aos/SKILL.md +0 -63
- package/cjs/workspace/.claude/skills/create-device/SKILL.md +0 -87
- package/cjs/workspace/.claude/skills/create-module/SKILL.md +0 -162
- package/cjs/workspace/.claude/skills/debug/SKILL.md +0 -57
- package/cjs/workspace/.claude/skills/deploy/SKILL.md +0 -85
- package/cjs/workspace/.claude/skills/dev/SKILL.md +0 -32
- package/cjs/workspace/.claude/skills/plan/SKILL.md +0 -176
- package/cjs/workspace/.claude/skills/readme/SKILL.md +0 -186
- package/cjs/workspace/.claude/skills/report/SKILL.md +0 -49
- package/cjs/workspace/.claude/skills/team/SKILL.md +0 -101
- package/cjs/workspace/.claude/skills/test/SKILL.md +0 -56
- package/cjs/workspace/.claude/skills/test-device/SKILL.md +0 -114
- package/cjs/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
- package/cjs/workspace/.claude/skills/test-hb/SKILL.md +0 -76
- package/cjs/workspace/.claude/skills/validate/SKILL.md +0 -96
- package/cjs/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
- package/cjs/workspace/docs/aos-lua.md +0 -428
- package/cjs/workspace/docs/debug.md +0 -230
- package/cjs/workspace/docs/hyperbeam-dev.md +0 -606
- package/cjs/workspace/docs/hyperbeam-devices.md +0 -618
- package/cjs/workspace/docs/wao-sdk.md +0 -807
- package/cjs/workspace/frontend/e2e/.gitkeep +0 -0
- package/cjs/workspace/frontend/index.html +0 -12
- package/cjs/workspace/frontend/package.json +0 -24
- package/cjs/workspace/frontend/playwright.config.js +0 -10
- package/cjs/workspace/frontend/src/App.jsx +0 -24
- package/cjs/workspace/frontend/test/.gitkeep +0 -0
- package/cjs/workspace/frontend/vitest.config.js +0 -10
- package/cjs/workspace/scripts/deploy.js +0 -140
- package/cjs/workspace/scripts/keygen.js +0 -52
- package/cjs/workspace/test/aos.test.js +0 -98
- package/cjs/workspace/test/hyperbeam.test.js +0 -80
- package/esm/compiler/native +0 -0
- package/esm/workspace/.claude/agents/builder.md +0 -99
- package/esm/workspace/.claude/agents/device-builder.md +0 -86
- package/esm/workspace/.claude/agents/tester.md +0 -90
- package/esm/workspace/.claude/mcp/dashboard/server.js +0 -128
- package/esm/workspace/.claude/rules/deploy.md +0 -45
- package/esm/workspace/.claude/rules/frontend.md +0 -69
- package/esm/workspace/.claude/rules/hyperbeam.md +0 -104
- package/esm/workspace/.claude/rules/lua.md +0 -108
- package/esm/workspace/.claude/rules/testing.md +0 -257
- package/esm/workspace/.claude/settings.json +0 -109
- package/esm/workspace/.claude/skills/build/SKILL.md +0 -214
- package/esm/workspace/.claude/skills/build-aos/SKILL.md +0 -129
- package/esm/workspace/.claude/skills/build-device/SKILL.md +0 -192
- package/esm/workspace/.claude/skills/build-frontend/SKILL.md +0 -134
- package/esm/workspace/.claude/skills/build-module/SKILL.md +0 -281
- package/esm/workspace/.claude/skills/create-aos/SKILL.md +0 -63
- package/esm/workspace/.claude/skills/create-device/SKILL.md +0 -87
- package/esm/workspace/.claude/skills/create-module/SKILL.md +0 -162
- package/esm/workspace/.claude/skills/debug/SKILL.md +0 -57
- package/esm/workspace/.claude/skills/deploy/SKILL.md +0 -85
- package/esm/workspace/.claude/skills/dev/SKILL.md +0 -32
- package/esm/workspace/.claude/skills/plan/SKILL.md +0 -176
- package/esm/workspace/.claude/skills/readme/SKILL.md +0 -186
- package/esm/workspace/.claude/skills/report/SKILL.md +0 -49
- package/esm/workspace/.claude/skills/team/SKILL.md +0 -101
- package/esm/workspace/.claude/skills/test/SKILL.md +0 -56
- package/esm/workspace/.claude/skills/test-device/SKILL.md +0 -114
- package/esm/workspace/.claude/skills/test-e2e/SKILL.md +0 -103
- package/esm/workspace/.claude/skills/test-hb/SKILL.md +0 -76
- package/esm/workspace/.claude/skills/validate/SKILL.md +0 -96
- package/esm/workspace/.claude/skills/validate/scripts/check-lua.sh +0 -41
- package/esm/workspace/docs/aos-lua.md +0 -428
- package/esm/workspace/docs/debug.md +0 -230
- package/esm/workspace/docs/hyperbeam-dev.md +0 -606
- package/esm/workspace/docs/hyperbeam-devices.md +0 -618
- package/esm/workspace/docs/wao-sdk.md +0 -807
- package/esm/workspace/frontend/e2e/.gitkeep +0 -0
- package/esm/workspace/frontend/index.html +0 -12
- package/esm/workspace/frontend/package.json +0 -24
- package/esm/workspace/frontend/playwright.config.js +0 -10
- package/esm/workspace/frontend/src/App.jsx +0 -24
- package/esm/workspace/frontend/src/main.jsx +0 -9
- package/esm/workspace/frontend/test/.gitkeep +0 -0
- package/esm/workspace/frontend/vite.config.js +0 -6
- package/esm/workspace/frontend/vitest.config.js +0 -10
- package/esm/workspace/scripts/deploy.js +0 -140
- package/esm/workspace/scripts/keygen.js +0 -52
- package/esm/workspace/test/aos.test.js +0 -98
- package/esm/workspace/test/hyperbeam.test.js +0 -80
- /package/{cjs/workspace/dashboard/public → devnet/app}/favicon.ico +0 -0
- /package/{cjs/workspace → dhfs-tutorial-app}/src/counter.lua +0 -0
- /package/{cjs → dist/cjs}/accounts-web.js +0 -0
- /package/{cjs → dist/cjs}/accounts.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-base.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-cf.js +0 -0
- /package/{cjs → dist/cjs}/adaptor-web.js +0 -0
- /package/{cjs → dist/cjs}/adaptor.js +0 -0
- /package/{cjs → dist/cjs}/ao-loader.js +0 -0
- /package/{cjs → dist/cjs}/ao.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-base.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-cf.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect-web.js +0 -0
- /package/{cjs → dist/cjs}/aoconnect.js +0 -0
- /package/{cjs → dist/cjs}/aos_wamr.js +0 -0
- /package/{cjs → dist/cjs}/ar-remote.js +0 -0
- /package/{cjs → dist/cjs}/ar.js +0 -0
- /package/{cjs → dist/cjs}/armem-base.js +0 -0
- /package/{cjs → dist/cjs}/armem-cf.js +0 -0
- /package/{cjs → dist/cjs}/armem-web.js +0 -0
- /package/{cjs → dist/cjs}/armem.js +0 -0
- /package/{cjs → dist/cjs}/bao.js +0 -0
- /package/{cjs → dist/cjs}/bar.js +0 -0
- /package/{cjs → dist/cjs}/build.js +0 -0
- /package/{cjs → dist/cjs}/bundler.js +0 -0
- /package/{cjs → dist/cjs}/car.js +0 -0
- /package/{cjs → dist/cjs}/cf-env.js +0 -0
- /package/{cjs → dist/cjs}/cf.js +0 -0
- /package/{cjs → dist/cjs}/cli.js +0 -0
- /package/{cjs → dist/cjs}/compress.js +0 -0
- /package/{cjs → dist/cjs}/create.js +0 -0
- /package/{cjs → dist/cjs}/devs.js +0 -0
- /package/{cjs → dist/cjs}/dirname.js +0 -0
- /package/{cjs → dist/cjs}/dodb.js +0 -0
- /package/{cjs → dist/cjs}/erl_json.js +0 -0
- /package/{cjs → dist/cjs}/erl_str.js +0 -0
- /package/{cjs → dist/cjs}/gql.js +0 -0
- /package/{cjs → dist/cjs}/hb.js +0 -0
- /package/{cjs → dist/cjs}/helpers.js +0 -0
- /package/{cjs → dist/cjs}/http.js +0 -0
- /package/{cjs → dist/cjs}/hub/bundler.js +0 -0
- /package/{cjs → dist/cjs}/hub/cu.js +0 -0
- /package/{cjs → dist/cjs}/hub/fs.js +0 -0
- /package/{cjs → dist/cjs}/hub/index.js +0 -0
- /package/{cjs → dist/cjs}/hub/utils.js +0 -0
- /package/{cjs → dist/cjs}/hub/ws-proxy.js +0 -0
- /package/{cjs → dist/cjs}/hyper-aos.js +0 -0
- /package/{cjs → dist/cjs}/hyperbeam-server.js +0 -0
- /package/{cjs → dist/cjs}/hyperbeam.js +0 -0
- /package/{cjs → dist/cjs}/index.js +0 -0
- /package/{cjs → dist/cjs}/keygen.js +0 -0
- /package/{cjs → dist/cjs}/lfdb.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_1.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_1.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_3.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_3.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_4_32.js +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_4_32.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/aos2_0_6.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/apm.lua +0 -0
- /package/{cjs → dist/cjs}/lua/llama.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/process.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/sqlite.js +0 -0
- /package/{cjs → dist/cjs}/lua/sqlite.wasm +0 -0
- /package/{cjs → dist/cjs}/lua/weavedb_mock.lua +0 -0
- /package/{cjs → dist/cjs}/lua/weavedrive.lua +0 -0
- /package/{cjs → dist/cjs}/run.js +0 -0
- /package/{cjs → dist/cjs}/server.js +0 -0
- /package/{cjs → dist/cjs}/storage-multi.js +0 -0
- /package/{cjs → dist/cjs}/tao.js +0 -0
- /package/{cjs → dist/cjs}/tar.js +0 -0
- /package/{cjs → dist/cjs}/test.js +0 -0
- /package/{cjs → dist/cjs}/tgql-d1.js +0 -0
- /package/{cjs → dist/cjs}/tgql.js +0 -0
- /package/{cjs → dist/cjs}/toerl.js +0 -0
- /package/{cjs → dist/cjs}/utils.js +0 -0
- /package/{cjs → dist/cjs}/wao.js +0 -0
- /package/{cjs → dist/cjs}/waosm/waosm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm +0 -0
- /package/{cjs → dist/cjs}/waosm-node/waosm_bg.wasm.js +0 -0
- /package/{cjs → dist/cjs}/waosm-node.js +0 -0
- /package/{cjs → dist/cjs}/war.js +0 -0
- /package/{cjs → dist/cjs}/weavedrive.js +0 -0
- /package/{cjs → dist/cjs}/web.js +0 -0
- /package/{cjs → dist/cjs}/workspace/.mcp.json +0 -0
- /package/{cjs → dist/cjs}/workspace/CLAUDE.md +0 -0
- /package/{cjs → dist/cjs}/workspace/README.md +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/index.html +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/package.json +0 -0
- /package/{esm → dist/cjs}/workspace/dashboard/public/favicon.ico +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/public/favicon.png +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/server.js +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/src/App.jsx +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/src/main.jsx +0 -0
- /package/{cjs → dist/cjs}/workspace/dashboard/vite.config.js +0 -0
- /package/{cjs → dist/cjs}/workspace/package.json +0 -0
- /package/{esm → dist/cjs}/workspace/src/counter.lua +0 -0
- /package/{esm → dist/esm}/accounts-web.js +0 -0
- /package/{esm → dist/esm}/accounts.js +0 -0
- /package/{esm → dist/esm}/adaptor-base.js +0 -0
- /package/{esm → dist/esm}/adaptor-cf.js +0 -0
- /package/{esm → dist/esm}/adaptor-web.js +0 -0
- /package/{esm → dist/esm}/adaptor.js +0 -0
- /package/{esm → dist/esm}/ao-loader.js +0 -0
- /package/{esm → dist/esm}/ao.js +0 -0
- /package/{esm → dist/esm}/aoconnect-base.js +0 -0
- /package/{esm → dist/esm}/aoconnect-cf.js +0 -0
- /package/{esm → dist/esm}/aoconnect-web.js +0 -0
- /package/{esm → dist/esm}/aoconnect.js +0 -0
- /package/{esm → dist/esm}/aos_wamr.js +0 -0
- /package/{esm → dist/esm}/ar-remote.js +0 -0
- /package/{esm → dist/esm}/ar.js +0 -0
- /package/{esm → dist/esm}/armem-base.js +0 -0
- /package/{esm → dist/esm}/armem-cf.js +0 -0
- /package/{esm → dist/esm}/armem-web.js +0 -0
- /package/{esm → dist/esm}/armem.js +0 -0
- /package/{esm → dist/esm}/bao.js +0 -0
- /package/{esm → dist/esm}/bar.js +0 -0
- /package/{esm → dist/esm}/build.js +0 -0
- /package/{esm → dist/esm}/bundler.js +0 -0
- /package/{esm → dist/esm}/car.js +0 -0
- /package/{esm → dist/esm}/cf-env.js +0 -0
- /package/{esm → dist/esm}/cf.js +0 -0
- /package/{esm → dist/esm}/cli.js +0 -0
- /package/{esm → dist/esm}/compress.js +0 -0
- /package/{esm → dist/esm}/create.js +0 -0
- /package/{esm → dist/esm}/devs.js +0 -0
- /package/{esm → dist/esm}/dirname.js +0 -0
- /package/{esm → dist/esm}/dodb.js +0 -0
- /package/{esm → dist/esm}/erl_json.js +0 -0
- /package/{esm → dist/esm}/erl_str.js +0 -0
- /package/{esm → dist/esm}/gql.js +0 -0
- /package/{esm → dist/esm}/hb.js +0 -0
- /package/{esm → dist/esm}/helpers.js +0 -0
- /package/{esm → dist/esm}/http.js +0 -0
- /package/{esm → dist/esm}/hub/bundler.js +0 -0
- /package/{esm → dist/esm}/hub/cu.js +0 -0
- /package/{esm → dist/esm}/hub/fs.js +0 -0
- /package/{esm → dist/esm}/hub/index.js +0 -0
- /package/{esm → dist/esm}/hub/utils.js +0 -0
- /package/{esm → dist/esm}/hub/ws-proxy.js +0 -0
- /package/{esm → dist/esm}/hyper-aos.js +0 -0
- /package/{esm → dist/esm}/hyperbeam-server.js +0 -0
- /package/{esm → dist/esm}/hyperbeam.js +0 -0
- /package/{esm → dist/esm}/index.js +0 -0
- /package/{esm → dist/esm}/keygen.js +0 -0
- /package/{esm → dist/esm}/lfdb.js +0 -0
- /package/{esm → dist/esm}/lua/aos.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_1.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_1.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_3.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_3.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_4_32.js +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_4_32.wasm +0 -0
- /package/{esm → dist/esm}/lua/aos2_0_6.wasm +0 -0
- /package/{esm → dist/esm}/lua/apm.lua +0 -0
- /package/{esm → dist/esm}/lua/llama.wasm +0 -0
- /package/{esm → dist/esm}/lua/process.wasm +0 -0
- /package/{esm → dist/esm}/lua/sqlite.js +0 -0
- /package/{esm → dist/esm}/lua/sqlite.wasm +0 -0
- /package/{esm → dist/esm}/lua/weavedb_mock.lua +0 -0
- /package/{esm → dist/esm}/lua/weavedrive.lua +0 -0
- /package/{esm → dist/esm}/package.json +0 -0
- /package/{esm → dist/esm}/run.js +0 -0
- /package/{esm → dist/esm}/server.js +0 -0
- /package/{esm → dist/esm}/storage-multi.js +0 -0
- /package/{esm → dist/esm}/tao.js +0 -0
- /package/{esm → dist/esm}/tar.js +0 -0
- /package/{esm → dist/esm}/test.js +0 -0
- /package/{esm → dist/esm}/tgql-d1.js +0 -0
- /package/{esm → dist/esm}/tgql.js +0 -0
- /package/{esm → dist/esm}/toerl.js +0 -0
- /package/{esm → dist/esm}/utils.js +0 -0
- /package/{esm → dist/esm}/wao.js +0 -0
- /package/{esm → dist/esm}/waosm/README.md +0 -0
- /package/{esm → dist/esm}/waosm/waosm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm/waosm.js +0 -0
- /package/{esm → dist/esm}/waosm/waosm_bg.wasm +0 -0
- /package/{esm → dist/esm}/waosm/waosm_bg.wasm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/README.md +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm.js +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.js +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.d.ts +0 -0
- /package/{esm → dist/esm}/waosm-node/waosm_bg.wasm.js +0 -0
- /package/{esm → dist/esm}/waosm-node.js +0 -0
- /package/{esm → dist/esm}/war.js +0 -0
- /package/{esm → dist/esm}/weavedrive.js +0 -0
- /package/{esm → dist/esm}/web.js +0 -0
- /package/{esm → dist/esm}/workspace/.mcp.json +0 -0
- /package/{esm → dist/esm}/workspace/CLAUDE.md +0 -0
- /package/{esm → dist/esm}/workspace/README.md +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/index.html +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/package.json +0 -0
- /package/{esm/workspace/dashboard/public/favicon.png → dist/esm/workspace/dashboard/public/favicon.ico} +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/server.js +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/src/App.jsx +0 -0
- /package/{cjs/workspace/frontend → dist/esm/workspace/dashboard}/src/main.jsx +0 -0
- /package/{esm → dist/esm}/workspace/dashboard/vite.config.js +0 -0
- /package/{esm → dist/esm}/workspace/package.json +0 -0
- /package/{postinstall.cjs → dist/postinstall.cjs} +0 -0
- /package/{esm → src}/workspace/dashboard/src/main.jsx +0 -0
|
@@ -0,0 +1,861 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.httpsig_from = httpsig_from;
|
|
7
|
+
exports.httpsig_to = httpsig_to;
|
|
8
|
+
exports.structured_from = structured_from;
|
|
9
|
+
exports.structured_to = structured_to;
|
|
10
|
+
var _fastSha = require("fast-sha256");
|
|
11
|
+
var _flat = require("./flat.js");
|
|
12
|
+
var _structured = require("./structured.js");
|
|
13
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
14
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
17
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
18
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
19
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
20
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
21
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
22
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
23
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
24
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
25
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } // httpsig.js - JavaScript implementation of HTTP Signature codec
|
|
26
|
+
var CRLF = "\r\n";
|
|
27
|
+
var DOUBLE_CRLF = CRLF + CRLF;
|
|
28
|
+
var MAX_HEADER_LENGTH = 4096;
|
|
29
|
+
|
|
30
|
+
// Helper to convert string to Uint8Array
|
|
31
|
+
function stringToBytes(str) {
|
|
32
|
+
var encoding = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "utf8";
|
|
33
|
+
if (encoding === "binary") {
|
|
34
|
+
var bytes = new Uint8Array(str.length);
|
|
35
|
+
for (var i = 0; i < str.length; i++) {
|
|
36
|
+
bytes[i] = str.charCodeAt(i) & 0xff;
|
|
37
|
+
}
|
|
38
|
+
return bytes;
|
|
39
|
+
}
|
|
40
|
+
return new TextEncoder().encode(str);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Helper to convert bytes to base64url
|
|
44
|
+
function bytesToBase64url(bytes) {
|
|
45
|
+
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
|
46
|
+
var result = "";
|
|
47
|
+
for (var i = 0; i < bytes.length; i += 3) {
|
|
48
|
+
var a = bytes[i];
|
|
49
|
+
var b = i + 1 < bytes.length ? bytes[i + 1] : 0;
|
|
50
|
+
var c = i + 2 < bytes.length ? bytes[i + 2] : 0;
|
|
51
|
+
var combined = a << 16 | b << 8 | c;
|
|
52
|
+
result += chars[combined >> 18 & 0x3f];
|
|
53
|
+
result += chars[combined >> 12 & 0x3f];
|
|
54
|
+
if (i + 1 < bytes.length) result += chars[combined >> 6 & 0x3f];
|
|
55
|
+
if (i + 2 < bytes.length) result += chars[combined & 0x3f];
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Helper to convert bytes to base64
|
|
61
|
+
function bytesToBase64(bytes) {
|
|
62
|
+
var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
63
|
+
var result = "";
|
|
64
|
+
for (var i = 0; i < bytes.length; i += 3) {
|
|
65
|
+
var a = bytes[i];
|
|
66
|
+
var b = i + 1 < bytes.length ? bytes[i + 1] : 0;
|
|
67
|
+
var c = i + 2 < bytes.length ? bytes[i + 2] : 0;
|
|
68
|
+
var combined = a << 16 | b << 8 | c;
|
|
69
|
+
result += chars[combined >> 18 & 0x3f];
|
|
70
|
+
result += chars[combined >> 12 & 0x3f];
|
|
71
|
+
result += i + 1 < bytes.length ? chars[combined >> 6 & 0x3f] : "=";
|
|
72
|
+
result += i + 2 < bytes.length ? chars[combined & 0x3f] : "=";
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Helper to normalize keys (lowercase only, no underscore conversion)
|
|
78
|
+
function normalizeKey(key) {
|
|
79
|
+
if (typeof key === "string") {
|
|
80
|
+
return key.toLowerCase();
|
|
81
|
+
}
|
|
82
|
+
return String(key).toLowerCase();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Helper to check if a value is an ID (43 character base64url string)
|
|
86
|
+
function isId(value) {
|
|
87
|
+
return typeof value === "string" && value.length === 43 && /^[A-Za-z0-9_-]+$/.test(value);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Helper to encode structured field dictionary
|
|
91
|
+
function encodeSfDict(dict) {
|
|
92
|
+
var items = [];
|
|
93
|
+
for (var _i = 0, _Object$entries = Object.entries(dict); _i < _Object$entries.length; _i++) {
|
|
94
|
+
var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
95
|
+
key = _Object$entries$_i[0],
|
|
96
|
+
value = _Object$entries$_i[1];
|
|
97
|
+
if (typeof value === "string") {
|
|
98
|
+
items.push("".concat(key, "=\"").concat(value, "\""));
|
|
99
|
+
} else {
|
|
100
|
+
items.push("".concat(key, "=").concat(value));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return items.join(", ");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Helper to parse structured field dictionary
|
|
107
|
+
function parseSfDict(str) {
|
|
108
|
+
var dict = {};
|
|
109
|
+
if (!str) return dict;
|
|
110
|
+
var parts = str.split(/,\s*/);
|
|
111
|
+
var _iterator = _createForOfIteratorHelper(parts),
|
|
112
|
+
_step;
|
|
113
|
+
try {
|
|
114
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
115
|
+
var part = _step.value;
|
|
116
|
+
var match = part.match(/^([^=]+)=(.+)$/);
|
|
117
|
+
if (match) {
|
|
118
|
+
var key = match[1].trim();
|
|
119
|
+
var value = match[2].trim();
|
|
120
|
+
if (value.startsWith('"') && value.endsWith('"')) {
|
|
121
|
+
value = value.slice(1, -1);
|
|
122
|
+
}
|
|
123
|
+
dict[key] = value;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
} catch (err) {
|
|
127
|
+
_iterator.e(err);
|
|
128
|
+
} finally {
|
|
129
|
+
_iterator.f();
|
|
130
|
+
}
|
|
131
|
+
return dict;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Helper to generate boundary from parts using fast-sha256
|
|
135
|
+
function boundaryFromParts(parts) {
|
|
136
|
+
var bodyBin = parts.map(function (p) {
|
|
137
|
+
return p.body;
|
|
138
|
+
}).join(CRLF);
|
|
139
|
+
var hashBytes = (0, _fastSha.hash)(stringToBytes(bodyBin, "binary"));
|
|
140
|
+
return bytesToBase64url(hashBytes);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Helper to determine inline key - matches Erlang's inline_key/2
|
|
144
|
+
function inlineKey(msg) {
|
|
145
|
+
// Check for ao-body-key (Erlang uses ao-body-key, not inline-body-key)
|
|
146
|
+
var aoBodyKey = msg["ao-body-key"];
|
|
147
|
+
if (aoBodyKey) {
|
|
148
|
+
return [{}, aoBodyKey];
|
|
149
|
+
}
|
|
150
|
+
if ("body" in msg) {
|
|
151
|
+
return [{}, "body"];
|
|
152
|
+
}
|
|
153
|
+
if ("data" in msg) {
|
|
154
|
+
return [{
|
|
155
|
+
"ao-body-key": "data"
|
|
156
|
+
}, "data"];
|
|
157
|
+
}
|
|
158
|
+
return [{}, "body"];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Group IDs into ao-ids field
|
|
162
|
+
function groupIds(map) {
|
|
163
|
+
var idDict = {};
|
|
164
|
+
var stripped = {};
|
|
165
|
+
for (var _i2 = 0, _Object$entries2 = Object.entries(map); _i2 < _Object$entries2.length; _i2++) {
|
|
166
|
+
var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2),
|
|
167
|
+
key = _Object$entries2$_i[0],
|
|
168
|
+
value = _Object$entries2$_i[1];
|
|
169
|
+
if (isId(key) && typeof value === "string") {
|
|
170
|
+
// Store with lowercase key as in Erlang
|
|
171
|
+
idDict[key.toLowerCase()] = value;
|
|
172
|
+
} else {
|
|
173
|
+
stripped[key] = value;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (Object.keys(idDict).length > 0) {
|
|
177
|
+
var items = [];
|
|
178
|
+
for (var _i3 = 0, _Object$entries3 = Object.entries(idDict); _i3 < _Object$entries3.length; _i3++) {
|
|
179
|
+
var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2),
|
|
180
|
+
k = _Object$entries3$_i[0],
|
|
181
|
+
v = _Object$entries3$_i[1];
|
|
182
|
+
items.push("".concat(k, "=\"").concat(v, "\""));
|
|
183
|
+
}
|
|
184
|
+
stripped["ao-ids"] = items.join(", ");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Return IDs as lowercase in the result since they will be normalized
|
|
188
|
+
// when processed as headers
|
|
189
|
+
for (var _i4 = 0, _Object$entries4 = Object.entries(idDict); _i4 < _Object$entries4.length; _i4++) {
|
|
190
|
+
var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i4], 2),
|
|
191
|
+
_k = _Object$entries4$_i[0],
|
|
192
|
+
_v = _Object$entries4$_i[1];
|
|
193
|
+
stripped[_k] = _v;
|
|
194
|
+
}
|
|
195
|
+
return stripped;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Ungroup IDs from ao-ids field
|
|
199
|
+
function ungroupIds(msg) {
|
|
200
|
+
if (!msg["ao-ids"]) return msg;
|
|
201
|
+
var result = _objectSpread({}, msg);
|
|
202
|
+
delete result["ao-ids"];
|
|
203
|
+
var dict = parseSfDict(msg["ao-ids"]);
|
|
204
|
+
for (var _i5 = 0, _Object$entries5 = Object.entries(dict); _i5 < _Object$entries5.length; _i5++) {
|
|
205
|
+
var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i5], 2),
|
|
206
|
+
key = _Object$entries5$_i[0],
|
|
207
|
+
value = _Object$entries5$_i[1];
|
|
208
|
+
// ao-ids keys are lowercase, use them as-is
|
|
209
|
+
result[key] = value;
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Get the size of a map (matches Erlang's maps:size behavior)
|
|
215
|
+
// This counts ALL keys including ao-types - empty means literally {}
|
|
216
|
+
function mapSize(obj) {
|
|
217
|
+
if (_typeof(obj) !== "object" || obj === null) return 0;
|
|
218
|
+
return Object.keys(obj).length;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Group maps for body encoding - following Erlang logic exactly
|
|
222
|
+
function groupMaps(map) {
|
|
223
|
+
var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
|
|
224
|
+
var top = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
225
|
+
if (_typeof(map) !== "object" || map === null || Array.isArray(map) || Buffer.isBuffer(map)) {
|
|
226
|
+
return top;
|
|
227
|
+
}
|
|
228
|
+
var flattened = {};
|
|
229
|
+
var newTop = _objectSpread({}, top);
|
|
230
|
+
|
|
231
|
+
// Process entries in sorted order for consistency
|
|
232
|
+
var entries = Object.entries(map).sort(function (_ref, _ref2) {
|
|
233
|
+
var _ref3 = _slicedToArray(_ref, 1),
|
|
234
|
+
a = _ref3[0];
|
|
235
|
+
var _ref4 = _slicedToArray(_ref2, 1),
|
|
236
|
+
b = _ref4[0];
|
|
237
|
+
return a.localeCompare(b);
|
|
238
|
+
});
|
|
239
|
+
var _iterator2 = _createForOfIteratorHelper(entries),
|
|
240
|
+
_step2;
|
|
241
|
+
try {
|
|
242
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
243
|
+
var _step2$value = _slicedToArray(_step2.value, 2),
|
|
244
|
+
key = _step2$value[0],
|
|
245
|
+
value = _step2$value[1];
|
|
246
|
+
// Normalize keys to lowercase
|
|
247
|
+
var normKey = normalizeKey(key);
|
|
248
|
+
var flatK = parent ? "".concat(parent, "/").concat(normKey) : normKey;
|
|
249
|
+
if (_typeof(value) === "object" && value !== null && !Array.isArray(value) && !Buffer.isBuffer(value)) {
|
|
250
|
+
// Check size of the nested object (including metadata keys like ao-types)
|
|
251
|
+
// Empty means literally {} - a map with only ao-types is NOT empty
|
|
252
|
+
var size = mapSize(value);
|
|
253
|
+
if (size === 0) {
|
|
254
|
+
// Empty map (no data keys) - add empty-message marker
|
|
255
|
+
// This matches Erlang's group_maps behavior for empty maps
|
|
256
|
+
newTop[flatK] = {
|
|
257
|
+
"ao-types": "empty-message"
|
|
258
|
+
};
|
|
259
|
+
} else {
|
|
260
|
+
// Recursively process nested objects
|
|
261
|
+
newTop = groupMaps(value, flatK, newTop);
|
|
262
|
+
}
|
|
263
|
+
} else if (typeof value === "string" && value.length > MAX_HEADER_LENGTH) {
|
|
264
|
+
// Value too large for header, lift to top level
|
|
265
|
+
newTop[flatK] = value;
|
|
266
|
+
} else if (Buffer.isBuffer(value) && value.length > MAX_HEADER_LENGTH) {
|
|
267
|
+
// Large buffers also get lifted to top level
|
|
268
|
+
newTop[flatK] = value;
|
|
269
|
+
} else {
|
|
270
|
+
// Keep in current flattened map
|
|
271
|
+
flattened[normKey] = value;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
} catch (err) {
|
|
275
|
+
_iterator2.e(err);
|
|
276
|
+
} finally {
|
|
277
|
+
_iterator2.f();
|
|
278
|
+
}
|
|
279
|
+
if (Object.keys(flattened).length === 0) {
|
|
280
|
+
return newTop;
|
|
281
|
+
} else if (parent) {
|
|
282
|
+
// Add flattened map under parent key
|
|
283
|
+
return _objectSpread(_objectSpread({}, newTop), {}, _defineProperty({}, parent, flattened));
|
|
284
|
+
} else {
|
|
285
|
+
// Merge flattened with top level
|
|
286
|
+
return _objectSpread(_objectSpread({}, newTop), flattened);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Helper to compute content-digest for a body value
|
|
291
|
+
function computePartDigest(bodyValue) {
|
|
292
|
+
var bodyBytes;
|
|
293
|
+
if (Buffer.isBuffer(bodyValue)) {
|
|
294
|
+
bodyBytes = new Uint8Array(bodyValue);
|
|
295
|
+
} else if (typeof bodyValue === "string") {
|
|
296
|
+
bodyBytes = stringToBytes(bodyValue, "binary");
|
|
297
|
+
} else {
|
|
298
|
+
bodyBytes = stringToBytes(String(bodyValue), "binary");
|
|
299
|
+
}
|
|
300
|
+
var hashBytes = (0, _fastSha.hash)(bodyBytes);
|
|
301
|
+
return "sha-256=:".concat(bytesToBase64(hashBytes), ":");
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Encode multipart body part
|
|
305
|
+
// NOTE: This matches Erlang's encode_body_part/4 which does NOT apply inline_key
|
|
306
|
+
// logic to nested parts. For nested maps, ALL fields become headers (except 'body'
|
|
307
|
+
// which becomes the part body). The inline_key logic is only for top-level messages.
|
|
308
|
+
function encodeBodyPart(partName, bodyPart, inlineKey) {
|
|
309
|
+
var disposition = partName === inlineKey ? "inline" : "form-data;name=\"".concat(partName, "\"");
|
|
310
|
+
if (_typeof(bodyPart) === "object" && bodyPart !== null && !Array.isArray(bodyPart) && !Buffer.isBuffer(bodyPart)) {
|
|
311
|
+
// Collect all headers (everything except 'body' and 'priv')
|
|
312
|
+
var allEntries = [];
|
|
313
|
+
for (var _i6 = 0, _Object$entries6 = Object.entries(bodyPart); _i6 < _Object$entries6.length; _i6++) {
|
|
314
|
+
var _Object$entries6$_i = _slicedToArray(_Object$entries6[_i6], 2),
|
|
315
|
+
key = _Object$entries6$_i[0],
|
|
316
|
+
value = _Object$entries6$_i[1];
|
|
317
|
+
if (key === "body" || key === "priv") continue;
|
|
318
|
+
|
|
319
|
+
// Handle Buffer values properly
|
|
320
|
+
var valueStr = value;
|
|
321
|
+
if (Buffer.isBuffer(value)) {
|
|
322
|
+
// Use binary/latin1 encoding to preserve all byte values 0-255
|
|
323
|
+
valueStr = value.toString("binary");
|
|
324
|
+
}
|
|
325
|
+
allEntries.push({
|
|
326
|
+
key: key,
|
|
327
|
+
line: "".concat(key, ": ").concat(valueStr)
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Add content-disposition
|
|
332
|
+
allEntries.push({
|
|
333
|
+
key: "content-disposition",
|
|
334
|
+
line: "content-disposition: ".concat(disposition)
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// Sort all entries by key alphabetically - matches Erlang behavior
|
|
338
|
+
allEntries.sort(function (a, b) {
|
|
339
|
+
return a.key.localeCompare(b.key);
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
// Build the lines
|
|
343
|
+
var lines = allEntries.map(function (entry) {
|
|
344
|
+
return entry.line;
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
// Only the 'body' field (if present) becomes the part body
|
|
348
|
+
var body = bodyPart.body;
|
|
349
|
+
if (body !== "" && body !== undefined && body !== null) {
|
|
350
|
+
lines.push(""); // Always add empty line before body
|
|
351
|
+
lines.push(Buffer.isBuffer(body) ? body.toString("binary") : String(body));
|
|
352
|
+
}
|
|
353
|
+
return lines.join(CRLF);
|
|
354
|
+
} else if (typeof bodyPart === "string" || Buffer.isBuffer(bodyPart)) {
|
|
355
|
+
// Use binary/latin1 encoding to preserve byte values 0-255
|
|
356
|
+
var bodyStr = Buffer.isBuffer(bodyPart) ? bodyPart.toString("binary") : bodyPart;
|
|
357
|
+
return "content-disposition: ".concat(disposition).concat(DOUBLE_CRLF).concat(bodyStr);
|
|
358
|
+
}
|
|
359
|
+
return "";
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Helper to detect if a Buffer contains binary data
|
|
363
|
+
function isBinaryData(buf) {
|
|
364
|
+
// Check first 512 bytes for binary indicators
|
|
365
|
+
var checkLength = Math.min(buf.length, 512);
|
|
366
|
+
|
|
367
|
+
// Any null byte means binary
|
|
368
|
+
for (var i = 0; i < checkLength; i++) {
|
|
369
|
+
if (buf[i] === 0) return true;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Count non-text bytes
|
|
373
|
+
var controlCount = 0;
|
|
374
|
+
var highByteCount = 0;
|
|
375
|
+
for (var _i7 = 0; _i7 < checkLength; _i7++) {
|
|
376
|
+
var _byte = buf[_i7];
|
|
377
|
+
// Non-printable chars (except CR/LF/TAB)
|
|
378
|
+
if (_byte < 32 && _byte !== 9 && _byte !== 10 && _byte !== 13) {
|
|
379
|
+
controlCount++;
|
|
380
|
+
}
|
|
381
|
+
// High byte range
|
|
382
|
+
if (_byte > 127) {
|
|
383
|
+
highByteCount++;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// If more than 5% are control chars, likely binary
|
|
388
|
+
if (controlCount / checkLength > 0.05) return true;
|
|
389
|
+
|
|
390
|
+
// If more than 20% are high bytes, likely binary
|
|
391
|
+
if (highByteCount / checkLength > 0.2) return true;
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Parse multipart body - handles binary data in headers
|
|
396
|
+
function parseMultipart(contentType, body) {
|
|
397
|
+
var boundaryMatch = contentType.match(/boundary="?([^";\s]+)"?/);
|
|
398
|
+
if (!boundaryMatch) return {};
|
|
399
|
+
var boundary = boundaryMatch[1];
|
|
400
|
+
var boundaryDelim = "--".concat(boundary);
|
|
401
|
+
var endBoundary = "--".concat(boundary, "--");
|
|
402
|
+
|
|
403
|
+
// Use binary encoding to preserve all bytes as character codes 0-255
|
|
404
|
+
var bodyContent = typeof body === "string" ? body : body.toString("binary");
|
|
405
|
+
if (bodyContent.endsWith(endBoundary)) {
|
|
406
|
+
bodyContent = bodyContent.substring(0, bodyContent.lastIndexOf(endBoundary));
|
|
407
|
+
}
|
|
408
|
+
var parts = bodyContent.split(new RegExp("\\r?\\n?".concat(boundaryDelim, "\\r?\\n"))).filter(function (p) {
|
|
409
|
+
return p && p.trim() && !p.startsWith("--");
|
|
410
|
+
});
|
|
411
|
+
var result = {};
|
|
412
|
+
var bodyKeysList = [];
|
|
413
|
+
var _iterator3 = _createForOfIteratorHelper(parts),
|
|
414
|
+
_step3;
|
|
415
|
+
try {
|
|
416
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
417
|
+
var part = _step3.value;
|
|
418
|
+
// First split to find the headers/body boundary (double CRLF)
|
|
419
|
+
var headerBodySplit = part.indexOf(DOUBLE_CRLF);
|
|
420
|
+
var headerBlock = void 0,
|
|
421
|
+
partBody = void 0;
|
|
422
|
+
if (headerBodySplit !== -1) {
|
|
423
|
+
headerBlock = part.substring(0, headerBodySplit);
|
|
424
|
+
partBody = part.substring(headerBodySplit + DOUBLE_CRLF.length);
|
|
425
|
+
// Remove trailing CRLF from body
|
|
426
|
+
partBody = partBody.replace(/\r?\n?$/, "");
|
|
427
|
+
} else {
|
|
428
|
+
headerBlock = part;
|
|
429
|
+
partBody = "";
|
|
430
|
+
}
|
|
431
|
+
var headers = {};
|
|
432
|
+
|
|
433
|
+
// Parse headers more carefully to handle binary data
|
|
434
|
+
var currentPos = 0;
|
|
435
|
+
while (currentPos < headerBlock.length) {
|
|
436
|
+
// Find the next colon to identify a potential header
|
|
437
|
+
var colonPos = headerBlock.indexOf(": ", currentPos);
|
|
438
|
+
if (colonPos === -1) {
|
|
439
|
+
// No more headers
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// Look backwards from colon to find the start of this line
|
|
444
|
+
var lineStart = currentPos;
|
|
445
|
+
var searchBack = colonPos - 1;
|
|
446
|
+
while (searchBack >= currentPos) {
|
|
447
|
+
if (headerBlock[searchBack] === "\n") {
|
|
448
|
+
lineStart = searchBack + 1;
|
|
449
|
+
break;
|
|
450
|
+
}
|
|
451
|
+
searchBack--;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Extract the header name
|
|
455
|
+
var name = headerBlock.substring(lineStart, colonPos).trim().toLowerCase();
|
|
456
|
+
|
|
457
|
+
// Check if this looks like a valid header name
|
|
458
|
+
if (!/^[a-zA-Z0-9-]+$/.test(name) || name.length > 50) {
|
|
459
|
+
// Not a valid header, skip past this colon
|
|
460
|
+
currentPos = colonPos + 2;
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
// Start of value is after ": "
|
|
465
|
+
var valueStart = colonPos + 2;
|
|
466
|
+
|
|
467
|
+
// Find the end of this header's value by looking for the next valid header
|
|
468
|
+
var valueEnd = headerBlock.length;
|
|
469
|
+
var searchPos = valueStart;
|
|
470
|
+
while (searchPos < headerBlock.length) {
|
|
471
|
+
var nextNewline = headerBlock.indexOf("\n", searchPos);
|
|
472
|
+
if (nextNewline === -1) break;
|
|
473
|
+
var nextLineStart = nextNewline + 1;
|
|
474
|
+
if (nextLineStart >= headerBlock.length) break;
|
|
475
|
+
|
|
476
|
+
// Check if next line starts with a header pattern
|
|
477
|
+
var nextColon = headerBlock.indexOf(": ", nextLineStart);
|
|
478
|
+
if (nextColon > nextLineStart && nextColon < nextLineStart + 50) {
|
|
479
|
+
var possibleHeaderName = headerBlock.substring(nextLineStart, nextColon).trim();
|
|
480
|
+
|
|
481
|
+
// Must be valid header name format
|
|
482
|
+
if (/^[a-zA-Z0-9-]+$/.test(possibleHeaderName)) {
|
|
483
|
+
valueEnd = nextNewline;
|
|
484
|
+
break;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
searchPos = nextNewline + 1;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// Extract the value - valueEnd points to \n which is NOT part of the value
|
|
491
|
+
var value = headerBlock.substring(valueStart, valueEnd);
|
|
492
|
+
|
|
493
|
+
// Determine if this is binary data FIRST (before trimming)
|
|
494
|
+
var isBinary = value.length > 0 && isBinaryData(Buffer.from(value, "binary"));
|
|
495
|
+
if (isBinary) {
|
|
496
|
+
// Binary data: only remove trailing \r if it's part of CRLF separator
|
|
497
|
+
// (when valueEnd points to \n and value ends with \r)
|
|
498
|
+
if (valueEnd < headerBlock.length && headerBlock[valueEnd] === "\n" && value.endsWith("\r")) {
|
|
499
|
+
value = value.substring(0, value.length - 1);
|
|
500
|
+
}
|
|
501
|
+
headers[name] = Buffer.from(value, "binary");
|
|
502
|
+
} else {
|
|
503
|
+
// Text data: remove all trailing CRLF/LF (these are line separators, not data)
|
|
504
|
+
value = value.replace(/[\r\n]+$/, "");
|
|
505
|
+
headers[name] = value;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Move to the end of this header's value
|
|
509
|
+
currentPos = valueEnd;
|
|
510
|
+
if (currentPos < headerBlock.length && headerBlock[currentPos] === "\n") {
|
|
511
|
+
currentPos++;
|
|
512
|
+
}
|
|
513
|
+
if (currentPos < headerBlock.length && headerBlock[currentPos] === "\r") {
|
|
514
|
+
currentPos++;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
var disposition = headers["content-disposition"];
|
|
518
|
+
if (!disposition) continue;
|
|
519
|
+
var partName = void 0;
|
|
520
|
+
if (disposition === "inline") {
|
|
521
|
+
// This is the inline part
|
|
522
|
+
partName = "body";
|
|
523
|
+
bodyKeysList.push("body");
|
|
524
|
+
|
|
525
|
+
// Extract all headers from inline part as top-level fields
|
|
526
|
+
var restHeaders = _objectSpread({}, headers);
|
|
527
|
+
delete restHeaders["content-disposition"];
|
|
528
|
+
|
|
529
|
+
// Add each header from the inline part to the top level of result
|
|
530
|
+
for (var _i8 = 0, _Object$entries7 = Object.entries(restHeaders); _i8 < _Object$entries7.length; _i8++) {
|
|
531
|
+
var _Object$entries7$_i = _slicedToArray(_Object$entries7[_i8], 2),
|
|
532
|
+
key = _Object$entries7$_i[0],
|
|
533
|
+
_value = _Object$entries7$_i[1];
|
|
534
|
+
result[key] = _value;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// If there's body content in the inline part, add it as 'body'
|
|
538
|
+
if (partBody) {
|
|
539
|
+
// Keep as string unless it's binary data
|
|
540
|
+
result[partName] = isBinaryData(Buffer.from(partBody, "binary")) ? Buffer.from(partBody, "binary") : partBody;
|
|
541
|
+
}
|
|
542
|
+
} else {
|
|
543
|
+
// Handle named form-data parts
|
|
544
|
+
var nameMatch = disposition.match(/name="([^"]+)"/);
|
|
545
|
+
partName = nameMatch ? nameMatch[1] : null;
|
|
546
|
+
if (partName) {
|
|
547
|
+
var topLevelKey = partName.split("/")[0];
|
|
548
|
+
bodyKeysList.push(topLevelKey);
|
|
549
|
+
}
|
|
550
|
+
if (!partName) continue;
|
|
551
|
+
var _restHeaders = _objectSpread({}, headers);
|
|
552
|
+
delete _restHeaders["content-disposition"];
|
|
553
|
+
if (Object.keys(_restHeaders).length === 0) {
|
|
554
|
+
// Keep as string unless it's binary data
|
|
555
|
+
result[partName] = isBinaryData(Buffer.from(partBody, "binary")) ? Buffer.from(partBody, "binary") : partBody;
|
|
556
|
+
} else if (!partBody) {
|
|
557
|
+
// ao-types should stay with this part, not be extracted
|
|
558
|
+
result[partName] = _restHeaders;
|
|
559
|
+
} else {
|
|
560
|
+
// Keep as string unless it's binary data
|
|
561
|
+
result[partName] = _objectSpread(_objectSpread({}, _restHeaders), {}, {
|
|
562
|
+
body: isBinaryData(Buffer.from(partBody, "binary")) ? Buffer.from(partBody, "binary") : partBody
|
|
563
|
+
});
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
} catch (err) {
|
|
568
|
+
_iterator3.e(err);
|
|
569
|
+
} finally {
|
|
570
|
+
_iterator3.f();
|
|
571
|
+
}
|
|
572
|
+
if (bodyKeysList.length > 0) {
|
|
573
|
+
result["body-keys"] = bodyKeysList.map(function (k) {
|
|
574
|
+
return "\"".concat(k, "\"");
|
|
575
|
+
}).join(", ");
|
|
576
|
+
}
|
|
577
|
+
return result;
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// Add content-digest header using fast-sha256
|
|
581
|
+
function addContentDigest(msg) {
|
|
582
|
+
if (!msg.body) return msg;
|
|
583
|
+
var bodyBytes;
|
|
584
|
+
// Handle both string and Buffer bodies
|
|
585
|
+
if (Buffer.isBuffer(msg.body)) {
|
|
586
|
+
bodyBytes = new Uint8Array(msg.body);
|
|
587
|
+
} else {
|
|
588
|
+
// For strings, use binary encoding to match how the multipart body is encoded
|
|
589
|
+
bodyBytes = stringToBytes(msg.body, "binary");
|
|
590
|
+
}
|
|
591
|
+
var hashBytes = (0, _fastSha.hash)(bodyBytes);
|
|
592
|
+
var digest = bytesToBase64(hashBytes);
|
|
593
|
+
return _objectSpread(_objectSpread({}, msg), {}, {
|
|
594
|
+
"content-digest": "sha-256=:".concat(digest, ":")
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Convert HTTP message to TABM
|
|
600
|
+
*/
|
|
601
|
+
function httpsig_from(http) {
|
|
602
|
+
if (typeof http === "string") return http;
|
|
603
|
+
var body = http.body || "";
|
|
604
|
+
var _inlineKey = inlineKey(http),
|
|
605
|
+
_inlineKey2 = _slicedToArray(_inlineKey, 2),
|
|
606
|
+
inlinedFieldHdrs = _inlineKey2[0],
|
|
607
|
+
inlinedKey = _inlineKey2[1];
|
|
608
|
+
var headers = _objectSpread({}, http);
|
|
609
|
+
delete headers.body;
|
|
610
|
+
delete headers["body-keys"];
|
|
611
|
+
var contentType = headers["content-type"];
|
|
612
|
+
var withBodyKeys = headers;
|
|
613
|
+
|
|
614
|
+
// Parse multipart body if present
|
|
615
|
+
if (body && contentType && contentType.includes("multipart")) {
|
|
616
|
+
var parsed = parseMultipart(contentType, body);
|
|
617
|
+
|
|
618
|
+
// Handle the body-keys from the original HTTP message
|
|
619
|
+
if (http["body-keys"]) {
|
|
620
|
+
// Parse the existing body-keys and ensure they're in quoted format
|
|
621
|
+
var bodyKeys = http["body-keys"];
|
|
622
|
+
if (typeof bodyKeys === "string") {
|
|
623
|
+
if (!bodyKeys.includes('"')) {
|
|
624
|
+
// Convert unquoted format to quoted format
|
|
625
|
+
parsed["body-keys"] = bodyKeys.split(/,\s*/).map(function (k) {
|
|
626
|
+
return "\"".concat(k.trim(), "\"");
|
|
627
|
+
}).join(", ");
|
|
628
|
+
} else {
|
|
629
|
+
// Already quoted, use as-is
|
|
630
|
+
parsed["body-keys"] = bodyKeys;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
withBodyKeys = _objectSpread(_objectSpread({}, headers), parsed);
|
|
635
|
+
|
|
636
|
+
// Convert flat structure to nested using flat.js
|
|
637
|
+
var flat = {};
|
|
638
|
+
var nonFlat = {};
|
|
639
|
+
for (var _i9 = 0, _Object$entries8 = Object.entries(withBodyKeys); _i9 < _Object$entries8.length; _i9++) {
|
|
640
|
+
var _Object$entries8$_i = _slicedToArray(_Object$entries8[_i9], 2),
|
|
641
|
+
key = _Object$entries8$_i[0],
|
|
642
|
+
value = _Object$entries8$_i[1];
|
|
643
|
+
if (key.includes("/")) {
|
|
644
|
+
flat[key] = value;
|
|
645
|
+
} else {
|
|
646
|
+
nonFlat[key] = value;
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
if (Object.keys(flat).length > 0) {
|
|
650
|
+
// Merge non-flat keys into flat for processing
|
|
651
|
+
// This ensures flat_from can see existing objects like results: { "ao-types": "..." }
|
|
652
|
+
var combined = _objectSpread(_objectSpread({}, nonFlat), flat);
|
|
653
|
+
|
|
654
|
+
// Use flat_from to convert flat structure to nested
|
|
655
|
+
var nested = (0, _flat.flat_from)(combined);
|
|
656
|
+
|
|
657
|
+
// The nested result already has everything merged
|
|
658
|
+
withBodyKeys = nested;
|
|
659
|
+
}
|
|
660
|
+
} else if (body) {
|
|
661
|
+
withBodyKeys[inlinedKey] = body;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// Ungroup IDs
|
|
665
|
+
var withIds = ungroupIds(withBodyKeys);
|
|
666
|
+
|
|
667
|
+
// Remove signature-related headers and content-digest
|
|
668
|
+
var result = _objectSpread({}, withIds);
|
|
669
|
+
delete result.signature;
|
|
670
|
+
delete result["signature-input"];
|
|
671
|
+
delete result.commitments;
|
|
672
|
+
delete result["content-digest"];
|
|
673
|
+
|
|
674
|
+
// Extract hashpaths if any
|
|
675
|
+
for (var _i0 = 0, _Object$keys = Object.keys(result); _i0 < _Object$keys.length; _i0++) {
|
|
676
|
+
var _key = _Object$keys[_i0];
|
|
677
|
+
if (_key.startsWith("hashpath")) {
|
|
678
|
+
delete result[_key];
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
return result;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
/**
|
|
685
|
+
* Convert TABM to HTTP message
|
|
686
|
+
* Implements bundle mode like Erlang's dev_codec_httpsig_conv:to/3 with bundle=true
|
|
687
|
+
*/
|
|
688
|
+
function httpsig_to(tabm) {
|
|
689
|
+
if (typeof tabm === "string") return tabm;
|
|
690
|
+
|
|
691
|
+
// Bundle logic: TABM → structured → TABM
|
|
692
|
+
// This matches Erlang's behavior when bundle=true:
|
|
693
|
+
// 1. Convert TABM to structured@1.0 (interprets ao-types, decodes to native types)
|
|
694
|
+
// 2. Convert back to TABM (re-encodes with ao-types)
|
|
695
|
+
var structured = (0, _structured.structured_to)(tabm);
|
|
696
|
+
var bundledTabm = (0, _structured.structured_from)(structured);
|
|
697
|
+
|
|
698
|
+
// Group IDs
|
|
699
|
+
var withGroupedIds = groupIds(bundledTabm);
|
|
700
|
+
|
|
701
|
+
// Remove private and signature-related keys
|
|
702
|
+
var stripped = _objectSpread({}, withGroupedIds);
|
|
703
|
+
delete stripped.commitments;
|
|
704
|
+
delete stripped.signature;
|
|
705
|
+
delete stripped["signature-input"];
|
|
706
|
+
delete stripped.priv;
|
|
707
|
+
var _inlineKey3 = inlineKey(tabm),
|
|
708
|
+
_inlineKey4 = _slicedToArray(_inlineKey3, 2),
|
|
709
|
+
inlineFieldHdrs = _inlineKey4[0],
|
|
710
|
+
inlineKeyVal = _inlineKey4[1];
|
|
711
|
+
|
|
712
|
+
// Check if this is a flat structure that should stay as headers
|
|
713
|
+
// A flat structure has no nested objects (maps), excluding:
|
|
714
|
+
// - Arrays (JS arrays, not numbered maps)
|
|
715
|
+
// - Buffers
|
|
716
|
+
// Note: List-encoded maps (numbered maps with .="list") ARE nested maps
|
|
717
|
+
// and should trigger multipart encoding, matching Erlang's behavior
|
|
718
|
+
var hasNestedMaps = Object.values(stripped).some(function (value) {
|
|
719
|
+
// Not an object
|
|
720
|
+
if (_typeof(value) !== "object" || value === null) return false;
|
|
721
|
+
// Arrays and Buffers are not nested maps
|
|
722
|
+
if (Array.isArray(value) || Buffer.isBuffer(value)) return false;
|
|
723
|
+
// Any other object (including list-encoded maps) is a nested map
|
|
724
|
+
return true;
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
// If it's just a flat map with strings/primitives, keep as headers
|
|
728
|
+
// This matches Erlang's behavior where flat maps don't become multipart
|
|
729
|
+
if (!hasNestedMaps) {
|
|
730
|
+
// For flat structures, just return with normalized keys
|
|
731
|
+
var result = _objectSpread(_objectSpread({}, inlineFieldHdrs), stripped);
|
|
732
|
+
|
|
733
|
+
// Handle inline body key - move data from inline key to body
|
|
734
|
+
if (inlineKeyVal && inlineKeyVal !== "body" && result[inlineKeyVal]) {
|
|
735
|
+
result.body = result[inlineKeyVal];
|
|
736
|
+
delete result[inlineKeyVal];
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
// If the only field is ao-types (no actual data), return empty object
|
|
740
|
+
// This matches Erlang's behavior where ao-types-only messages become empty
|
|
741
|
+
var dataKeys = Object.keys(result).filter(function (k) {
|
|
742
|
+
return k !== "ao-types" && k !== "ao-ids" && k !== "inline-body-key" && k !== "ao-body-key";
|
|
743
|
+
});
|
|
744
|
+
if (dataKeys.length === 0) {
|
|
745
|
+
return {};
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
// If there's a non-empty body, add content-digest
|
|
749
|
+
// Erlang doesn't add content-digest for empty bodies (<<>>)
|
|
750
|
+
if (result.body) {
|
|
751
|
+
var bodyIsEmpty = Buffer.isBuffer(result.body) ? result.body.length === 0 : typeof result.body === "string" && result.body.length === 0;
|
|
752
|
+
if (!bodyIsEmpty) {
|
|
753
|
+
return addContentDigest(result);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
return result;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
// Original multipart logic for nested structures
|
|
760
|
+
var bodyMap = {};
|
|
761
|
+
var headers = _objectSpread({}, inlineFieldHdrs);
|
|
762
|
+
|
|
763
|
+
// Process each field - ao-types at top level should go to headers
|
|
764
|
+
for (var _i1 = 0, _Object$entries9 = Object.entries(stripped); _i1 < _Object$entries9.length; _i1++) {
|
|
765
|
+
var _Object$entries9$_i = _slicedToArray(_Object$entries9[_i1], 2),
|
|
766
|
+
key = _Object$entries9$_i[0],
|
|
767
|
+
value = _Object$entries9$_i[1];
|
|
768
|
+
if (key === "ao-types") {
|
|
769
|
+
// Top-level ao-types goes to headers only
|
|
770
|
+
// Keep as Buffer if it's a Buffer, otherwise use as-is
|
|
771
|
+
headers[key] = value;
|
|
772
|
+
} else if (key === "body" || key === inlineKeyVal) {
|
|
773
|
+
bodyMap[key === inlineKeyVal ? inlineKeyVal : "body"] = value;
|
|
774
|
+
} else if (_typeof(value) === "object" && value !== null && !Array.isArray(value) && !Buffer.isBuffer(value)) {
|
|
775
|
+
bodyMap[key] = value;
|
|
776
|
+
} else if (typeof value === "string" && value.length <= MAX_HEADER_LENGTH && key !== "ao-types") {
|
|
777
|
+
headers[normalizeKey(key)] = value;
|
|
778
|
+
} else if (Buffer.isBuffer(value) && value.length <= MAX_HEADER_LENGTH && key !== "ao-types") {
|
|
779
|
+
// Keep buffers as buffers for headers
|
|
780
|
+
headers[normalizeKey(key)] = value;
|
|
781
|
+
} else if (key !== "ao-types") {
|
|
782
|
+
// Only add to bodyMap if it's not ao-types
|
|
783
|
+
bodyMap[key] = value;
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Handle body encoding
|
|
788
|
+
var groupedBodyMap = groupMaps(bodyMap);
|
|
789
|
+
if (Object.keys(groupedBodyMap).length === 0) {
|
|
790
|
+
return headers;
|
|
791
|
+
} else if (Object.keys(groupedBodyMap).length === 1 && groupedBodyMap[inlineKeyVal] && typeof groupedBodyMap[inlineKeyVal] === "string") {
|
|
792
|
+
var _result = _objectSpread(_objectSpread({}, headers), {}, {
|
|
793
|
+
body: groupedBodyMap[inlineKeyVal]
|
|
794
|
+
});
|
|
795
|
+
return addContentDigest(_result);
|
|
796
|
+
} else {
|
|
797
|
+
// Multipart body
|
|
798
|
+
var parts = [];
|
|
799
|
+
var bodyKeysList = [];
|
|
800
|
+
var sortedEntries = Object.entries(groupedBodyMap).sort(function (_ref5, _ref6) {
|
|
801
|
+
var _ref7 = _slicedToArray(_ref5, 1),
|
|
802
|
+
a = _ref7[0];
|
|
803
|
+
var _ref8 = _slicedToArray(_ref6, 1),
|
|
804
|
+
b = _ref8[0];
|
|
805
|
+
return a.localeCompare(b);
|
|
806
|
+
});
|
|
807
|
+
var _iterator4 = _createForOfIteratorHelper(sortedEntries),
|
|
808
|
+
_step4;
|
|
809
|
+
try {
|
|
810
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
811
|
+
var _step4$value = _slicedToArray(_step4.value, 2),
|
|
812
|
+
_key2 = _step4$value[0],
|
|
813
|
+
_value2 = _step4$value[1];
|
|
814
|
+
if (_typeof(_value2) === "object" && _value2 !== null && Object.keys(_value2).length === 1 && "body" in _value2) {
|
|
815
|
+
var encoded = encodeBodyPart("".concat(_key2, "/body"), _value2, "body");
|
|
816
|
+
parts.push({
|
|
817
|
+
name: "".concat(_key2, "/body"),
|
|
818
|
+
body: encoded
|
|
819
|
+
});
|
|
820
|
+
bodyKeysList.push(_key2);
|
|
821
|
+
} else {
|
|
822
|
+
var _encoded = encodeBodyPart(_key2, _value2, inlineKeyVal);
|
|
823
|
+
parts.push({
|
|
824
|
+
name: _key2,
|
|
825
|
+
body: _encoded
|
|
826
|
+
});
|
|
827
|
+
bodyKeysList.push(_key2);
|
|
828
|
+
}
|
|
829
|
+
}
|
|
830
|
+
} catch (err) {
|
|
831
|
+
_iterator4.e(err);
|
|
832
|
+
} finally {
|
|
833
|
+
_iterator4.f();
|
|
834
|
+
}
|
|
835
|
+
var boundary = boundaryFromParts(parts);
|
|
836
|
+
var bodyParts = parts.map(function (p) {
|
|
837
|
+
return "--".concat(boundary).concat(CRLF).concat(p.body);
|
|
838
|
+
});
|
|
839
|
+
var finalBody = bodyParts.join(CRLF) + "".concat(CRLF, "--").concat(boundary, "--");
|
|
840
|
+
var _result2 = _objectSpread(_objectSpread({}, headers), {}, {
|
|
841
|
+
// Note: body-keys is NOT included in httpsig output - it's only used for parsing
|
|
842
|
+
"content-type": "multipart/form-data; boundary=\"".concat(boundary, "\""),
|
|
843
|
+
body: finalBody
|
|
844
|
+
});
|
|
845
|
+
return addContentDigest(_result2);
|
|
846
|
+
}
|
|
847
|
+
}
|
|
848
|
+
|
|
849
|
+
/**
|
|
850
|
+
* Convert structured message to flat format
|
|
851
|
+
*/
|
|
852
|
+
function structured_to(msg) {
|
|
853
|
+
return msg;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* Convert flat format to structured message
|
|
858
|
+
*/
|
|
859
|
+
function structured_from(msg) {
|
|
860
|
+
return msg;
|
|
861
|
+
}
|