1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import assert from "node:assert/strict";
import { test } from "node:test";
import { did, load, now } from "../../../rust/src/harness.mjs";
const { module, run, handle } = await load(new URL("../../../target/wasm32-unknown-unknown/release/statusphere.wasm", import.meta.url), new URL("./module.json", import.meta.url));
const ENTRIES = ["set_status", "clear_status"];
const start = (fields) => ({ did, now, ...fields, state: null, event: { type: "start" } });
// respond(call) answers each call and records it.
const recorded = (answer) => {
const calls = [];
return { calls, respond: (call) => (calls.push(call), answer(call)) };
};
test("module has no imports and exports the ABI", () => {
assert.equal(WebAssembly.Module.imports(module).length, 0);
const names = WebAssembly.Module.exports(module).map((e) => e.name);
for (const name of ["memory", "alloc", ...ENTRIES]) assert.ok(names.includes(name), name);
});
test("set_status reads the latest status, writes, then reports the new uri", async () => {
const { calls, respond } = recorded((call) =>
call.nsid === "com.atproto.repo.listRecords"
? { ok: true, output: { records: [{ uri: `at://${did}/xyz.statusphere.status/old`, value: { status: "🙂" } }] } }
: { ok: true, output: { uri: `at://${did}/xyz.statusphere.status/new`, cid: "bafy" } },
);
const ran = await handle("set_status", { status: "🦋" }, { respond });
assert.deepEqual(calls.map((call) => call.nsid), ["com.atproto.repo.listRecords", "com.atproto.repo.createRecord"]);
assert.deepEqual(calls[0].params, { repo: did, collection: "xyz.statusphere.status", limit: "1" });
assert.deepEqual(calls[1].input, {
repo: did,
collection: "xyz.statusphere.status",
record: { $type: "xyz.statusphere.status", status: "🦋", createdAt: now },
});
assert.deepEqual(ran.result, { status: "🦋", unchanged: false, uri: `at://${did}/xyz.statusphere.status/new` });
});
test("set_status skips the write when the latest status already matches", async () => {
const uri = `at://${did}/xyz.statusphere.status/same`;
const ran = await handle("set_status", { status: "🦋" }, { respond: () => ({ ok: true, output: { records: [{ uri, value: { status: "🦋" } }] } }) });
assert.equal(ran.calls.length, 1);
assert.deepEqual(ran.result, { status: "🦋", unchanged: true, uri });
});
test("set_status normalizes now to UTC milliseconds", () => {
const out = run("set_status", {
did,
now: "2026-11-06T04:00:00-08:00",
state: { status: "🙂" },
event: { type: "result", id: "list", nsid: "com.atproto.repo.listRecords", ok: true, output: { records: [] } },
});
assert.equal(out.calls[0].input.record.createdAt, "2026-11-06T12:00:00.000Z");
});
test("set_status rejects an empty status and an invalid now", () => {
assert.match(run("set_status", start({ status: "" })).error, /status/);
assert.match(run("set_status", start({ status: "🦋", now: "yesterday" })).error, /now/);
});
test("a failed call surfaces as the module error", async () => {
const ran = await handle("set_status", { status: "🦋" }, { respond: () => ({ ok: false, error: "listRecords failed with 500" }) });
assert.equal(ran.error, "listRecords failed with 500");
});
test("clear_status deletes every listed status", async () => {
const records = ["a", "b", "c"].map((rkey) => ({ uri: `at://${did}/xyz.statusphere.status/${rkey}`, value: { status: "🦋" } }));
const { calls, respond } = recorded((call) =>
call.nsid === "com.atproto.repo.listRecords" ? { ok: true, output: { records } } : { ok: call.input.rkey !== "c", output: {} },
);
// The harness host has no anyRecords, so deletes of records it did not create need runModule with module.json's.
const { runModule } = await import("../../../javascript/src/run-module/index.js");
const ctx = { wasm: { run: async ({ entry, input }) => run(entry, { ...input, now }) } };
const call = async (nsid, request) => {
const answer = respond({ nsid, ...request });
if (!answer.ok) throw new Error("delete failed");
return answer.output;
};
const ran = await runModule(ctx, { module, anyRecords: ["xyz.statusphere.status"] }, "clear_status", { did }, call);
assert.deepEqual(
calls.slice(1).map((call) => [call.nsid, call.input.rkey]),
[
["com.atproto.repo.deleteRecord", "a"],
["com.atproto.repo.deleteRecord", "b"],
["com.atproto.repo.deleteRecord", "c"],
],
);
assert.deepEqual(ran.result, { deleted: 2, failed: 1 });
});
test("clear_status with nothing to delete makes no delete calls", async () => {
const ran = await handle("clear_status", {}, { respond: () => ({ ok: true, output: { records: [] } }) });
assert.equal(ran.calls.length, 1);
assert.deepEqual(ran.result, { deleted: 0 });
});
// module.json anyRecords lets clear_status delete statuses other clients (or another host) created.
test("runModule lets clear_status delete statuses it did not create only via anyRecords", async () => {
const { runModule } = await import("../../../javascript/src/run-module/index.js");
const spec = JSON.parse(await (await import("node:fs/promises")).readFile(new URL("./module.json", import.meta.url), "utf8"));
const ctx = { wasm: { run: async ({ entry, input }) => run(entry, input) } };
const records = [{ uri: `at://${did}/xyz.statusphere.status/a`, value: { status: "🦋" } }];
const call = async (nsid) => (nsid === "com.atproto.repo.listRecords" ? { records } : {});
const clear = (anyRecords) => runModule(ctx, { module, calls: spec.calls, anyRecords }, "clear_status", { did }, call);
assert.deepEqual((await clear(spec.anyRecords)).result, { deleted: 1, failed: 0 });
const refused = await clear(undefined);
assert.deepEqual(refused.result, { deleted: 0, failed: 1 });
assert.match(refused.calls[1].error, /not created by this module/);
});