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
package/src/hyperbeam.js
ADDED
|
@@ -0,0 +1,585 @@
|
|
|
1
|
+
import { spawn, spawnSync } from "child_process"
|
|
2
|
+
import { resolve } from "path"
|
|
3
|
+
import { isNil, map } from "ramda"
|
|
4
|
+
import { toAddr } from "./test.js"
|
|
5
|
+
import HB from "./hb.js"
|
|
6
|
+
import { rmSync, readFileSync, readdirSync, writeFileSync, existsSync } from "fs"
|
|
7
|
+
import devs from "./devs.js"
|
|
8
|
+
import dotenv from "dotenv"
|
|
9
|
+
dotenv.config({ path: ".env.hyperbeam" })
|
|
10
|
+
|
|
11
|
+
export default class HyperBEAM {
|
|
12
|
+
static OPERATOR = Symbol("operator")
|
|
13
|
+
constructor({
|
|
14
|
+
port = 10001,
|
|
15
|
+
cu_port = 6363,
|
|
16
|
+
as = [],
|
|
17
|
+
bundler,
|
|
18
|
+
gateway,
|
|
19
|
+
wallet = ".wallet.json",
|
|
20
|
+
reset,
|
|
21
|
+
cwd = process.env.CWD ?? "./HyperBEAM",
|
|
22
|
+
c,
|
|
23
|
+
cmake,
|
|
24
|
+
faff,
|
|
25
|
+
simple_pay = false,
|
|
26
|
+
simple_pay_price,
|
|
27
|
+
bundler_ans104,
|
|
28
|
+
bundler_httpsig,
|
|
29
|
+
p4_non_chargable_routes,
|
|
30
|
+
p4_lua,
|
|
31
|
+
store_prefix,
|
|
32
|
+
operator,
|
|
33
|
+
logs = true,
|
|
34
|
+
shell = true,
|
|
35
|
+
devices,
|
|
36
|
+
genesis_wasm = false,
|
|
37
|
+
arweave_gateway,
|
|
38
|
+
force_signed = false,
|
|
39
|
+
linkify_mode, // v0.9-FINAL: HB linkify mode. undefined => HB default; pass "false" for hbsig-style inline-only responses
|
|
40
|
+
rebar3, // Use rebar3 shell (true) or direct erl (false). Defaults to HB_REBAR3 env or true
|
|
41
|
+
} = {}) {
|
|
42
|
+
// Determine rebar3 mode: option > env var > default (true)
|
|
43
|
+
const envRebar3 = process.env.HB_REBAR3
|
|
44
|
+
if (rebar3 !== undefined) {
|
|
45
|
+
this.rebar3 = rebar3
|
|
46
|
+
} else if (envRebar3 !== undefined) {
|
|
47
|
+
this.rebar3 = envRebar3.toLowerCase() !== "false"
|
|
48
|
+
} else {
|
|
49
|
+
this.rebar3 = true // default to rebar3 mode
|
|
50
|
+
}
|
|
51
|
+
this.genesis_wasm = genesis_wasm
|
|
52
|
+
this.force_signed = force_signed
|
|
53
|
+
this.linkify_mode = linkify_mode
|
|
54
|
+
this.cu_port = cu_port
|
|
55
|
+
this.arweave_gateway = arweave_gateway || process.env.ARWEAVE_GATEWAY
|
|
56
|
+
this.devices = devices
|
|
57
|
+
this.p4_non_chargable_routes = p4_non_chargable_routes
|
|
58
|
+
this.logs = logs
|
|
59
|
+
this.cwd = cwd
|
|
60
|
+
this.dirname = resolve(process.cwd(), this.cwd)
|
|
61
|
+
this.wallet = wallet
|
|
62
|
+
this.wallet_location = resolve(this.dirname, this.wallet)
|
|
63
|
+
this.jwk = JSON.parse(this.file(this.wallet_location))
|
|
64
|
+
this.addr = toAddr(this.jwk.n)
|
|
65
|
+
if (reset) {
|
|
66
|
+
for (let v of readdirSync(this.dirname)) {
|
|
67
|
+
if (/^cache-/.test(v)) {
|
|
68
|
+
try {
|
|
69
|
+
rmSync(resolve(this.dirname, v), { recursive: true, force: true })
|
|
70
|
+
} catch (e) {
|
|
71
|
+
console.log(e)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//this.cu = cu
|
|
77
|
+
this.store_prefix = store_prefix
|
|
78
|
+
? "cache-mainnet-" + Math.floor(Math.random() * 10000000)
|
|
79
|
+
: "cache-mainnet"
|
|
80
|
+
this.p4_lua = p4_lua
|
|
81
|
+
this.simple_pay = simple_pay
|
|
82
|
+
this.spp = simple_pay_price
|
|
83
|
+
this.operator = operator
|
|
84
|
+
if (this.operator === HyperBEAM.OPERATOR) this.operator = this.addr
|
|
85
|
+
this.faff = faff
|
|
86
|
+
this.c = c
|
|
87
|
+
this.cmake = cmake
|
|
88
|
+
this.port = port
|
|
89
|
+
this.url = `http://127.0.0.1:${this.port}`
|
|
90
|
+
if (bundler) this.bundler = `http://localhost::${bundler}`
|
|
91
|
+
this.bundler_ans104 = bundler_ans104
|
|
92
|
+
if (bundler_httpsig) this.bundler = bundler_httpsig
|
|
93
|
+
this.as = as
|
|
94
|
+
this.gateway = gateway
|
|
95
|
+
if (Array.isArray(this.faff)) {
|
|
96
|
+
let i = 0
|
|
97
|
+
for (let v of this.faff) {
|
|
98
|
+
if (typeof v === "symbol" && v === HyperBEAM.OPERATOR) {
|
|
99
|
+
this.faff[i] = this.addr
|
|
100
|
+
}
|
|
101
|
+
i++
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (shell) this.shell()
|
|
105
|
+
}
|
|
106
|
+
shell() {
|
|
107
|
+
// Kill any stale beam.smp / process listening on our HB port before
|
|
108
|
+
// spawning a new shell. Without this, sequential test runs can hit a
|
|
109
|
+
// lingering Erlang VM from the previous test (kill() returned but the
|
|
110
|
+
// OS hadn't released the port yet) and end up either failing to bind
|
|
111
|
+
// 10001 or talking to the stale node with stale process registry —
|
|
112
|
+
// surface symptom is 400 "No scheduler information provided." on the
|
|
113
|
+
// first schedule of an otherwise-known process.
|
|
114
|
+
try {
|
|
115
|
+
spawnSync("bash", ["-c", `lsof -ti:${this.port} | xargs -r kill -9 2>/dev/null`], { stdio: "ignore" })
|
|
116
|
+
} catch (_e) {}
|
|
117
|
+
const evalCmd = this.genEval({ gateway: this.gateway, wallet: this.wallet })
|
|
118
|
+
const cwd = resolve(process.cwd(), this.cwd)
|
|
119
|
+
const env = this.genEnv() // genEnv() returns filtered process.env without proxy vars
|
|
120
|
+
|
|
121
|
+
if (this.rebar3) {
|
|
122
|
+
// rebar3 shell mode
|
|
123
|
+
const _as = this.as.length === 0 ? [] : ["as", this.as.join(",")]
|
|
124
|
+
this._shell = spawn(
|
|
125
|
+
"rebar3",
|
|
126
|
+
[
|
|
127
|
+
..._as,
|
|
128
|
+
"shell",
|
|
129
|
+
"--eval",
|
|
130
|
+
evalCmd,
|
|
131
|
+
],
|
|
132
|
+
{ env, cwd }
|
|
133
|
+
)
|
|
134
|
+
} else {
|
|
135
|
+
// Direct erl mode - compile first if needed, then start
|
|
136
|
+
// This mode is better for proxy environments as it gives more control
|
|
137
|
+
// Manually expand glob pattern to avoid shell interpretation issues
|
|
138
|
+
const buildDir = resolve(cwd, "_build/default/lib")
|
|
139
|
+
let ebinDirs = []
|
|
140
|
+
try {
|
|
141
|
+
const libs = readdirSync(buildDir)
|
|
142
|
+
for (const lib of libs) {
|
|
143
|
+
const ebinPath = resolve(buildDir, lib, "ebin")
|
|
144
|
+
if (existsSync(ebinPath)) {
|
|
145
|
+
ebinDirs.push(ebinPath)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
} catch (e) {
|
|
149
|
+
console.error("Failed to enumerate ebin directories:", e.message)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Build -pa arguments for each ebin directory
|
|
153
|
+
const paArgs = ebinDirs.flatMap(dir => ["-pa", dir])
|
|
154
|
+
|
|
155
|
+
this._shell = spawn(
|
|
156
|
+
"erl",
|
|
157
|
+
[
|
|
158
|
+
"+A", "4", // Async threads for WAMR linked-in driver (see hb_beamr.erl)
|
|
159
|
+
...paArgs,
|
|
160
|
+
"-sname", `hb_${this.port}`, // Unique node name to allow multiple instances
|
|
161
|
+
"-eval", evalCmd,
|
|
162
|
+
],
|
|
163
|
+
{ env, cwd }
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (this.logs) {
|
|
168
|
+
this._shell.stdout.on("data", chunk => console.log(chunk.toString()))
|
|
169
|
+
this._shell.stderr.on("data", err => console.error(err.toString()))
|
|
170
|
+
this._shell.on("error", err =>
|
|
171
|
+
console.error(`failed to start process: ${err}`)
|
|
172
|
+
)
|
|
173
|
+
this._shell.on("close", code => {
|
|
174
|
+
console.log(`child process exited with code ${code}`)
|
|
175
|
+
delete this._shell
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
file(path, type = "utf8") {
|
|
180
|
+
return readFileSync(resolve(this.dirname, path), type)
|
|
181
|
+
}
|
|
182
|
+
eunit(module, test) {
|
|
183
|
+
return new Promise(res => {
|
|
184
|
+
let isTest = !isNil(test)
|
|
185
|
+
if (Array.isArray(module)) {
|
|
186
|
+
for (const v of module) {
|
|
187
|
+
if (Array.isArray(v) || /:/.test(v)) {
|
|
188
|
+
isTest = true
|
|
189
|
+
break
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const _as = this.as.length === 0 ? [] : ["as", this.as.join(",")]
|
|
194
|
+
const _test = Array.isArray(test) ? test.join("+") : test
|
|
195
|
+
let _module = ""
|
|
196
|
+
|
|
197
|
+
if (Array.isArray(module)) {
|
|
198
|
+
for (const v of module) {
|
|
199
|
+
_module += _module === "" ? "" : ","
|
|
200
|
+
if (Array.isArray(v)) _module += `${v[0]}:${v[1].join("+")}`
|
|
201
|
+
else _module += v
|
|
202
|
+
}
|
|
203
|
+
} else {
|
|
204
|
+
_module = test ? `${module}:${_test}` : module
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const _arg = isTest ? "--test" : "--module"
|
|
208
|
+
let params = [..._as, "eunit", _arg, _module]
|
|
209
|
+
const _eunit = spawn("rebar3", params, {
|
|
210
|
+
env: this.genEnv(),
|
|
211
|
+
cwd: resolve(process.cwd(), this.cwd),
|
|
212
|
+
})
|
|
213
|
+
if (this.logs) {
|
|
214
|
+
_eunit.stdout.on("data", chunk => console.log(chunk.toString()))
|
|
215
|
+
_eunit.stderr.on("data", err => console.error(err.toString()))
|
|
216
|
+
_eunit.on("error", err =>
|
|
217
|
+
console.error(`failed to start process: ${err}`)
|
|
218
|
+
)
|
|
219
|
+
_eunit.on("close", code => {
|
|
220
|
+
console.log(`child process exited with code ${code}`)
|
|
221
|
+
res()
|
|
222
|
+
})
|
|
223
|
+
}
|
|
224
|
+
})
|
|
225
|
+
}
|
|
226
|
+
async ok() {
|
|
227
|
+
try {
|
|
228
|
+
const address = await fetch(`${this.url}/~meta@1.0/info/address`).then(
|
|
229
|
+
r => r.text()
|
|
230
|
+
)
|
|
231
|
+
if (address) {
|
|
232
|
+
if (this.logs) console.log("HyperBEAM ok(): initializing HB...")
|
|
233
|
+
this.hb = await new HB({ url: this.url }).init(this.jwk)
|
|
234
|
+
this._info = { address }
|
|
235
|
+
if (this.logs) console.log("HyperBEAM ok(): SUCCESS!")
|
|
236
|
+
return true
|
|
237
|
+
} else return false
|
|
238
|
+
} catch (e) {
|
|
239
|
+
if (this.logs) console.error("HyperBEAM ok() error:", e.message)
|
|
240
|
+
return false
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
async ready(timeout = 60000) {
|
|
244
|
+
// Start CU server if genesis_wasm is enabled
|
|
245
|
+
if (this.genesis_wasm) {
|
|
246
|
+
await this.startCU()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const start = Date.now()
|
|
250
|
+
while (Date.now() - start < timeout) {
|
|
251
|
+
try {
|
|
252
|
+
if (await this.ok()) {
|
|
253
|
+
return this
|
|
254
|
+
}
|
|
255
|
+
} catch (e) {
|
|
256
|
+
// Ignore errors, will retry
|
|
257
|
+
}
|
|
258
|
+
// Wait 1 second before next attempt
|
|
259
|
+
await new Promise(r => setTimeout(r, 1000))
|
|
260
|
+
}
|
|
261
|
+
return false
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Start the genesis-wasm CU server
|
|
265
|
+
async startCU() {
|
|
266
|
+
const cuDir = resolve(this.dirname, "genesis-wasm-server")
|
|
267
|
+
const dbDir = resolve(this.dirname, "cache-mainnet/genesis-wasm")
|
|
268
|
+
|
|
269
|
+
// Ensure DB directory exists
|
|
270
|
+
spawnSync("mkdir", ["-p", dbDir])
|
|
271
|
+
|
|
272
|
+
// Kill any stale CU process listening on cu_port before spawning a new
|
|
273
|
+
// one. Sequential test runs in the same OS share port 6363; if a prior
|
|
274
|
+
// run's CU lingered (e.g. detached but its parent died before SIGKILL
|
|
275
|
+
// could propagate), the new CU's bind silently fails and HB ends up
|
|
276
|
+
// talking to the stale CU, which has a different process registry and
|
|
277
|
+
// throws confusing 500/400s on the next spawn/schedule.
|
|
278
|
+
try {
|
|
279
|
+
spawnSync("bash", ["-c", `lsof -ti:${this.cu_port} | xargs -r kill -9 2>/dev/null`], { stdio: "ignore" })
|
|
280
|
+
} catch (_e) {}
|
|
281
|
+
// Brief settle so the OS can release the port.
|
|
282
|
+
await new Promise(r => setTimeout(r, 200))
|
|
283
|
+
|
|
284
|
+
// Use arweave_gateway option or ARWEAVE_GATEWAY env var for proxy environments
|
|
285
|
+
const gatewayUrl = this.arweave_gateway || process.env.GATEWAY_URL || "https://arweave.net"
|
|
286
|
+
const graphqlUrl = process.env.GRAPHQL_URL || `${gatewayUrl}/graphql`
|
|
287
|
+
|
|
288
|
+
// CU needs proxy for external services (arweave.net) but not for localhost
|
|
289
|
+
// Keep all env vars but ensure NO_PROXY is set for localhost connections
|
|
290
|
+
const noProxy = 'localhost,127.0.0.1,::1'
|
|
291
|
+
const env = {
|
|
292
|
+
...process.env,
|
|
293
|
+
// Ensure NO_PROXY includes localhost for Node.js fetch and global-agent
|
|
294
|
+
NO_PROXY: noProxy,
|
|
295
|
+
no_proxy: noProxy,
|
|
296
|
+
GLOBAL_AGENT_NO_PROXY: noProxy,
|
|
297
|
+
UNIT_MODE: "hbu",
|
|
298
|
+
HB_URL: `http://localhost:${this.port}`,
|
|
299
|
+
NODE_CONFIG_ENV: "development",
|
|
300
|
+
DB_URL: resolve(dbDir, "genesis-wasm-db"),
|
|
301
|
+
PORT: String(this.cu_port),
|
|
302
|
+
WALLET_FILE: this.wallet_location,
|
|
303
|
+
DISABLE_PROCESS_FILE_CHECKPOINT_CREATION: "false",
|
|
304
|
+
PROCESS_MEMORY_FILE_CHECKPOINTS_DIR: resolve(dbDir, "checkpoints"),
|
|
305
|
+
GATEWAY_URL: gatewayUrl,
|
|
306
|
+
ARWEAVE_URL: gatewayUrl,
|
|
307
|
+
GRAPHQL_URL: graphqlUrl,
|
|
308
|
+
GRAPHQL_URLS: graphqlUrl,
|
|
309
|
+
CHECKPOINT_GRAPHQL_URL: graphqlUrl,
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Node 26 enables wasm-memory64 by default and rejects the experimental
|
|
313
|
+
// flag; older Node versions still need it. Detect from process.versions.
|
|
314
|
+
const nodeMajor = parseInt((process.versions.node || "0").split(".")[0], 10)
|
|
315
|
+
const memory64Flag = nodeMajor >= 24 ? [] : ["--experimental-wasm-memory64"]
|
|
316
|
+
this.cuProc = spawn("node", [...memory64Flag, "-r", "dotenv/config", "src/app.js"], {
|
|
317
|
+
cwd: cuDir,
|
|
318
|
+
env,
|
|
319
|
+
detached: true,
|
|
320
|
+
stdio: this.logs ? ["ignore", "pipe", "pipe"] : "ignore"
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
this.cuProc.unref()
|
|
324
|
+
|
|
325
|
+
if (this.logs) {
|
|
326
|
+
console.log(`CU server starting on port ${this.cu_port}...`)
|
|
327
|
+
if (this.cuProc.stdout) {
|
|
328
|
+
this.cuProc.stdout.on("data", chunk => console.log(`[CU] ${chunk.toString().trim()}`))
|
|
329
|
+
}
|
|
330
|
+
if (this.cuProc.stderr) {
|
|
331
|
+
this.cuProc.stderr.on("data", chunk => console.error(`[CU] ${chunk.toString().trim()}`))
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// Wait for CU to be ready - check / endpoint instead of /status
|
|
336
|
+
const start = Date.now()
|
|
337
|
+
while (Date.now() - start < 30000) {
|
|
338
|
+
try {
|
|
339
|
+
const res = await fetch(`http://localhost:${this.cu_port}/`)
|
|
340
|
+
if (res.ok || res.status === 404) {
|
|
341
|
+
// Any response (including 404) means server is up
|
|
342
|
+
if (this.logs) console.log("CU server ready")
|
|
343
|
+
return true
|
|
344
|
+
}
|
|
345
|
+
} catch (e) {
|
|
346
|
+
// Not ready yet
|
|
347
|
+
}
|
|
348
|
+
await new Promise(r => setTimeout(r, 500))
|
|
349
|
+
}
|
|
350
|
+
if (this.logs) console.log("CU server startup timeout, continuing anyway...")
|
|
351
|
+
return true // Continue anyway, the CU process is running
|
|
352
|
+
}
|
|
353
|
+
genEnv() {
|
|
354
|
+
// Start with process.env but filter out proxy settings
|
|
355
|
+
// HyperBEAM uses arweave_gateway config for external access, not proxy
|
|
356
|
+
// This avoids httpc proxy issues with localhost CU connections
|
|
357
|
+
const proxyKeys = ['HTTPS_PROXY', 'HTTP_PROXY', 'https_proxy', 'http_proxy', 'ALL_PROXY', 'all_proxy']
|
|
358
|
+
let _env = Object.fromEntries(
|
|
359
|
+
Object.entries(process.env).filter(([key]) => !proxyKeys.includes(key))
|
|
360
|
+
)
|
|
361
|
+
if (this.diagnostic) _env.DIAGNOSTIC = this.diagnostic
|
|
362
|
+
if (this.c) {
|
|
363
|
+
_env.CC = `gcc-${this.c}`
|
|
364
|
+
_env.CXX = `g++-${this.c}`
|
|
365
|
+
}
|
|
366
|
+
if (this.cmake) _env.CMAKE_POLICY_VERSION_MINIMUM = this.cmake
|
|
367
|
+
// Ensure enough async threads for WAMR linked-in driver + HTTP client
|
|
368
|
+
// See hb_beamr.erl: "configure BEAM to have enough async worker threads (see erl +A N)"
|
|
369
|
+
const asyncThreads = "+A 4"
|
|
370
|
+
if (!_env.ERL_ZFLAGS) _env.ERL_ZFLAGS = asyncThreads
|
|
371
|
+
else if (!_env.ERL_ZFLAGS.includes("+A")) _env.ERL_ZFLAGS += ` ${asyncThreads}`
|
|
372
|
+
// Skip the hb application's default-port HTTP server start (8734). We call
|
|
373
|
+
// hb_http_server:start_node/1 explicitly with the actual port via genEval,
|
|
374
|
+
// so the default binding is redundant; skipping it avoids eaddrinuse and
|
|
375
|
+
// the downstream case_clause crashes when multiple HyperBEAM instances
|
|
376
|
+
// run side-by-side (p4.test.js, p4-lua.test.js).
|
|
377
|
+
_env.WAO_NO_DEFAULT_HTTP_SERVER = "1"
|
|
378
|
+
return _env
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
genEval({ gateway, wallet = ".wallet.json" }) {
|
|
382
|
+
let _devices = ""
|
|
383
|
+
let _devs = []
|
|
384
|
+
if (this.devices) {
|
|
385
|
+
for (const v of this.devices) {
|
|
386
|
+
if (typeof v === "object") {
|
|
387
|
+
_devs.push(
|
|
388
|
+
`#{<<"name">> => <<"${v.name}">>, <<"module">> => ${v.module}}`
|
|
389
|
+
)
|
|
390
|
+
} else if (devs[v])
|
|
391
|
+
_devs.push(
|
|
392
|
+
`#{<<"name">> => <<"${devs[v].name}">>, <<"module">> => ${devs[v].module}}`
|
|
393
|
+
)
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
if (_devs.length > 0) {
|
|
397
|
+
_devices = `, <<"preloaded-devices">> => [${_devs.join(", ")}]`
|
|
398
|
+
}
|
|
399
|
+
const _wallet = `, <<"priv-key-location">> => <<"${wallet}">>`
|
|
400
|
+
// Use arweave_gateway (Cloudflare proxy) if set, otherwise local gateway port, otherwise default
|
|
401
|
+
const _gateway = this.arweave_gateway
|
|
402
|
+
? `, <<"gateway">> => <<"${this.arweave_gateway}">>`
|
|
403
|
+
: gateway
|
|
404
|
+
? `, <<"gateway">> => <<"http://localhost:${gateway}">>`
|
|
405
|
+
: ""
|
|
406
|
+
|
|
407
|
+
// Store config: use single hb_store_fs matching HyperBEAM eunit test pattern.
|
|
408
|
+
// Multi-store with hb_store_gateway wrappers caused snapshot discovery failures
|
|
409
|
+
// because list_numbered/resolve interactions across stores break symlink following.
|
|
410
|
+
// The wao@1.0 device handles Arweave TX resolution independently via HTTP.
|
|
411
|
+
const _store = this.store_prefix
|
|
412
|
+
? `, <<"store">> => #{ <<"store-module">> => hb_store_fs, <<"name">> => <<"${this.store_prefix}">> }`
|
|
413
|
+
: ""
|
|
414
|
+
let _bundler = this.bundler
|
|
415
|
+
? `, <<"bundler-httpsig">> => <<"${this.bundler}">>`
|
|
416
|
+
: ""
|
|
417
|
+
// Only include bundler_ans104 if it's a truthy value (port number or URL)
|
|
418
|
+
// When false or omitted, don't include it - Erlang code expects either no option or a valid URL
|
|
419
|
+
let _bundler_ans104 = this.bundler_ans104 && this.bundler_ans104 !== false
|
|
420
|
+
? `, <<"bundler-ans104">> => <<"http://localhost:${this.bundler_ans104}">>`
|
|
421
|
+
: ""
|
|
422
|
+
/*
|
|
423
|
+
const _routes = `, routes => [#{ <<"template">> => <<"/result/.*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu}">> } }, #{ <<\"template\">> => <<\"/dry-run\">>, <<\"node\">> => #{ <<\"prefix\">> => <<\"http://localhost:${this.cu}\">> } }, #{ <<"template">> => <<"/graphql">>, <<"nodes">> => [#{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => httpc, protocol => http2 } }, #{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } }] }, #{ <<"template">> => <<"/raw">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${gateway}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } } }]`
|
|
424
|
+
*/
|
|
425
|
+
const _p4_non_chargable = this.p4_non_chargable
|
|
426
|
+
? `, <<"p4-non-chargable-routes">> => [${this.p4_non_chargable_routes
|
|
427
|
+
.map(() => `#{ <<"template">> => <<"/*~node-process@1.0/*">> }`)
|
|
428
|
+
.join(", ")}]`
|
|
429
|
+
: this.p4_lua
|
|
430
|
+
? `, <<"p4-non-chargable-routes">> => [#{ <<"template">> => <<"/*~node-process@1.0/*">> }, #{ <<"template">> => <<"/~wao@1.0/*">> }, #{ <<"template">> => <<"/~p4@1.0/balance">> }, #{ <<"template">> => <<"/~meta@1.0/*">> }]`
|
|
431
|
+
: !this.simple_pay
|
|
432
|
+
? ""
|
|
433
|
+
: `, <<"p4-non-chargable-routes">> => [#{ <<"template">> => <<"/~simple-pay@1.0/topup">> }, #{ <<"template">> => <<"/~meta@1.0/*">> }, #{ <<"template">> => <<"/~simple-pay@1.0/balance">> }]`
|
|
434
|
+
|
|
435
|
+
const _operator = this.operator
|
|
436
|
+
? `, <<"operator">> => <<"${this.operator}">>`
|
|
437
|
+
: ""
|
|
438
|
+
const _spp = this.spp ? `, <<"simple-pay-price">> => ${this.spp}` : ""
|
|
439
|
+
const _genesis_wasm_port = this.genesis_wasm ? `, <<"genesis-wasm-port">> => ${this.cu_port}` : ""
|
|
440
|
+
const _force_signed = this.force_signed ? `, <<"force-signed-requests">> => true, <<"force-signed">> => true` : ""
|
|
441
|
+
|
|
442
|
+
// Helper to format module(s) for Erlang - supports ID string, inline object, or array
|
|
443
|
+
const formatModule = (mod) => {
|
|
444
|
+
if (typeof mod === "string") {
|
|
445
|
+
// ID string
|
|
446
|
+
return `<<"${mod}">>`
|
|
447
|
+
} else if (Array.isArray(mod)) {
|
|
448
|
+
// Array of inline modules
|
|
449
|
+
return `[${mod.map(m => `#{ <<"content-type">> => <<"text/x-lua">>, <<"body">> => <<"${escapeErlangString(m.body)}">>${m.name ? `, <<"name">> => <<"${m.name}">>` : ""} }`).join(", ")}]`
|
|
450
|
+
} else if (mod && mod.body) {
|
|
451
|
+
// Single inline module object
|
|
452
|
+
return `#{ <<"content-type">> => <<"text/x-lua">>, <<"body">> => <<"${escapeErlangString(mod.body)}">>${mod.name ? `, <<"name">> => <<"${mod.name}">>` : ""} }`
|
|
453
|
+
}
|
|
454
|
+
return `<<"${mod}">>`
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Helper to escape special characters for Erlang binary strings
|
|
458
|
+
const escapeErlangString = (str) => {
|
|
459
|
+
if (!str) return str
|
|
460
|
+
return str.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
const _node_processes = this.p4_lua
|
|
464
|
+
? `, <<"node-processes">> => #{ <<"ledger">> => #{ <<"device">> => <<"process@1.0">>, <<"execution-device">> => <<"lua@5.3a">>, <<"scheduler-device">> => <<"scheduler@1.0">>, <<"module">> => ${formatModule(this.p4_lua.processor)}, <<"operator">> => <<"${this.operator}">>${this.p4_lua.admin ? `, <<"admin">> => <<"${this.p4_lua.admin}">>` : ""}${this.p4_lua.balance ? `, <<"balance">> => #{ ${Object.entries(this.p4_lua.balance).map(([k, v]) => `<<"${k}">> => ${v}`).join(", ")} }` : ""} } }`
|
|
465
|
+
: ""
|
|
466
|
+
const processor = this.p4_lua
|
|
467
|
+
? `#{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"lua@5.3a">>, <<"module">> => ${formatModule(this.p4_lua.client)}, <<"ledger-path">> => <<"/ledger~node-process@1.0">> }`
|
|
468
|
+
: ""
|
|
469
|
+
const _port = `<<"port">> => ${this.port}`
|
|
470
|
+
const _faff = isNil(this.faff)
|
|
471
|
+
? ""
|
|
472
|
+
: `, <<"faff-allow-list">> => [ ${map(addr => `<<"${addr}">>`)(this.faff).join(", ")} ]`
|
|
473
|
+
|
|
474
|
+
const _on = this.p4_lua
|
|
475
|
+
? `, <<"on">> => #{ <<"request">> => ${processor}, <<"response">> => ${processor} }`
|
|
476
|
+
: this.simple_pay
|
|
477
|
+
? `, <<"on">> => #{ <<"request">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"simple-pay@1.0">> }, <<"response">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"simple-pay@1.0">>, <<"ledger-device">> => <<"simple-pay@1.0">> } }`
|
|
478
|
+
: !isNil(this.faff)
|
|
479
|
+
? `, <<"on">> => #{ <<"request">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"faff@1.0">>, <<"ledger-device">> => <<"faff@1.0">> }, <<"response">> => #{ <<"device">> => <<"p4@1.0">>, <<"pricing-device">> => <<"faff@1.0">>, <<"ledger-device">> => <<"faff@1.0">> } }`
|
|
480
|
+
: ""
|
|
481
|
+
// Add cache_writers to allow the wallet to write to cache (needed for WASM module uploads)
|
|
482
|
+
// Use the wallet address (this.addr) which is always available from the wallet file
|
|
483
|
+
const _cache_writers = `, <<"cache-writers">> => [<<"${this.addr}">>]`
|
|
484
|
+
|
|
485
|
+
// Use gun HTTP client for relay calls instead of httpc
|
|
486
|
+
// gun doesn't use system proxy settings, avoiding the proxy issue with localhost CU
|
|
487
|
+
const _relay_http_client = `, <<"relay-http-client">> => gun, <<"http-client">> => gun`
|
|
488
|
+
|
|
489
|
+
// Custom routes using Cloudflare proxy instead of arweave.net
|
|
490
|
+
// Also add CU routes for genesis_wasm when enabled
|
|
491
|
+
const cuRoutes = this.genesis_wasm
|
|
492
|
+
? `#{ <<"template">> => <<"/result/*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },
|
|
493
|
+
#{ <<"template">> => <<"/snapshot/*">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },
|
|
494
|
+
#{ <<"template">> => <<"/dry-run">>, <<"node">> => #{ <<"prefix">> => <<"http://localhost:${this.cu_port}">> } },`
|
|
495
|
+
: ""
|
|
496
|
+
const _routes = this.arweave_gateway || this.genesis_wasm
|
|
497
|
+
? `, <<"routes">> => [
|
|
498
|
+
${cuRoutes}
|
|
499
|
+
#{ <<"template">> => <<"/graphql">>, <<"nodes">> => [
|
|
500
|
+
#{ <<"prefix">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>, <<"opts">> => #{ http_client => gun, protocol => http2 } }
|
|
501
|
+
]},
|
|
502
|
+
#{ <<"template">> => <<"/arweave">>, <<"node">> => #{
|
|
503
|
+
<<"match">> => <<"^/arweave">>,
|
|
504
|
+
<<"with">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>,
|
|
505
|
+
<<"opts">> => #{ http_client => gun, protocol => http2 }
|
|
506
|
+
}},
|
|
507
|
+
#{ <<"template">> => <<"/raw">>, <<"node">> => #{
|
|
508
|
+
<<"prefix">> => <<"${this.arweave_gateway || 'https://arweave.net'}">>,
|
|
509
|
+
<<"opts">> => #{ http_client => gun, protocol => http2 }
|
|
510
|
+
}}
|
|
511
|
+
]`
|
|
512
|
+
: ""
|
|
513
|
+
|
|
514
|
+
// Explicitly clear httpc proxy settings at Erlang level before starting HyperBEAM
|
|
515
|
+
// This ensures no proxy is used regardless of any OS-level or cached settings
|
|
516
|
+
const clearProxy = `application:ensure_all_started(inets), httpc:set_options([{proxy, {undefined, []}}, {ipfamily, inet}]), `
|
|
517
|
+
|
|
518
|
+
// Force-load dev_hbsig early so its codec functions are available
|
|
519
|
+
// before any device-stack processing occurs
|
|
520
|
+
const loadHbsig = `code:ensure_loaded(dev_hbsig), `
|
|
521
|
+
|
|
522
|
+
// Pre-register device name atoms so hb_util:atom/1 (which uses list_to_existing_atom)
|
|
523
|
+
// doesn't crash with badarg when resolving device names from HTTP headers/binaries
|
|
524
|
+
const preRegisterAtoms = `lists:foreach(fun list_to_atom/1, ["wao@1.0", "hbsig@1.0", "stack@1.0", "patch@1.0", "inc@1.0", "double@1.0", "add@1.0", "mul@1.0", "inc2@1.0", "square@1.0", "mydev@1.0", "lua@5.3a", "process@1.0", "scheduler@1.0", "message@1.0", "meta@1.0", "cache@1.0", "json@1.0", "structured@1.0", "httpsig@1.0", "flat@1.0", "genesis-wasm@1.0", "compute@1.0", "delegated-compute@1.0", "relay@1.0", "router@1.0", "cron@1.0", "node-process@1.0", "p4@1.0", "simple-pay@1.0", "faff@1.0", "ans104@1.0", "test-device@1.0", "lookup@1.0", "local-name@1.0", "upload@1.0", "hook@1.0", "auth-hook@1.0", "http-auth@1.0", "greenzone@1.0", "apply@1.0", "dedup@1.0", "cookie@1.0", "push@1.0", "query@1.0", "manifest@1.0", "name@1.0", "profile@1.0", "monitor@1.0", "multipass@1.0", "poda@1.0", "snp@1.0", "trie@1.0", "volume@1.0", "secret@1.0", "wasi@1.0", "wasm-64@1.0", "whois@1.0", "cacheviz@1.0", "hyperbuddy@1.0", "copycat@1.0", "json-iface@1.0", "arweave@2.9", "b32-name@1.0", "blacklist@1.0", "bundler@1.0", "gzip@1.0", "location@1.0", "metering@1.0", "rate-limit@1.0", "tx@1.0"]), `
|
|
525
|
+
|
|
526
|
+
// Pre-create prometheus ETS tables owned by the shell process.
|
|
527
|
+
// dev_hbsig on_load also does this, but the module loads lazily so this
|
|
528
|
+
// covers the gap between rebar3 boot and module loading.
|
|
529
|
+
const initPrometheus = `lists:foreach(fun({N,{T,C}}) -> case ets:info(N) of undefined -> ets:new(N,[T,named_table,public,{C,true}]); _ -> ok end; ({N,C}) -> case ets:info(N) of undefined -> ets:new(N,[set,named_table,public,{C,true}]); _ -> ok end end, [{prometheus_registry_table,{bag,read_concurrency}},{prometheus_counter_table,write_concurrency},{prometheus_gauge_table,write_concurrency},{prometheus_summary_table,write_concurrency},{prometheus_quantile_summary_table,write_concurrency},{prometheus_histogram_table,write_concurrency},{prometheus_boolean_table,write_concurrency}]), `
|
|
530
|
+
|
|
531
|
+
// When running multiple HyperBEAM instances, rebar3 shell auto-starts the
|
|
532
|
+
// hb app which binds port 8734 (default). The second instance fails to start
|
|
533
|
+
// the hb app because port 8734 is already in use. This leaves hb_sup,
|
|
534
|
+
// dev_scheduler_registry, and ar_timestamp uninitialized. We idempotently
|
|
535
|
+
// ensure they are running before calling start_mainnet.
|
|
536
|
+
const ensureInit = `(fun() -> try hb:init() catch _:_ -> ok end, case whereis(hb_sup) of undefined -> catch hb_sup:start_link(); _ -> ok end, catch dev_scheduler_registry:start(), catch ar_timestamp:start() end)(), `
|
|
537
|
+
|
|
538
|
+
// The HTTPSig codec transforms 'authority' to '@authority' in signature params but
|
|
539
|
+
// not in component lines, causing internal message verification to fail (RFC 9421).
|
|
540
|
+
// This affects both node_processes definitions (which include 'authority' via
|
|
541
|
+
// augment_definition) and push device re-scheduling (which signs outbox messages
|
|
542
|
+
// with httpsig). Disable verification until upstream fixes the codec.
|
|
543
|
+
const _verify_assignments = (this.p4_lua || this.genesis_wasm) ? `, <<"verify-assignments">> => false` : ""
|
|
544
|
+
|
|
545
|
+
// Use hb_http_server:start_node directly instead of hb:start_mainnet.
|
|
546
|
+
// start_mainnet always overwrites the store config with a single hb_store_fs,
|
|
547
|
+
// which prevents hb_store_gateway from resolving Arweave TX IDs.
|
|
548
|
+
// start_node preserves user-provided store via set_default_opts.
|
|
549
|
+
const _priv_wallet = `, <<"priv-wallet">> => hb:wallet(<<"${wallet}">>)`
|
|
550
|
+
// cache_control => <<"always">> ensures compute results/snapshots are cached.
|
|
551
|
+
// process_snapshot_slots => 1 takes a snapshot every slot (not just every 60s).
|
|
552
|
+
// process_async_cache => false writes snapshots synchronously before returning
|
|
553
|
+
// the HTTP response, preventing race conditions where the next compute call
|
|
554
|
+
// arrives before the snapshot is written.
|
|
555
|
+
// Without these, hb_cache:write strips uncommitted keys (like device-stack)
|
|
556
|
+
// from the cached process state, and subsequent computes fail with
|
|
557
|
+
// {error, no_valid_device_stack} when loading from the corrupted cache.
|
|
558
|
+
const _cache_control = `, <<"cache-control">> => <<"always">>, <<"process-snapshot-slots">> => 1, <<"process-async-cache">> => false`
|
|
559
|
+
|
|
560
|
+
const _linkify =
|
|
561
|
+
this.linkify_mode === undefined
|
|
562
|
+
? ""
|
|
563
|
+
: `, <<"linkify-mode">> => ${this.linkify_mode === false ? "false" : (this.linkify_mode === true ? "true" : this.linkify_mode)}`
|
|
564
|
+
const start = `${clearProxy}${initPrometheus}${preRegisterAtoms}${loadHbsig}${ensureInit}hb_http_server:start_node(#{ ${_port}${_gateway}${_priv_wallet}${_faff}${_bundler}${_bundler_ans104}${_on}${_p4_non_chargable}${_operator}${_spp}${_genesis_wasm_port}${_force_signed}${_devices}${_node_processes}${_cache_writers}${_relay_http_client}${_routes}${_store}${_verify_assignments}${_cache_control}, <<"prometheus">> => false${_linkify}}).`
|
|
565
|
+
|
|
566
|
+
return start
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
kill() {
|
|
570
|
+
// Kill CU server if we started it
|
|
571
|
+
if (this.cuProc && this.cuProc.pid) {
|
|
572
|
+
try {
|
|
573
|
+
process.kill(-this.cuProc.pid, "SIGKILL")
|
|
574
|
+
} catch (e) {
|
|
575
|
+
// Process may already be dead
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
// Kill main HyperBEAM shell process
|
|
579
|
+
if (this._shell) {
|
|
580
|
+
this._shell.kill("SIGKILL")
|
|
581
|
+
}
|
|
582
|
+
// Also kill any remaining beam.smp processes on our port
|
|
583
|
+
spawnSync("pkill", ["-9", "-f", `beam.smp.*${this.port}`], { stdio: "ignore" })
|
|
584
|
+
}
|
|
585
|
+
}
|
package/src/index.js
ADDED
package/src/keygen.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import _Arweave from "arweave"
|
|
2
|
+
const Arweave = _Arweave.default ?? _Arweave
|
|
3
|
+
import { toAddr } from "./utils.js"
|
|
4
|
+
import { mkdirSync, writeFileSync, existsSync, readdirSync } from "fs"
|
|
5
|
+
import { fileURLToPath } from "url"
|
|
6
|
+
import { dirname, resolve } from "path"
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
9
|
+
const __dirname = dirname(__filename)
|
|
10
|
+
const walletsDir = resolve(__dirname, "../devnet/.wallets")
|
|
11
|
+
const names = ["su", "cu", "mu", "acc0", "acc1", "acc2"]
|
|
12
|
+
|
|
13
|
+
async function main() {
|
|
14
|
+
const force = process.argv.includes("--force")
|
|
15
|
+
|
|
16
|
+
if (!force && existsSync(walletsDir)) {
|
|
17
|
+
const files = readdirSync(walletsDir).filter(f => f.endsWith(".json"))
|
|
18
|
+
if (files.length > 0) {
|
|
19
|
+
console.log("Wallets already exist in", walletsDir)
|
|
20
|
+
console.log("Use --force to regenerate")
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
mkdirSync(walletsDir, { recursive: true })
|
|
26
|
+
|
|
27
|
+
const arweave = Arweave.init({})
|
|
28
|
+
|
|
29
|
+
console.log("Generating wallets...\n")
|
|
30
|
+
|
|
31
|
+
for (const name of names) {
|
|
32
|
+
const jwk = await arweave.wallets.generate()
|
|
33
|
+
const addr = toAddr(jwk.n)
|
|
34
|
+
writeFileSync(
|
|
35
|
+
resolve(walletsDir, `${name}.json`),
|
|
36
|
+
JSON.stringify(jwk, null, 2),
|
|
37
|
+
)
|
|
38
|
+
console.log(` ${name.padEnd(5)} ${addr}`)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
console.log(`\nWallets written to ${walletsDir}`)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
main().catch(err => {
|
|
45
|
+
console.error(err)
|
|
46
|
+
process.exit(1)
|
|
47
|
+
})
|