Developer SDK

JavaScript examples

Install the SDK · View source on GitHub ↗

socket/browser/runtime.test.mjs

import {test} from "node:test";
import assert from "node:assert/strict";
import {createServer} from "vite";
import {chromium} from "playwright";

test("Browser loads real SDK WASM and closes it without account credentials", {timeout: 60000}, async () => {
  const server = await createServer({root: new URL("..", import.meta.url).pathname, server: {host: "127.0.0.1", port: 0}});
  await server.listen();
  let browser;
  try {
    browser = await chromium.launch({headless: true, executablePath: process.env.BROWSER_EXECUTABLE || undefined});
    const page = await browser.newPage();
    const errors = [];
    page.on("pageerror", error => errors.push(error.message));
    await page.goto("http://127.0.0.1:" + server.httpServer.address().port);
    assert.equal(await page.locator("#get").count(), 1);
    assert.equal(await page.locator("#direct-echo").count(), 1);
    const result = await page.evaluate(async () => {
      const exported = await import("/node_modules/@urnetwork/sdk/dist/index.js");
      const {URNetwork, attachSocketAPI} = exported;
      const sdk = await URNetwork.init({
        wasmUrl: "/node_modules/@urnetwork/sdk/wasm/sdk.wasm",
        wasmExecUrl: "/node_modules/@urnetwork/sdk/wasm/wasm_exec.js",
      });
      const initialized = sdk.isInitialized();
      const factory = typeof globalThis.URnetworkNewPlatformDeviceRemote;
      const directResults = [];
      for (const udp of [false, true]) {
        let notify;
        const lifetime = new Promise(resolve => {notify = resolve;});
        const device = attachSocketAPI({socketOperation: async op => {
          if (op === "dial" || op === "addresses") return {id: 1, localAddr: "127.0.0.1:1000", remoteAddr: "127.0.0.2:7"};
          if (op === "socketClosed") return lifetime;
          if (op === "read") return {data: udp ? new Uint8Array() : Uint8Array.of(8), eof: !udp};
          if (op === "release") notify();
        }});
        const {TCPSocket, UDPSocket} = device.directSockets;
        const socket = udp ? new UDPSocket({remoteAddress: "host", remotePort: 7}) : new TCPSocket("host", 7);
        const {readable} = await socket.opened;
        const reader = udp ? readable.getReader() : readable.getReader({mode: "byob"});
        const result = udp ? await reader.read() : await reader.read(new Uint8Array(10));
        directResults.push(udp ? result.value.data.length : result.value[0]);
        await reader.cancel(); reader.releaseLock(); await socket.close(); await socket.closed;
      }
      sdk.close();
      await new Promise(resolve => setTimeout(resolve, 30));
      return {initialized, factory, directResults, removedSessionAPI: !("WebTransport" in exported)};
    });
    assert.deepEqual(result, {initialized: true, factory: "function", directResults: [8, 0], removedSessionAPI: true});
    assert.deepEqual(errors, []);
  } finally {await browser?.close(); await server.close();}
});