mirror of
https://github.com/cerc-io/watcher-ts
synced 2024-11-20 12:56:20 +00:00
Nabarun Gogoi
cd29b47ecc
* Initial implementation of class and discoving other peers * Implement peer connection and sending messages between peers * Add react app and use peer package for broadcasting * Maintain stream for each remote peer * Refactor code in peer package * Add serve package for react-app * Add readme for running react app * Add peer package readme * Add logs for events with details * Add a chat CLI using peer package (#280) * Add a flag to instantiate Peer for nodejs * Add a basic chat CLI using peer * Add a signal server arg to chat CLI * Add instructions for chat CLI * Fix typescript and ESM issues after adding peer package (#282) * Fix build issues in util package * Update eslint TS plugins * Scope react app package name * Convert cli package back to CJS and dynamically import ESM * Upgrade ts-node version * Fix tests * Setup a relay node and pubsub based discovery (#284) * Add a script to setup a relay node * Use pubsub based peer discovery * Add peer multiaddr to connection log * Catch relay node dial errors * Increase discovery interval and dial all mutiaddr * Add UI to display self peer ID and multiaddrs * Add UI for displaying live remote connections * Send js objects in peer broadcast messages * Add react-peer package for using peer in react app * Reduce disconnect frequency between peers (#287) * Restrict number of max concurrent dials per peer * Increase hop relay timeout to 1 day * Self review changes * Review changes * Increase pubsub discovery interval and add steps to create a peer id (#290) * Increase pubsub discovery interval * Disable autodial to avoid peer dials without protocol on a reconnect * Add steps to create a peer id and use for relay node * Add back dependency to run signalling server * Avoid bootstrapping and dial to relay node directly Co-authored-by: prathamesh0 <42446521+prathamesh0@users.noreply.github.com> Co-authored-by: prathamesh0 <prathamesh.musale0@gmail.com>
126 lines
3.5 KiB
TypeScript
126 lines
3.5 KiB
TypeScript
//
|
|
// Copyright 2021 Vulcanize, Inc.
|
|
//
|
|
|
|
import path from 'path';
|
|
import { expect } from 'chai';
|
|
import { utils } from 'ethers';
|
|
|
|
import { BaseProvider } from '@ethersproject/providers';
|
|
import { GraphDatabase } from '@cerc-io/util';
|
|
|
|
import { instantiate } from './loader';
|
|
import { getDummyGraphData, getTestDatabase, getTestIndexer, getTestProvider } from '../test/utils';
|
|
import { Indexer } from '../test/utils/indexer';
|
|
|
|
const WASM_FILE_PATH = '../build/debug.wasm';
|
|
|
|
describe('wasm loader tests', () => {
|
|
let exports: any;
|
|
let db: GraphDatabase;
|
|
let indexer: Indexer;
|
|
let provider: BaseProvider;
|
|
let module: WebAssembly.Module;
|
|
let dummyGraphData: any;
|
|
|
|
before(async () => {
|
|
db = getTestDatabase();
|
|
indexer = getTestIndexer();
|
|
provider = getTestProvider();
|
|
dummyGraphData = getDummyGraphData();
|
|
|
|
const filePath = path.resolve(__dirname, WASM_FILE_PATH);
|
|
|
|
const instance = await instantiate(
|
|
db,
|
|
indexer,
|
|
provider,
|
|
{},
|
|
filePath,
|
|
dummyGraphData
|
|
);
|
|
|
|
exports = instance.exports;
|
|
module = instance.module;
|
|
});
|
|
|
|
it('should execute exported function', async () => {
|
|
const { callGraphAPI } = exports;
|
|
callGraphAPI();
|
|
});
|
|
|
|
it('should execute async function', async () => {
|
|
const { callAsyncMethod } = exports;
|
|
await callAsyncMethod();
|
|
});
|
|
|
|
it('should use a class/instance created in wasm from JS', async () => {
|
|
const { Foo, __getString, __pin, __unpin } = exports;
|
|
|
|
const fooPtr = await __pin(await Foo.getFoo());
|
|
const foo = Foo.wrap(fooPtr);
|
|
const strPtr = await foo.getString();
|
|
expect(__getString(strPtr)).to.equal('hello world!');
|
|
await __unpin(fooPtr);
|
|
});
|
|
|
|
it('should instantiate a class in wasm from JS', async () => {
|
|
const { Foo, FooID, Bar, __getString, __new, __pin, __unpin, __newString } = exports;
|
|
|
|
const fooPtr = await __pin(await __new(FooID));
|
|
const foo = Foo.wrap(fooPtr);
|
|
const strPtr = await foo.getString();
|
|
expect(__getString(strPtr)).to.equal('hello world!');
|
|
__unpin(fooPtr);
|
|
|
|
const bar = await Bar.__new(await __newString('test'));
|
|
expect(__getString(await bar.prop)).to.equal('test');
|
|
});
|
|
|
|
it('should log messages', async () => {
|
|
const { testLog } = exports;
|
|
|
|
// Should print all log messages for different levels.
|
|
await testLog();
|
|
});
|
|
|
|
it('should throw out of memory error', async () => {
|
|
// Maximum memory is set to 10 pages (640KB) when compiling using asc maximumMemory option.
|
|
// https://www.assemblyscript.org/compiler.html#command-line-options
|
|
|
|
const { testMemory, __newString, memory } = exports;
|
|
|
|
try {
|
|
// Continue loop until memory size reaches max size 640KB
|
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WebAssembly/Memory/buffer
|
|
while (memory.buffer.byteLength <= 1024 * 640) {
|
|
// Create long string of 100KB.
|
|
const longString = utils.hexValue(utils.randomBytes(1024 * 100 / 2));
|
|
|
|
const stringPtr = await __newString(longString);
|
|
await testMemory(stringPtr);
|
|
}
|
|
|
|
expect.fail('wasm code should throw error');
|
|
} catch (error: any) {
|
|
expect(error).to.be.instanceof(WebAssembly.RuntimeError);
|
|
expect(error.message).to.equal('unreachable');
|
|
}
|
|
});
|
|
|
|
it('should reinstantiate wasm', async () => {
|
|
const instance = await instantiate(
|
|
db,
|
|
indexer,
|
|
provider,
|
|
{},
|
|
module,
|
|
dummyGraphData
|
|
);
|
|
|
|
exports = instance.exports;
|
|
const { callGraphAPI } = exports;
|
|
await callGraphAPI();
|
|
});
|
|
});
|