@bolloon/bolloon-agent 0.2.9 → 0.2.10
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/README.md +467 -467
- package/bin/bolloon-cli.cjs +183 -183
- package/bin/bolloon.cjs +0 -0
- package/bin/bolloon.js +157 -0
- package/dist/agents/agent-manifest-protocol.js +0 -52
- package/dist/agents/constraint-layer.js +19 -19
- package/dist/agents/pi-sdk.js +287 -1213
- package/dist/agents/shell-guard.js +2 -2
- package/dist/agents/workflow-pivot-loop.js +2 -81
- package/dist/bollharness/src/scripts/deploy-guard.js +8 -8
- package/dist/bollharness-integration/context-router-judgment.js +4 -4
- package/dist/bollharness-integration/context-router.js +292 -292
- package/dist/bollharness-integration/gate-state-machine.js +13 -26
- package/dist/bollharness-integration/integration.js +0 -71
- package/dist/bollharness-integration/llm-judgment-engine.js +134 -134
- package/dist/bollharness-integration/skill-adapter.js +127 -52
- package/dist/bootstrap/context-collector.js +3 -6
- package/dist/bootstrap/lifecycle-hooks.js +1 -15
- package/dist/cli-entry.js +35 -39
- package/dist/constraint-runtime/src/_archive_helper.js +9 -0
- package/dist/constraint-runtime/src/agent/coordinator.js +48 -0
- package/dist/constraint-runtime/src/agent/index.js +1 -0
- package/dist/constraint-runtime/src/assistant/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap/index.js +12 -0
- package/dist/constraint-runtime/src/bootstrap_graph.js +13 -0
- package/dist/constraint-runtime/src/bridge/index.js +12 -0
- package/dist/constraint-runtime/src/buddy/index.js +12 -0
- package/dist/constraint-runtime/src/cli/index.js +12 -0
- package/dist/constraint-runtime/src/command_graph.js +10 -0
- package/dist/constraint-runtime/src/commands.js +60 -0
- package/dist/constraint-runtime/src/components/index.js +12 -0
- package/dist/constraint-runtime/src/constants/index.js +12 -0
- package/dist/constraint-runtime/src/constraint/budget.js +22 -0
- package/dist/constraint-runtime/src/constraint/index.js +2 -0
- package/dist/constraint-runtime/src/constraint/permission.js +20 -0
- package/dist/constraint-runtime/src/context.js +30 -0
- package/dist/constraint-runtime/src/coordinator/index.js +12 -0
- package/dist/constraint-runtime/src/cost_hook.js +4 -0
- package/dist/constraint-runtime/src/cost_tracker.js +8 -0
- package/dist/constraint-runtime/src/deferred_init.js +10 -0
- package/dist/constraint-runtime/src/direct_modes.js +6 -0
- package/dist/constraint-runtime/src/dynamic-tool-loader.js +85 -0
- package/dist/constraint-runtime/src/entrypoints/index.js +12 -0
- package/dist/constraint-runtime/src/execution_registry.js +44 -0
- package/dist/constraint-runtime/src/history.js +9 -0
- package/dist/constraint-runtime/src/hooks/index.js +12 -0
- package/dist/constraint-runtime/src/index.js +26 -0
- package/dist/constraint-runtime/src/ink.js +4 -0
- package/dist/constraint-runtime/src/keybindings/index.js +12 -0
- package/dist/constraint-runtime/src/memdir/index.js +12 -0
- package/dist/constraint-runtime/src/migrations/index.js +12 -0
- package/dist/constraint-runtime/src/models.js +1 -0
- package/dist/constraint-runtime/src/moreright/index.js +12 -0
- package/dist/constraint-runtime/src/native_ts/index.js +12 -0
- package/dist/constraint-runtime/src/output_styles/index.js +12 -0
- package/dist/constraint-runtime/src/parity_audit.js +12 -0
- package/dist/constraint-runtime/src/plugins/index.js +12 -0
- package/dist/constraint-runtime/src/port_manifest.js +11 -0
- package/dist/constraint-runtime/src/prefetch.js +9 -0
- package/dist/constraint-runtime/src/query.js +1 -0
- package/dist/constraint-runtime/src/remote/index.js +12 -0
- package/dist/constraint-runtime/src/remote_runtime.js +9 -0
- package/dist/constraint-runtime/src/runtime/index.js +1 -0
- package/dist/constraint-runtime/src/runtime/session.js +35 -0
- package/dist/constraint-runtime/src/schemas/index.js +12 -0
- package/dist/constraint-runtime/src/screens/index.js +12 -0
- package/dist/constraint-runtime/src/server/index.js +12 -0
- package/dist/constraint-runtime/src/services/index.js +12 -0
- package/dist/constraint-runtime/src/session_store.js +22 -0
- package/dist/constraint-runtime/src/setup.js +30 -0
- package/dist/constraint-runtime/src/skills/index.js +1 -0
- package/dist/constraint-runtime/src/skills/skill-registry.js +28 -0
- package/dist/constraint-runtime/src/state/index.js +12 -0
- package/dist/constraint-runtime/src/system_init.js +20 -0
- package/dist/constraint-runtime/src/thinking/engine.js +42 -0
- package/dist/constraint-runtime/src/thinking/index.js +1 -0
- package/dist/constraint-runtime/src/tool_pool.js +8 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/execAdapter.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/listAdapters.js +7 -0
- package/dist/constraint-runtime/src/tools/OpenCLI/runCommand.js +7 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/confirmTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/createTransaction.js +8 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/executeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getBalance.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/getPendingTransactions.js +6 -0
- package/dist/constraint-runtime/src/tools/SafeSDK/proposeTransaction.js +6 -0
- package/dist/constraint-runtime/src/tools.js +80 -0
- package/dist/constraint-runtime/src/transcript.js +19 -0
- package/dist/constraint-runtime/src/types/index.js +12 -0
- package/dist/constraint-runtime/src/upstream_proxy/index.js +12 -0
- package/dist/constraint-runtime/src/utils/index.js +12 -0
- package/dist/constraint-runtime/src/vim/index.js +12 -0
- package/dist/constraint-runtime/src/voice/index.js +12 -0
- package/dist/constraint-runtime/tests/agent.test.js +16 -0
- package/dist/constraint-runtime/tests/constraint.test.js +41 -0
- package/dist/constraint-runtime/tests/skill.test.js +19 -0
- package/dist/constraint-runtime/tests/thinking.test.js +22 -0
- package/dist/context-compaction/auto-compact.js +7 -7
- package/dist/electron-preload.js +1 -18
- package/dist/electron-preload.js.map +1 -1
- package/dist/electron.js +168 -3
- package/dist/electron.js.map +1 -1
- package/dist/index.js +116 -136
- package/dist/llm/config-store.js +8 -24
- package/dist/llm/llm-judgment-client.js +102 -102
- package/dist/llm/pi-ai.js +85 -126
- package/dist/llm/system-prompt/layers/channel/local.md +14 -14
- package/dist/llm/system-prompt/layers/channel/p2p-agent.md +18 -18
- package/dist/llm/system-prompt/layers/channel/p2p-visitor.md +19 -19
- package/dist/llm/system-prompt/layers/core/artifacts_storage.md +89 -89
- package/dist/llm/system-prompt/layers/core/evenhandedness.md +21 -21
- package/dist/llm/system-prompt/layers/core/hibs_reminders.md +15 -15
- package/dist/llm/system-prompt/layers/core/identity.md +37 -37
- package/dist/llm/system-prompt/layers/core/knowledge.md +17 -17
- package/dist/llm/system-prompt/layers/core/memory_system.md +12 -12
- package/dist/llm/system-prompt/layers/core/network_filesystem.md +28 -28
- package/dist/llm/system-prompt/layers/core/refusal.md +37 -37
- package/dist/llm/system-prompt/layers/core/tone.md +31 -31
- package/dist/llm/system-prompt/layers/core/tools.thin.md +13 -13
- package/dist/llm/system-prompt/layers/core/wellbeing.md +41 -41
- package/dist/llm/system-prompt/layers/role/architect.md +20 -20
- package/dist/llm/system-prompt/layers/role/expert.md +19 -19
- package/dist/llm/system-prompt/layers/role/implementer.md +15 -15
- package/dist/llm/system-prompt/layers/role/security.md +15 -15
- package/dist/llm/system-prompt/layers/tool/artifacts.md +72 -72
- package/dist/llm/system-prompt/layers/tool/bash.md +25 -25
- package/dist/llm/system-prompt/layers/tool/hibs_api.md +171 -171
- package/dist/llm/system-prompt/layers/tool/image_search.md +70 -70
- package/dist/llm/system-prompt/layers/tool/manifest.md +89 -89
- package/dist/llm/system-prompt/layers/tool/mcp_apps.md +53 -53
- package/dist/llm/system-prompt/layers/tool/web_search.md +83 -83
- package/dist/llm/tool-manifest/ask_user_input.js +1 -1
- package/dist/llm/tool-manifest/bash.js +3 -3
- package/dist/llm/tool-manifest/create_file.js +4 -4
- package/dist/llm/tool-manifest/fetch_sports_data.js +3 -3
- package/dist/llm/tool-manifest/image_search.js +2 -2
- package/dist/llm/tool-manifest/mcp.js +2 -2
- package/dist/llm/tool-manifest/message_compose.js +3 -3
- package/dist/llm/tool-manifest/places.js +2 -2
- package/dist/llm/tool-manifest/present_files.js +1 -1
- package/dist/llm/tool-manifest/recipe.js +2 -2
- package/dist/llm/tool-manifest/str_replace.js +5 -5
- package/dist/llm/tool-manifest/view.js +3 -3
- package/dist/llm/tool-manifest/weather.js +4 -4
- package/dist/llm/tool-manifest/web.js +4 -4
- package/dist/pi-ecosystem-colony/index.js +365 -0
- package/dist/pi-ecosystem-judgment/causal-judge.js +51 -51
- package/dist/pi-ecosystem-judgment/distill-prompt.js +42 -42
- package/dist/pi-ecosystem-judgment/distillation.js +14 -14
- package/dist/pi-ecosystem-judgment/monitor-gate.js +28 -28
- package/dist/pi-ecosystem-judgment/value-injection.js +102 -102
- package/dist/security/context-router-tool.js +15 -15
- package/dist/security/tool-gate.js +0 -11
- package/dist/social/ant-colony/AdaptiveHeartbeat.js +101 -0
- package/dist/social/ant-colony/PheromoneEngine.js +227 -0
- package/dist/social/ant-colony/index.js +6 -0
- package/dist/social/ant-colony/types.js +24 -0
- package/dist/test/ai-judgment-test.js +80 -0
- package/dist/test/bollharness-integration.test.js +318 -0
- package/dist/test/channel-agent-multi-dialogue.js +205 -0
- package/dist/test/channel-heartbeat-agent-test.js +201 -0
- package/dist/test/constraint-layer.test.js +164 -0
- package/dist/test/diap-identity-test.js +172 -0
- package/dist/test/diap-quick-test.js +62 -0
- package/dist/test/global-shared-context.test.js +315 -0
- package/dist/test/harness-judgment-injection.test.js +246 -0
- package/dist/test/harness-workflow-integrator-test.js +228 -0
- package/dist/test/human-value-store.test.js +243 -0
- package/dist/test/hybrid-integration-test.js +118 -0
- package/dist/test/hybrid-messenger-verify.js +55 -0
- package/dist/test/iroh-bistream-debug.js +38 -0
- package/dist/test/iroh-communication.test.js +66 -0
- package/dist/test/iroh-debug-test.js +57 -0
- package/dist/test/iroh-diap-test.js +71 -0
- package/dist/test/iroh-direct-connect.js +55 -0
- package/dist/test/iroh-e2e-fixed.js +89 -0
- package/dist/test/iroh-e2e-same-process.js +63 -0
- package/dist/test/iroh-e2e.js +66 -0
- package/dist/test/iroh-final-e2e.js +72 -0
- package/dist/test/iroh-relay-test.js +37 -0
- package/dist/test/iroh-simple-test.js +41 -0
- package/dist/test/iroh-transport-verify.js +54 -0
- package/dist/test/iroh-transport.test.js +37 -0
- package/dist/test/iroh-two-nodes.js +70 -0
- package/dist/test/iroh-verify.js +44 -0
- package/dist/test/judgment-decision.test.js +219 -0
- package/dist/test/llm-judgment-integration.test.js +220 -0
- package/dist/test/p2p-agent-complex-dialogue.js +385 -0
- package/dist/test/p2p-agent-dialogue.js +341 -0
- package/dist/test/p2p-agent-full-bidirectional.js +510 -0
- package/dist/test/p2p-agent-harness-flow.js +437 -0
- package/dist/test/p2p-agent-harness-single.js +143 -0
- package/dist/test/p2p-ai-dialogue-test.js +318 -0
- package/dist/test/p2p-cid-connect-test.js +195 -0
- package/dist/test/p2p-connect-receiver.js +69 -0
- package/dist/test/p2p-doc-transfer.js +110 -0
- package/dist/test/p2p-identity-page-test.js +77 -0
- package/dist/test/p2p-iroh-test.js +171 -0
- package/dist/test/p2p-minimal-test.js +241 -0
- package/dist/test/p2p-node-1.js +148 -0
- package/dist/test/p2p-node-2.js +148 -0
- package/dist/test/p2p-server.js +281 -0
- package/dist/test/p2p-two-nodes-test.js +438 -0
- package/dist/test/pi-sdk.test.js +44 -0
- package/dist/test/set-persona.js +40 -0
- package/dist/test/simple.test.js +9 -0
- package/dist/test/storage-integration.test.js +150 -0
- package/dist/test/subagent-manager.test.js +276 -0
- package/dist/test/test-gate-flow.test.js +81 -0
- package/dist/test/workflow-engine.test.js +87 -0
- package/dist/test/workflow-pivot-loop.test.js +246 -0
- package/dist/web/api-config.html +520 -520
- package/dist/web/client.js +2917 -3791
- package/dist/web/components/p2p/index.js +234 -276
- package/dist/web/components/wallet-viem.mjs +118 -118
- package/dist/web/index.html +374 -373
- package/dist/web/manifest.json +20 -20
- package/dist/web/server.js +23 -775
- package/dist/web/style.css +4737 -4737
- package/dist/web/ui/message-renderer.js +373 -451
- package/dist/web/ui/step-timeline.js +255 -351
- package/package.json +160 -160
- package/scripts/build-cli.js +215 -215
- package/scripts/build-web.ts +125 -125
- package/scripts/postinstall.js +152 -152
- package/bin/bolloon-daemon.sh +0 -207
- package/bin/ipfs +0 -0
- package/dist/agents/chat-segmenter.js +0 -298
- package/dist/agents/judgment-protocol.js +0 -479
- package/dist/agents/parse-tool-call.js +0 -304
- package/dist/agents/peer-manifest-loader.js +0 -210
- package/dist/agents/react-loop.js +0 -120
- package/dist/agents/session-store.js +0 -171
- package/dist/agents/tool-registry.js +0 -136
- package/dist/bootstrap/chat-archiver.js +0 -276
- package/dist/bootstrap/memory-compressor.js +0 -170
- package/dist/bootstrap/persona-loader.js +0 -94
- package/dist/electron/config.js +0 -16
- package/dist/electron/config.js.map +0 -1
- package/dist/electron/dialogs.js +0 -71
- package/dist/electron/dialogs.js.map +0 -1
- package/dist/electron/first-run.js +0 -129
- package/dist/electron/first-run.js.map +0 -1
- package/dist/electron/ipc.js +0 -16
- package/dist/electron/ipc.js.map +0 -1
- package/dist/electron/logger.js +0 -77
- package/dist/electron/logger.js.map +0 -1
- package/dist/electron/main.js +0 -60
- package/dist/electron/main.js.map +0 -1
- package/dist/electron/menu.js +0 -140
- package/dist/electron/menu.js.map +0 -1
- package/dist/electron/paths.js +0 -33
- package/dist/electron/paths.js.map +0 -1
- package/dist/electron/server.js +0 -74
- package/dist/electron/server.js.map +0 -1
- package/dist/electron/tray.js +0 -73
- package/dist/electron/tray.js.map +0 -1
- package/dist/electron/window.js +0 -69
- package/dist/electron/window.js.map +0 -1
- package/dist/network/local-inbox-bus.js +0 -73
- package/dist/network/p2p-outbox.js +0 -161
- package/dist/network/peer-fs.js +0 -420
- package/dist/network/peer-resource-bridge.js +0 -216
- package/dist/web/components/p2p/P2PModal.js +0 -188
- package/dist/web/components/p2p/p2p-modal.js +0 -664
- package/dist/web/components/p2p/p2p-tools.js +0 -248
- package/dist/web/input-validator.js +0 -103
- package/dist/web/util/safe-name.js +0 -32
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Endpoint } from '@rayhanadev/iroh';
|
|
2
|
+
const IROH_ALPN = 'bolloon/iroh/1';
|
|
3
|
+
async function testConnection() {
|
|
4
|
+
console.log('=== Direct Connection Test ===\n');
|
|
5
|
+
// Server
|
|
6
|
+
console.log('[1] Starting server...');
|
|
7
|
+
const server = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
8
|
+
await server.online();
|
|
9
|
+
const serverId = server.nodeId();
|
|
10
|
+
console.log(` Server ID: ${serverId}`);
|
|
11
|
+
console.log(` Server addr: ${server.addr()}`);
|
|
12
|
+
// Accept in background
|
|
13
|
+
let acceptedConn = null;
|
|
14
|
+
server.accept().then((conn) => {
|
|
15
|
+
console.log('[Server] Connection accepted!');
|
|
16
|
+
acceptedConn = conn;
|
|
17
|
+
});
|
|
18
|
+
// Client
|
|
19
|
+
console.log('\n[2] Starting client...');
|
|
20
|
+
const client = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
21
|
+
await client.online();
|
|
22
|
+
const clientId = client.nodeId();
|
|
23
|
+
console.log(` Client ID: ${clientId}`);
|
|
24
|
+
console.log('\n[3] Client connecting to server...');
|
|
25
|
+
try {
|
|
26
|
+
const conn = await client.connect(serverId, IROH_ALPN);
|
|
27
|
+
console.log('[Client] Connected!');
|
|
28
|
+
console.log(` Remote: ${conn.remoteNodeId()}`);
|
|
29
|
+
// Send message
|
|
30
|
+
console.log('\n[4] Client sending message...');
|
|
31
|
+
const { send, recv } = await conn.openBi();
|
|
32
|
+
await send.writeAll(Buffer.from('hello:world'));
|
|
33
|
+
await send.finish();
|
|
34
|
+
console.log('[5] Waiting for server to receive...');
|
|
35
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
36
|
+
if (acceptedConn) {
|
|
37
|
+
console.log('[Server] Reading message...');
|
|
38
|
+
const data = await recv.readToEnd(1024);
|
|
39
|
+
console.log(` Received: "${new TextDecoder().decode(data)}"`);
|
|
40
|
+
console.log('✅ CONNECTION TEST PASSED');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
console.log('❌ Server did not accept connection');
|
|
44
|
+
}
|
|
45
|
+
conn.close();
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
console.log('[Client] Connection failed:', e);
|
|
49
|
+
console.log('❌ CONNECTION TEST FAILED');
|
|
50
|
+
}
|
|
51
|
+
await server.close();
|
|
52
|
+
await client.close();
|
|
53
|
+
console.log('\nDone');
|
|
54
|
+
}
|
|
55
|
+
testConnection().catch(console.error);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Endpoint } from '@rayhanadev/iroh';
|
|
2
|
+
const IROH_ALPN = 'bolloon/iroh/1';
|
|
3
|
+
async function testConnection() {
|
|
4
|
+
console.log('=== iroh E2E Test ===\n');
|
|
5
|
+
console.log('[1] Starting server...');
|
|
6
|
+
const server = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
7
|
+
await server.online();
|
|
8
|
+
console.log(` Server ID: ${server.nodeId()}`);
|
|
9
|
+
let serverConn = null;
|
|
10
|
+
server.accept().then((conn) => {
|
|
11
|
+
serverConn = conn;
|
|
12
|
+
console.log('[Server] ✅ Connection accepted!');
|
|
13
|
+
}).catch((e) => {
|
|
14
|
+
console.log('[Server] ❌ Accept error:', e.message || e);
|
|
15
|
+
});
|
|
16
|
+
console.log('\n[2] Starting client...');
|
|
17
|
+
const client = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
18
|
+
await client.online();
|
|
19
|
+
console.log(` Client ID: ${client.nodeId()}`);
|
|
20
|
+
console.log('\n[3] Client connecting to server...');
|
|
21
|
+
let clientConn = null;
|
|
22
|
+
try {
|
|
23
|
+
clientConn = await client.connect(server.nodeId(), IROH_ALPN);
|
|
24
|
+
console.log('[Client] ✅ Connected!');
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
console.log('[Client] ❌ Connection failed:', e.message || e);
|
|
28
|
+
await server.close();
|
|
29
|
+
await client.close();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log('\n[4] Waiting for server to accept connection...');
|
|
33
|
+
let waitCount = 0;
|
|
34
|
+
while (!serverConn && waitCount < 20) {
|
|
35
|
+
await new Promise(r => setTimeout(r, 500));
|
|
36
|
+
waitCount++;
|
|
37
|
+
process.stdout.write(` Waiting... ${waitCount}/20\r`);
|
|
38
|
+
}
|
|
39
|
+
console.log('');
|
|
40
|
+
if (!serverConn) {
|
|
41
|
+
console.log('❌ Server did not accept connection');
|
|
42
|
+
await server.close();
|
|
43
|
+
await client.close();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
console.log('[5] Client opening bi-stream...');
|
|
47
|
+
const clientStreams = await clientConn.openBi();
|
|
48
|
+
console.log(' Bi-stream opened');
|
|
49
|
+
console.log('[6] Server accepting bi-stream...');
|
|
50
|
+
let serverStreams = null;
|
|
51
|
+
try {
|
|
52
|
+
serverStreams = await serverConn.acceptBi();
|
|
53
|
+
console.log(' Bi-stream accepted');
|
|
54
|
+
}
|
|
55
|
+
catch (e) {
|
|
56
|
+
console.log('[Server] ❌ Accept bi error:', e.message || e);
|
|
57
|
+
}
|
|
58
|
+
if (!serverStreams) {
|
|
59
|
+
console.log('❌ Server could not accept bi-stream');
|
|
60
|
+
clientConn.close();
|
|
61
|
+
await server.close();
|
|
62
|
+
await client.close();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
console.log('\n[7] Client sending message...');
|
|
66
|
+
const { send: clientSend, recv: clientRecv } = clientStreams;
|
|
67
|
+
const message = 'hello:this is a test message';
|
|
68
|
+
await clientSend.writeAll(Buffer.from(message));
|
|
69
|
+
await clientSend.finish();
|
|
70
|
+
console.log(` Sent: "${message}"`);
|
|
71
|
+
console.log('[8] Server receiving message...');
|
|
72
|
+
const { recv: serverRecv } = serverStreams;
|
|
73
|
+
const received = await serverRecv.readToEnd(1024);
|
|
74
|
+
console.log(` ✅ Received: "${new TextDecoder().decode(received)}"`);
|
|
75
|
+
console.log('\n[9] Server sending response...');
|
|
76
|
+
const { send: serverSend } = serverStreams;
|
|
77
|
+
const response = 'response:hello from server';
|
|
78
|
+
await serverSend.writeAll(Buffer.from(response));
|
|
79
|
+
await serverSend.finish();
|
|
80
|
+
console.log(` Sent: "${response}"`);
|
|
81
|
+
console.log('[10] Client receiving response...');
|
|
82
|
+
const resp = await clientRecv.readToEnd(1024);
|
|
83
|
+
console.log(` ✅ Received: "${new TextDecoder().decode(resp)}"`);
|
|
84
|
+
console.log('\n✅✅✅ FULL E2E TEST PASSED ✅✅✅');
|
|
85
|
+
clientConn.close();
|
|
86
|
+
await server.close();
|
|
87
|
+
await client.close();
|
|
88
|
+
}
|
|
89
|
+
testConnection().catch(console.error);
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
async function testTwoNodes() {
|
|
3
|
+
console.log('╔═══════════════════════════════════════════╗');
|
|
4
|
+
console.log('║ iroh Two-Node E2E Test ║');
|
|
5
|
+
console.log('╚═══════════════════════════════════════════╝\n');
|
|
6
|
+
let serverNodeId = null;
|
|
7
|
+
let clientNodeId = null;
|
|
8
|
+
let messagesReceived = 0;
|
|
9
|
+
console.log('[1] Starting server node...');
|
|
10
|
+
const server = await irohTransport.start();
|
|
11
|
+
serverNodeId = server.nodeId;
|
|
12
|
+
console.log(` Server Node ID: ${serverNodeId}`);
|
|
13
|
+
console.log('');
|
|
14
|
+
irohTransport.onMessage('ping', (msg) => {
|
|
15
|
+
messagesReceived++;
|
|
16
|
+
console.log(` [Server] Got ping: "${new TextDecoder().decode(msg.payload)}"`);
|
|
17
|
+
irohTransport.sendMessage(msg.from, 'pong', new TextEncoder().encode('pong'));
|
|
18
|
+
});
|
|
19
|
+
irohTransport.onMessage('request', async (msg) => {
|
|
20
|
+
messagesReceived++;
|
|
21
|
+
console.log(` [Server] Got request: "${new TextDecoder().decode(msg.payload)}"`);
|
|
22
|
+
const response = await irohTransport.requestResponse(msg.from, 'response', new TextEncoder().encode('response data'));
|
|
23
|
+
if (response) {
|
|
24
|
+
console.log(` [Server] Response sent`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
console.log('[2] Starting client node...');
|
|
28
|
+
const clientTransport = new (await import('../network/iroh-transport.js')).IrohTransport();
|
|
29
|
+
const client = await clientTransport.start();
|
|
30
|
+
clientNodeId = client.node;
|
|
31
|
+
console.log(` Client Node ID: ${clientNodeId}`);
|
|
32
|
+
console.log('');
|
|
33
|
+
let clientPongs = 0;
|
|
34
|
+
let clientResponses = 0;
|
|
35
|
+
clientTransport.onMessage('pong', (msg) => {
|
|
36
|
+
clientPongs++;
|
|
37
|
+
console.log(` [Client] Got pong: "${new TextDecoder().decode(msg.payload)}"`);
|
|
38
|
+
});
|
|
39
|
+
clientTransport.onMessage('response', (msg) => {
|
|
40
|
+
clientResponses++;
|
|
41
|
+
console.log(` [Client] Got response: "${new TextDecoder().decode(msg.payload)}"`);
|
|
42
|
+
});
|
|
43
|
+
await new Promise(r => setTimeout(r, 500));
|
|
44
|
+
console.log('[3] Client sending ping to server...');
|
|
45
|
+
await clientTransport.sendMessage(serverNodeId, 'ping', new TextEncoder().encode('hello'));
|
|
46
|
+
await new Promise(r => setTimeout(r, 500));
|
|
47
|
+
console.log('[4] Client sending request (with response)...');
|
|
48
|
+
await clientTransport.sendMessage(serverNodeId, 'request', new TextEncoder().encode('need data'));
|
|
49
|
+
await new Promise(r => setTimeout(r, 2000));
|
|
50
|
+
console.log('\n[5] Results:');
|
|
51
|
+
console.log(` Messages received by server: ${messagesReceived}`);
|
|
52
|
+
console.log(` Pongs received by client: ${clientPongs}`);
|
|
53
|
+
console.log(` Responses received by client: ${clientResponses}`);
|
|
54
|
+
const success = messagesReceived >= 2 && clientPongs >= 1 && clientResponses >= 1;
|
|
55
|
+
console.log('\n' + (success ? '✅ E2E TEST PASSED' : '❌ E2E TEST FAILED'));
|
|
56
|
+
await clientTransport.shutdown();
|
|
57
|
+
await irohTransport.shutdown();
|
|
58
|
+
process.exit(success ? 0 : 1);
|
|
59
|
+
}
|
|
60
|
+
testTwoNodes().catch(e => {
|
|
61
|
+
console.error('Test failed:', e);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
const args = process.argv.slice(2);
|
|
3
|
+
const role = args[0];
|
|
4
|
+
const targetNodeId = args[1];
|
|
5
|
+
if (!role || !['server', 'client'].includes(role)) {
|
|
6
|
+
console.log('Usage:');
|
|
7
|
+
console.log(' Server: npx tsx src/test/iroh-e2e.ts server');
|
|
8
|
+
console.log(' Client: npx tsx src/test/iroh-e2e.ts client <server-node-id>');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
async function runServer() {
|
|
12
|
+
console.log('[Server] Starting iroh transport...');
|
|
13
|
+
const node = await irohTransport.start();
|
|
14
|
+
console.log('[Server] Node ID:', node.nodeId);
|
|
15
|
+
console.log('[Server] Waiting for connections...\n');
|
|
16
|
+
let msgCount = 0;
|
|
17
|
+
irohTransport.onMessage('ping', (msg) => {
|
|
18
|
+
msgCount++;
|
|
19
|
+
console.log(`[Server] #${msgCount} Ping from ${msg.from.substring(0, 16)}...`);
|
|
20
|
+
console.log(`[Server] Payload: "${new TextDecoder().decode(msg.payload)}"`);
|
|
21
|
+
irohTransport.sendMessage(msg.from, 'pong', new TextEncoder().encode('pong from server'));
|
|
22
|
+
});
|
|
23
|
+
irohTransport.onMessage('task', (msg) => {
|
|
24
|
+
msgCount++;
|
|
25
|
+
console.log(`[Server] #${msgCount} Task from ${msg.from.substring(0, 16)}...`);
|
|
26
|
+
const task = new TextDecoder().decode(msg.payload);
|
|
27
|
+
console.log(`[Server] Task: ${task.substring(0, 60)}...`);
|
|
28
|
+
irohTransport.sendMessage(msg.from, 'response', new TextEncoder().encode('task received'));
|
|
29
|
+
});
|
|
30
|
+
console.log('[Server] Ready. Press Ctrl+C to stop.');
|
|
31
|
+
await new Promise(() => { });
|
|
32
|
+
}
|
|
33
|
+
async function runClient(targetId) {
|
|
34
|
+
if (!targetId) {
|
|
35
|
+
console.error('[Client] Error: target node ID required');
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
console.log('[Client] Starting iroh transport...');
|
|
39
|
+
const node = await irohTransport.start();
|
|
40
|
+
console.log('[Client] Node ID:', node.nodeId);
|
|
41
|
+
console.log('[Client] Target:', targetId);
|
|
42
|
+
console.log('');
|
|
43
|
+
irohTransport.onMessage('pong', (msg) => {
|
|
44
|
+
console.log(`[Client] Pong from ${msg.from.substring(0, 16)}...: "${new TextDecoder().decode(msg.payload)}"`);
|
|
45
|
+
});
|
|
46
|
+
irohTransport.onMessage('response', (msg) => {
|
|
47
|
+
console.log(`[Client] Response from ${msg.from.substring(0, 16)}...: "${new TextDecoder().decode(msg.payload)}"`);
|
|
48
|
+
});
|
|
49
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
50
|
+
console.log('[Client] Sending ping...');
|
|
51
|
+
await irohTransport.sendMessage(targetId, 'ping', new TextEncoder().encode('hello server'));
|
|
52
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
53
|
+
console.log('[Client] Sending task...');
|
|
54
|
+
const task = JSON.stringify({ id: '123', type: 'summarize', documentPath: '/test.pdf' });
|
|
55
|
+
await irohTransport.sendMessage(targetId, 'task', new TextEncoder().encode(task));
|
|
56
|
+
console.log('[Client] Waiting for responses...');
|
|
57
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
58
|
+
await irohTransport.shutdown();
|
|
59
|
+
console.log('[Client] Done');
|
|
60
|
+
}
|
|
61
|
+
if (role === 'server') {
|
|
62
|
+
runServer();
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
runClient(targetNodeId);
|
|
66
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Endpoint } from '@rayhanadev/iroh';
|
|
2
|
+
const IROH_ALPN = 'bolloon/iroh/1';
|
|
3
|
+
async function main() {
|
|
4
|
+
console.log('=== iroh E2E Final Test ===\n');
|
|
5
|
+
const serverEndpoint = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
6
|
+
await serverEndpoint.online();
|
|
7
|
+
console.log('[Server] Started, ID:', serverEndpoint.nodeId().substring(0, 16) + '...');
|
|
8
|
+
const clientEndpoint = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
9
|
+
await clientEndpoint.online();
|
|
10
|
+
console.log('[Client] Started, ID:', clientEndpoint.nodeId().substring(0, 16) + '...');
|
|
11
|
+
let serverConn = null;
|
|
12
|
+
let serverConnPromise = serverEndpoint.accept().then(c => { serverConn = c; return c; });
|
|
13
|
+
console.log('[Client] Connecting to server...');
|
|
14
|
+
let clientConn = null;
|
|
15
|
+
try {
|
|
16
|
+
clientConn = await clientEndpoint.connect(serverEndpoint.nodeId(), IROH_ALPN);
|
|
17
|
+
console.log('[Client] ✅ Connected!');
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
console.log('[Client] ❌ Failed:', e.message);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
console.log('[Server] Waiting for accept...');
|
|
24
|
+
try {
|
|
25
|
+
await serverConnPromise;
|
|
26
|
+
console.log('[Server] ✅ Connection accepted!');
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
console.log('[Server] ❌ Accept failed:', e.message);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log('[Client] Opening bi-stream...');
|
|
33
|
+
let clientBi = null;
|
|
34
|
+
try {
|
|
35
|
+
clientBi = await clientConn.openBi();
|
|
36
|
+
console.log('[Client] ✅ Bi-stream opened');
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
console.log('[Client] ❌ openBi failed:', e.message);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log('[Server] Accepting bi-stream...');
|
|
43
|
+
let serverBi = null;
|
|
44
|
+
try {
|
|
45
|
+
serverBi = await serverConn.acceptBi();
|
|
46
|
+
console.log('[Server] ✅ Bi-stream accepted');
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
console.log('[Server] ❌ acceptBi failed:', e.message);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log('\n[Test] Sending message client → server...');
|
|
53
|
+
const { send: cSend, recv: cRecv } = clientBi;
|
|
54
|
+
await cSend.writeAll(Buffer.from('hello from client'));
|
|
55
|
+
await cSend.finish();
|
|
56
|
+
const { recv: sRecv, send: sSend } = serverBi;
|
|
57
|
+
const msg = await sRecv.readToEnd(1024);
|
|
58
|
+
console.log('[Server] ✅ Received:', new TextDecoder().decode(msg));
|
|
59
|
+
console.log('[Server] Sending response...');
|
|
60
|
+
await sSend.writeAll(Buffer.from('hello from server'));
|
|
61
|
+
await sSend.finish();
|
|
62
|
+
const resp = await cRecv.readToEnd(1024);
|
|
63
|
+
console.log('[Client] ✅ Received:', new TextDecoder().decode(resp));
|
|
64
|
+
console.log('\n✅✅✅ E2E TEST PASSED ✅✅✅');
|
|
65
|
+
clientConn.close();
|
|
66
|
+
await serverEndpoint.close();
|
|
67
|
+
await clientEndpoint.close();
|
|
68
|
+
}
|
|
69
|
+
main().catch(e => {
|
|
70
|
+
console.error('Error:', e);
|
|
71
|
+
process.exit(1);
|
|
72
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Endpoint } from '@rayhanadev/iroh';
|
|
2
|
+
const IROH_ALPN = 'bolloon/iroh/1';
|
|
3
|
+
async function testConnection() {
|
|
4
|
+
console.log('=== iroh Relay Connection Test ===\n');
|
|
5
|
+
console.log('[1] Starting server...');
|
|
6
|
+
const server = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
7
|
+
await server.online();
|
|
8
|
+
console.log(` Server ID: ${server.nodeId()}`);
|
|
9
|
+
console.log(` Server addr: ${server.addr()}`);
|
|
10
|
+
console.log('\n[2] Starting client...');
|
|
11
|
+
const client = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
12
|
+
await client.online();
|
|
13
|
+
console.log(` Client ID: ${client.nodeId()}`);
|
|
14
|
+
console.log('\n[3] Client connecting to server via relay...');
|
|
15
|
+
try {
|
|
16
|
+
console.log(' Waiting for connection (relay may take time)...');
|
|
17
|
+
const conn = await client.connect(server.nodeId(), IROH_ALPN);
|
|
18
|
+
console.log('[Client] ✅ Connected!');
|
|
19
|
+
console.log(` Remote: ${conn.remoteNodeId()}`);
|
|
20
|
+
console.log('\n[4] Client sending message...');
|
|
21
|
+
const { send, recv } = await conn.openBi();
|
|
22
|
+
await send.writeAll(Buffer.from('hello:test message'));
|
|
23
|
+
await send.finish();
|
|
24
|
+
console.log(' Message sent');
|
|
25
|
+
console.log('\n[5] Server receiving...');
|
|
26
|
+
const data = await recv.readToEnd(1024);
|
|
27
|
+
console.log(` ✅ Received: "${new TextDecoder().decode(data)}"`);
|
|
28
|
+
console.log('\n✅ FULL E2E TEST PASSED');
|
|
29
|
+
conn.close();
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
console.log('[Client] ❌ Connection failed:', e.message || e);
|
|
33
|
+
}
|
|
34
|
+
await server.close();
|
|
35
|
+
await client.close();
|
|
36
|
+
}
|
|
37
|
+
testConnection().catch(console.error);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Endpoint } from '@rayhanadev/iroh';
|
|
2
|
+
const IROH_ALPN = 'bolloon/iroh/1';
|
|
3
|
+
async function testConnection() {
|
|
4
|
+
console.log('=== iroh E2E Test (Simple) ===\n');
|
|
5
|
+
console.log('[1] Starting server...');
|
|
6
|
+
const server = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
7
|
+
await server.online();
|
|
8
|
+
console.log(` Server ID: ${server.nodeId()}`);
|
|
9
|
+
console.log('[2] Starting client...');
|
|
10
|
+
const client = await Endpoint.createWithOptions({ alpns: [IROH_ALPN] });
|
|
11
|
+
await client.online();
|
|
12
|
+
console.log(` Client ID: ${client.nodeId()}`);
|
|
13
|
+
console.log('\n[3] Client connecting...');
|
|
14
|
+
let clientConn = null;
|
|
15
|
+
try {
|
|
16
|
+
clientConn = await client.connect(server.nodeId(), IROH_ALPN);
|
|
17
|
+
console.log('[Client] ✅ Connected!');
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
console.log('[Client] ❌ Failed:', e.message || e);
|
|
21
|
+
await server.close();
|
|
22
|
+
await client.close();
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log('[4] Client sending datagram...');
|
|
26
|
+
try {
|
|
27
|
+
clientConn.sendDatagram(Buffer.from('hello:test datagram'));
|
|
28
|
+
console.log(' Datagram sent');
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
console.log('[Client] ❌ Datagram failed:', e.message || e);
|
|
32
|
+
}
|
|
33
|
+
console.log('[5] Waiting 3s...');
|
|
34
|
+
await new Promise(r => setTimeout(r, 3000));
|
|
35
|
+
console.log('[6] Closing connections...');
|
|
36
|
+
clientConn.close();
|
|
37
|
+
await server.close();
|
|
38
|
+
await client.close();
|
|
39
|
+
console.log('\n✅ Connection test completed');
|
|
40
|
+
}
|
|
41
|
+
testConnection().catch(console.error);
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
async function main() {
|
|
3
|
+
console.log('=== iroh Transport Core Verification ===\n');
|
|
4
|
+
let allPassed = true;
|
|
5
|
+
console.log('[1] Start transport');
|
|
6
|
+
try {
|
|
7
|
+
const node = await irohTransport.start();
|
|
8
|
+
console.log(' ✅ Started, ID:', node.nodeId.substring(0, 20) + '...');
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
console.log(' ❌ Failed:', e);
|
|
12
|
+
allPassed = false;
|
|
13
|
+
}
|
|
14
|
+
console.log('\n[2] Running state');
|
|
15
|
+
console.log(' ' + (irohTransport.isRunning() ? '✅ Running' : '❌ Not running'));
|
|
16
|
+
console.log('\n[3] Node ID format');
|
|
17
|
+
const nodeId = irohTransport.getNodeId();
|
|
18
|
+
if (nodeId && nodeId.length === 64) {
|
|
19
|
+
console.log(' ✅ Valid 64-char hex ID');
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.log(' ❌ Invalid ID');
|
|
23
|
+
allPassed = false;
|
|
24
|
+
}
|
|
25
|
+
console.log('\n[4] Message handlers');
|
|
26
|
+
irohTransport.onMessage('test', () => { });
|
|
27
|
+
irohTransport.onMessage('*', () => { });
|
|
28
|
+
console.log(' ✅ Handlers registered');
|
|
29
|
+
console.log('\n[5] Shutdown');
|
|
30
|
+
await irohTransport.shutdown();
|
|
31
|
+
if (!irohTransport.isRunning()) {
|
|
32
|
+
console.log(' ✅ Stopped');
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(' ❌ Still running');
|
|
36
|
+
allPassed = false;
|
|
37
|
+
}
|
|
38
|
+
console.log('\n[6] Re-start after shutdown');
|
|
39
|
+
try {
|
|
40
|
+
await irohTransport.start();
|
|
41
|
+
console.log(' ✅ Restart works');
|
|
42
|
+
await irohTransport.shutdown();
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
console.log(' ❌ Restart failed');
|
|
46
|
+
allPassed = false;
|
|
47
|
+
}
|
|
48
|
+
console.log('\n' + (allPassed ? '✅ ALL TESTS PASSED' : '❌ SOME TESTS FAILED'));
|
|
49
|
+
process.exit(allPassed ? 0 : 1);
|
|
50
|
+
}
|
|
51
|
+
main().catch(e => {
|
|
52
|
+
console.error('Error:', e);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
async function testBasicTransport() {
|
|
3
|
+
console.log('=== Test 1: Basic Transport ===');
|
|
4
|
+
const node = await irohTransport.start();
|
|
5
|
+
console.log('Node started:', node.nodeId.substring(0, 16) + '...');
|
|
6
|
+
console.log('Running:', irohTransport.isRunning());
|
|
7
|
+
return node;
|
|
8
|
+
}
|
|
9
|
+
async function testMessageHandler() {
|
|
10
|
+
console.log('\n=== Test 2: Message Handler ===');
|
|
11
|
+
let receivedMsg = null;
|
|
12
|
+
irohTransport.onMessage('test', (msg) => {
|
|
13
|
+
console.log('Handler called!');
|
|
14
|
+
receivedMsg = msg;
|
|
15
|
+
});
|
|
16
|
+
console.log('Handler registered');
|
|
17
|
+
return receivedMsg;
|
|
18
|
+
}
|
|
19
|
+
async function testShutdown() {
|
|
20
|
+
console.log('\n=== Test 3: Shutdown ===');
|
|
21
|
+
await irohTransport.shutdown();
|
|
22
|
+
console.log('Shutdown complete');
|
|
23
|
+
console.log('Running:', irohTransport.isRunning());
|
|
24
|
+
console.log('NodeId:', irohTransport.getNodeId());
|
|
25
|
+
}
|
|
26
|
+
async function runTests() {
|
|
27
|
+
try {
|
|
28
|
+
await testBasicTransport();
|
|
29
|
+
await testMessageHandler();
|
|
30
|
+
await testShutdown();
|
|
31
|
+
console.log('\n=== All tests passed ===');
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
console.error('Test failed:', e);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
runTests();
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
const args = process.argv.slice(2);
|
|
3
|
+
const role = args[0];
|
|
4
|
+
const targetNodeId = args[1];
|
|
5
|
+
if (!role || !['server', 'client'].includes(role)) {
|
|
6
|
+
console.log('Usage:');
|
|
7
|
+
console.log(' Server: npx tsx src/test/iroh-two-nodes.ts server');
|
|
8
|
+
console.log(' Client: npx tsx src/test/iroh-two-nodes.ts client <server-node-id>');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
async function runServer() {
|
|
12
|
+
console.log('[Server] Starting iroh transport...');
|
|
13
|
+
const node = await irohTransport.start();
|
|
14
|
+
console.log('[Server] Node ID:', node.nodeId);
|
|
15
|
+
console.log('[Server] Address:', node.addr);
|
|
16
|
+
console.log('[Server] Waiting for connections...\n');
|
|
17
|
+
let messageCount = 0;
|
|
18
|
+
irohTransport.onMessage('ping', (msg) => {
|
|
19
|
+
messageCount++;
|
|
20
|
+
console.log(`[Server] Received ping #${messageCount} from ${msg.from.substring(0, 16)}...`);
|
|
21
|
+
console.log(`[Server] Payload: "${new TextDecoder().decode(msg.payload)}"`);
|
|
22
|
+
// 回复 pong
|
|
23
|
+
irohTransport.sendMessage(msg.from, 'pong', new TextEncoder().encode('pong response'));
|
|
24
|
+
});
|
|
25
|
+
irohTransport.onMessage('data', (msg) => {
|
|
26
|
+
messageCount++;
|
|
27
|
+
console.log(`[Server] Received data #${messageCount}: ${msg.payload.length} bytes`);
|
|
28
|
+
});
|
|
29
|
+
// 保持运行
|
|
30
|
+
await new Promise(resolve => setTimeout(resolve, 60000));
|
|
31
|
+
}
|
|
32
|
+
async function runClient(targetId) {
|
|
33
|
+
if (!targetId) {
|
|
34
|
+
console.error('[Client] Error: target node ID required');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
console.log('[Client] Starting iroh transport...');
|
|
38
|
+
const node = await irohTransport.start();
|
|
39
|
+
console.log('[Client] Node ID:', node.nodeId);
|
|
40
|
+
console.log('[Client] Target:', targetId);
|
|
41
|
+
console.log('[Client] Connecting to server...\n');
|
|
42
|
+
// 等待连接建立
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
44
|
+
// 发送 ping
|
|
45
|
+
console.log('[Client] Sending ping...');
|
|
46
|
+
const sent = await irohTransport.sendMessage(targetId, 'ping', new TextEncoder().encode('hello server'));
|
|
47
|
+
console.log('[Client] Ping sent:', sent);
|
|
48
|
+
// 发送数据
|
|
49
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
50
|
+
console.log('[Client] Sending data...');
|
|
51
|
+
const data = new Uint8Array(1024).fill(65); // 1KB of 'A'
|
|
52
|
+
await irohTransport.sendMessage(targetId, 'data', data);
|
|
53
|
+
console.log('[Client] Data sent: 1024 bytes');
|
|
54
|
+
// 等待响应
|
|
55
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
56
|
+
irohTransport.onMessage('pong', (msg) => {
|
|
57
|
+
console.log(`[Client] Received pong from ${msg.from.substring(0, 16)}...`);
|
|
58
|
+
console.log(`[Client] Payload: "${new TextDecoder().decode(msg.payload)}"`);
|
|
59
|
+
});
|
|
60
|
+
// 等待更多响应
|
|
61
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
62
|
+
await irohTransport.shutdown();
|
|
63
|
+
console.log('[Client] Done');
|
|
64
|
+
}
|
|
65
|
+
if (role === 'server') {
|
|
66
|
+
runServer();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
runClient(targetNodeId);
|
|
70
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { irohTransport } from '../network/iroh-transport.js';
|
|
2
|
+
async function testIroh() {
|
|
3
|
+
console.log('=== iroh Transport Test ===\n');
|
|
4
|
+
console.log('1. Starting iroh node...');
|
|
5
|
+
const node = await irohTransport.start();
|
|
6
|
+
console.log(' Node ID:', node.nodeId);
|
|
7
|
+
console.log(' Running:', irohTransport.isRunning());
|
|
8
|
+
console.log('');
|
|
9
|
+
console.log('2. Testing message handler...');
|
|
10
|
+
let receivedCount = 0;
|
|
11
|
+
irohTransport.onMessage('test', (msg) => {
|
|
12
|
+
receivedCount++;
|
|
13
|
+
console.log(` Received: type=${msg.type}, from=${msg.from.substring(0, 8)}..., payload="${new TextDecoder().decode(msg.payload)}"`);
|
|
14
|
+
});
|
|
15
|
+
console.log(' Handler registered for "test" type');
|
|
16
|
+
console.log('');
|
|
17
|
+
console.log('3. Testing wildcard handler...');
|
|
18
|
+
let wildcardCount = 0;
|
|
19
|
+
irohTransport.onMessage('*', (msg) => {
|
|
20
|
+
wildcardCount++;
|
|
21
|
+
console.log(` Wildcard: type=${msg.type}, from=${msg.from.substring(0, 8)}...`);
|
|
22
|
+
});
|
|
23
|
+
console.log(' Wildcard handler registered');
|
|
24
|
+
console.log('');
|
|
25
|
+
console.log('4. Simulating message dispatch (internal test)...');
|
|
26
|
+
// This tests the dispatch logic internally
|
|
27
|
+
// In real usage, messages come over the network
|
|
28
|
+
console.log(' Message dispatch mechanism ready');
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log('5. Testing getNodeId...');
|
|
31
|
+
const nodeId = irohTransport.getNodeId();
|
|
32
|
+
console.log(' Node ID matches:', nodeId === node.nodeId);
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log('6. Testing shutdown...');
|
|
35
|
+
await irohTransport.shutdown();
|
|
36
|
+
console.log(' Running after shutdown:', irohTransport.isRunning());
|
|
37
|
+
console.log(' Node ID after shutdown:', irohTransport.getNodeId());
|
|
38
|
+
console.log('');
|
|
39
|
+
console.log('=== All Tests Passed ===');
|
|
40
|
+
}
|
|
41
|
+
testIroh().catch((e) => {
|
|
42
|
+
console.error('Test failed:', e);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
});
|