cd ts
rm liblightningjs.wasm && ln -s $(pwd)/../liblightningjs_debug.wasm ./liblightningjs.wasm
python3 -m http.server &
+ SERVER_PID=$!
node test/browser.mjs
+ kill $SERVER_PID
- name: Build and Test TS Release Bindings for Web
run: |
export HOME=/root/ # Github actions is apparently broken
./genbindings.sh ./ldk-c-bindings/ wasm false true
cd ts
rm liblightningjs.wasm && ln -s $(pwd)/../liblightningjs_release.wasm ./liblightningjs.wasm
+ python3 -m http.server &
+ SERVER_PID=$!
node test/browser.mjs
+ kill $SERVER_PID
- name: Check latest TS files are in git
run: |
git diff --exit-code
{
"name": "lightningdevkit",
- "version": "0.0.104.1alpha2",
+ "version": "0.0.104.1alpha3",
"description": "Lightning Development Kit",
"main": "index.mjs",
"type": "module",
"enums/*.d.mts",
"bindings.mjs",
"bindings.d.mts",
+ "version.mjs",
"liblightningjs.wasm",
"tsconfig.json",
"README.md",
import { strict as assert } from 'assert';
for (const browserType of [chromium, firefox]) { // We'd like to test webkit, but playwright doesn't support it on Debian (?!)
- const browser = await browserType.launch();
+ var browser;
+ if (browserType == chromium)
+ browser = await browserType.launch(["--js-flags=\"--expose-gc\""]);
+ else
+ browser = await browserType.launch();
const context = await browser.newContext();
const page = await context.newPage();
- await page.goto('http://localhost:8000/test/index.html');
- const ret = await page.evaluate(() => {
- return test_runner('../liblightningjs.wasm');
+ page.on('console', async msg => {
+ const values = [];
+ for (const arg of msg.args())
+ values.push(await arg.jsonValue());
+ console.log(...values);
});
+ await page.goto('http://localhost:8000/test/index.html');
+ var ret;
+ // On chromium we expose the GC and can run it manually, otherwise we really can't leak-check
+ if (browserType == chromium) {
+ ret = await page.evaluate(() => { return test_runner('../liblightningjs.wasm', true); });
+ } else {
+ ret = await page.evaluate(() => { return test_runner('../liblightningjs.wasm', false); });
+ }
assert(ret);
await browser.close();
return true;
});
-export async function run_tests(wasm_path: string) {
+export async function run_tests(wasm_path: string, check_leaks: boolean = true) {
await rawldk.initializeWasm(wasm_path);
var test_runs = [];
console.log("test results: " + results);
const result = results.every((v) => { return v === true });
console.log("all tests passed: " + result);
- if (result !== true) { return result; }
+ if (result !== true || !check_leaks) { return result; }
const allocs_finished = new Promise((resolve, reject) => {
var loop_count = 0;
const alloc_count = rawldk.getRemainingAllocationCount();
if (loop_count % 20 == 0)
console.log("Remaining LDK allocation count: " + alloc_count);
+
+ // chromium with --js-flags="--expose-gc" exposes a `window.gc()` which we call if we can
+ // @ts-ignore window.gc is considered a type error in TS
+ if (typeof window !== "undefined" && typeof window.gc !== "undefined") window.gc();
+
// Note that there are currently 9 leaks in the above tests. At least some are known - look for XXX in bindings.c
- if (alloc_count <= 10) { resolve(true); clearInterval(interval_id); }
+ if (alloc_count <= 10) { clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); resolve(true); }
loop_count += 1;
- if (loop_count > 30*2) { resolve(false); clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); }
+ if (loop_count > 30*2) { clearInterval(interval_id); rawldk.debugPrintRemainingAllocs(); resolve(false); }
}, 500);
});
return allocs_finished;