From f89f00da0d854dfb725c5dc78ccaefd117933a6b Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 14 Dec 2017 23:10:37 +0100 Subject: [PATCH] Cleanup assertions --- packages/client-chains/src/validate/genesis.js | 13 +++++-------- packages/client-chains/src/validate/genesis.spec.js | 8 ++++---- packages/client-chains/src/validate/index.js | 1 - packages/client-chains/src/validate/params.js | 2 +- packages/client-chains/src/validate/params.spec.js | 2 +- packages/client-p2p/src/create/config.js | 5 ++--- packages/client-p2p/src/create/config.spec.js | 4 ++-- packages/client-p2p/src/create/listener.js | 5 ++--- packages/client-p2p/src/create/listener.spec.js | 4 ++-- packages/client-p2p/src/create/node.js | 5 ++--- packages/client-p2p/src/create/node.spec.js | 4 ++-- packages/client-p2p/src/create/peerBook.js | 3 +++ packages/client-p2p/src/peers.js | 2 +- packages/client-p2p/src/protocol/handler.js | 2 +- packages/client-p2p/src/server.js | 5 ++--- packages/client-rpc/package.json | 2 ++ packages/client-rpc/src/jsonrpc/response.spec.js | 2 +- packages/client-rpc/src/server.js | 9 +++++++-- packages/client-rpc/src/server.spec.js | 2 +- packages/client-rpc/src/types.js | 6 ++++++ packages/client-rpc/src/validate/config.js | 10 +++------- packages/client-rpc/src/validate/config.spec.js | 6 +++--- packages/client-rpc/src/validate/handlers.js | 5 ++++- packages/client-rpc/src/validate/handlers.spec.js | 8 ++++---- packages/client-rpc/src/validate/request.js | 8 ++------ packages/client-rpc/src/validate/request.spec.js | 10 ++-------- packages/client-wasm/src/create/instance.js | 2 +- packages/client-wasm/src/create/instance.spec.js | 2 +- packages/client-wasm/src/create/module.js | 9 ++++----- packages/client-wasm/src/create/module.spec.js | 4 ++-- packages/client-wasm/src/wasm.js | 8 ++++---- packages/client-wasm/src/wasm.spec.js | 4 ++-- 32 files changed, 79 insertions(+), 83 deletions(-) diff --git a/packages/client-chains/src/validate/genesis.js b/packages/client-chains/src/validate/genesis.js index 04aa1133..85e046a2 100644 --- a/packages/client-chains/src/validate/genesis.js +++ b/packages/client-chains/src/validate/genesis.js @@ -11,16 +11,13 @@ const validateObject = require('./object'); const KNOWN_KEYS = ['author', 'hash', 'parentHash', 'stateRoot']; const PREFIX = 'Chain.genesis'; -module.exports = function validateParams (genesis: ChainConfigType$Genesis, strict: boolean = false): boolean { +module.exports = function validateGenesis (genesis: ChainConfigType$Genesis, strict: boolean = false): boolean { validateObject(PREFIX, genesis, KNOWN_KEYS, strict); - assert(isHex(genesis.author, 160), `${PREFIX}.author should be a valid network accountId`); - - assert(isHex(genesis.hash, 256), `${PREFIX}.hash should be a valid header hash`); - - assert(isHex(genesis.parentHash, 256), `${PREFIX}.parentHash should be a valid header hash`); - - assert(isHex(genesis.stateRoot, 256), `${PREFIX}.stateRoot should be a valid hash`); + assert(isHex(genesis.author, 160), `${PREFIX}.author should be AccountId`); + assert(isHex(genesis.hash, 256), `${PREFIX}.hash should be a HeaderHash`); + assert(isHex(genesis.parentHash, 256), `${PREFIX}.parentHash should be HeaderHash`); + assert(isHex(genesis.stateRoot, 256), `${PREFIX}.stateRoot should be Hash`); return true; }; diff --git a/packages/client-chains/src/validate/genesis.spec.js b/packages/client-chains/src/validate/genesis.spec.js index edd8b3ad..c1c0eb9d 100644 --- a/packages/client-chains/src/validate/genesis.spec.js +++ b/packages/client-chains/src/validate/genesis.spec.js @@ -42,7 +42,7 @@ describe('validateGenesis', () => { () => validateGenesis( Object.assign({}, test, { author: 'notHex' }) ) - ).toThrow(/valid network accountId/); + ).toThrow(/AccountId/); }); it('validates the hash', () => { @@ -50,7 +50,7 @@ describe('validateGenesis', () => { () => validateGenesis( Object.assign({}, test, { hash: 'notHex' }) ) - ).toThrow(/valid header hash/); + ).toThrow(/HeaderHash/); }); it('validates the parentHash', () => { @@ -58,7 +58,7 @@ describe('validateGenesis', () => { () => validateGenesis( Object.assign({}, test, { parentHash: 'notHex' }) ) - ).toThrow(/valid header hash/); + ).toThrow(/HeaderHash/); }); it('validates the stateRoot', () => { @@ -66,6 +66,6 @@ describe('validateGenesis', () => { () => validateGenesis( Object.assign({}, test, { stateRoot: 'notHex' }) ) - ).toThrow(/valid hash/); + ).toThrow(/Hash/); }); }); diff --git a/packages/client-chains/src/validate/index.js b/packages/client-chains/src/validate/index.js index f1c20257..73bcadf1 100644 --- a/packages/client-chains/src/validate/index.js +++ b/packages/client-chains/src/validate/index.js @@ -11,7 +11,6 @@ const KNOWN_KEYS = ['description', 'genesis', 'name', 'nodes', 'params']; module.exports = function validateChain (chain: ChainConfigType, strict: boolean = false): ChainConfigType { validateObject('Chain', chain, KNOWN_KEYS, strict); - validateGenesis(chain.genesis, strict); validateParams(chain.params, strict); diff --git a/packages/client-chains/src/validate/params.js b/packages/client-chains/src/validate/params.js index 6061f443..52c66790 100644 --- a/packages/client-chains/src/validate/params.js +++ b/packages/client-chains/src/validate/params.js @@ -14,7 +14,7 @@ const PREFIX = 'Chain.params'; module.exports = function validateParams (params: ChainConfigType$Params, strict: boolean = false): boolean { validateObject(PREFIX, params, KNOWN_KEYS, strict); - assert(isHex(params.networkID), `${PREFIX}.networkID should be a hex number`); + assert(isHex(params.networkID), `${PREFIX}.networkID should be a Hex`); return true; }; diff --git a/packages/client-chains/src/validate/params.spec.js b/packages/client-chains/src/validate/params.spec.js index 4e8b6280..277be4d3 100644 --- a/packages/client-chains/src/validate/params.spec.js +++ b/packages/client-chains/src/validate/params.spec.js @@ -39,6 +39,6 @@ describe('validateParams', () => { () => validateParams( Object.assign({}, test, { networkID: 123 }) ) - ).toThrow(/networkID should be a hex/); + ).toThrow(/networkID should be a Hex/); }); }); diff --git a/packages/client-p2p/src/create/config.js b/packages/client-p2p/src/create/config.js index e5ce51a9..37523103 100644 --- a/packages/client-p2p/src/create/config.js +++ b/packages/client-p2p/src/create/config.js @@ -30,9 +30,8 @@ const DEFAULT_TRANSPORTS = [ ]; module.exports = function createConfig (peerInfo: PeerInfo, bootNodes: ChainConfigType$Nodes = []): LibP2P$Config { - assert(isInstanceOf(peerInfo, PeerInfo), 'Expected peerInfo as a PeerInfo instance'); - - assert(Array.isArray(bootNodes), 'Expected bootNodes as an array of nodes'); + assert(isInstanceOf(peerInfo, PeerInfo), 'Expected PeerInfo instance'); + assert(Array.isArray(bootNodes), 'Expected array of bootNodes'); return { connection: { diff --git a/packages/client-p2p/src/create/config.spec.js b/packages/client-p2p/src/create/config.spec.js index 7e2fbd87..15dfb8c8 100644 --- a/packages/client-p2p/src/create/config.spec.js +++ b/packages/client-p2p/src/create/config.spec.js @@ -17,13 +17,13 @@ describe('createConfig', () => { it('expects a peerInfo object', () => { expect( () => createConfig() - ).toThrow(/peerInfo as a PeerInfo/); + ).toThrow(/PeerInfo instance/); }); it('expects a valid bootNodes array', () => { expect( () => createConfig(peerInfo, 'notanArray') - ).toThrow(/array of nodes/); + ).toThrow(/array of bootNodes/); }); it('returns a valid configuration object', () => { diff --git a/packages/client-p2p/src/create/listener.js b/packages/client-p2p/src/create/listener.js index 7523bea0..0eb6d49b 100644 --- a/packages/client-p2p/src/create/listener.js +++ b/packages/client-p2p/src/create/listener.js @@ -10,9 +10,8 @@ const createPeerInfo = require('./peerInfo'); const defaults = require('../defaults'); module.exports = async function createListener (ip: string = defaults.ADDRESS, port: number = defaults.PORT): Promise { - assert(isIp(ip), `Expected a valid IP address, received '${ip}'`); - - assert(isNumber(port), `Expected a valid numeric port, received '${port}'`); + assert(isIp(ip), `Expected an IP address, received '${ip}'`); + assert(isNumber(port), `Expected a numeric port, received '${port}'`); const type = isIp(ip, 'v4') ? 'ip4' : 'ip6'; diff --git a/packages/client-p2p/src/create/listener.spec.js b/packages/client-p2p/src/create/listener.spec.js index eb78df9c..c0d76671 100644 --- a/packages/client-p2p/src/create/listener.spec.js +++ b/packages/client-p2p/src/create/listener.spec.js @@ -27,13 +27,13 @@ describe('createListener', () => { it('validates the IP address', () => { return createListener('no.ip.is.here').catch((error) => { - expect(error.message).toMatch(/valid IP address/); + expect(error.message).toMatch(/IP address/); }); }); it('validates the port', () => { return createListener('127.0.0.1', 'notAPort').catch((error) => { - expect(error.message).toMatch(/valid numeric port/); + expect(error.message).toMatch(/numeric port/); }); }); diff --git a/packages/client-p2p/src/create/node.js b/packages/client-p2p/src/create/node.js index 7b1cc521..58371a01 100644 --- a/packages/client-p2p/src/create/node.js +++ b/packages/client-p2p/src/create/node.js @@ -13,9 +13,8 @@ const createListener = require('./listener'); const createPeerBook = require('./peerBook'); module.exports = async function createNode (config: P2pConfigType, chain: ChainConfigType): Promise { - assert(isObject(config), 'Expected a valid p2p config object'); - - assert(isObject(chain), 'Expected a valid chain defintion'); + assert(isObject(config), 'Expected P2P configuration'); + assert(isObject(chain), 'Expected chain definition'); const listener = await createListener(config.address, config.port); const peerBook = await createPeerBook(config.peers); diff --git a/packages/client-p2p/src/create/node.spec.js b/packages/client-p2p/src/create/node.spec.js index 3173fbbc..ad2de044 100644 --- a/packages/client-p2p/src/create/node.spec.js +++ b/packages/client-p2p/src/create/node.spec.js @@ -23,13 +23,13 @@ describe('createNode', () => { it('requires a valid config object', () => { return createNode().catch((error) => { - expect(error.message).toMatch(/valid p2p config/); + expect(error.message).toMatch(/P2P configuration/); }); }); it('requires a valid chain definition object', () => { return createNode({}).catch((error) => { - expect(error.message).toMatch(/valid chain/); + expect(error.message).toMatch(/chain definition/); }); }); diff --git a/packages/client-p2p/src/create/peerBook.js b/packages/client-p2p/src/create/peerBook.js index 558cb4c0..802cd811 100644 --- a/packages/client-p2p/src/create/peerBook.js +++ b/packages/client-p2p/src/create/peerBook.js @@ -3,11 +3,14 @@ import type { ChainConfigType$Nodes } from '@polkadot/client-chains/types'; +const assert = require('@polkadot/util/assert'); const PeerBook = require('peer-book'); const createPeerInfo = require('./peerInfo'); module.exports = async function createPeerBook (peers: ChainConfigType$Nodes = []): Promise { + assert(Array.isArray(peers), 'Expected an array of addresses'); + const peerBook = new PeerBook(); const peerInfos = await Promise.all( peers.map((peer) => createPeerInfo([peer])) diff --git a/packages/client-p2p/src/peers.js b/packages/client-p2p/src/peers.js index d3e0f48c..1b6adc63 100644 --- a/packages/client-p2p/src/peers.js +++ b/packages/client-p2p/src/peers.js @@ -16,7 +16,7 @@ module.exports = class Peers extends EventEmitter implements PeersInterface { constructor (emitter: Libp2p) { super(); - assert(emitter, 'Expected to receive a Libp2p event emitter'); + assert(emitter, 'Expected to receive a Libp2p emitter'); this._peers = {}; diff --git a/packages/client-p2p/src/protocol/handler.js b/packages/client-p2p/src/protocol/handler.js index 5d28b2c8..ceca1023 100644 --- a/packages/client-p2p/src/protocol/handler.js +++ b/packages/client-p2p/src/protocol/handler.js @@ -6,7 +6,7 @@ const assert = require('@polkadot/util/assert'); const defaults = require('../defaults'); module.exports = function protocolHandler (protocol: string, conn: any): void { - assert(protocol === defaults.PROTOCOL, `Expected matching protocol, '${protocol}' received instead`); + assert(protocol === defaults.PROTOCOL, `Expected matching protocol, '${protocol}' received`); console.log('Connection received', conn); // pull(conn, conn) diff --git a/packages/client-p2p/src/server.js b/packages/client-p2p/src/server.js index dad89a3b..b267787c 100644 --- a/packages/client-p2p/src/server.js +++ b/packages/client-p2p/src/server.js @@ -26,9 +26,8 @@ module.exports = class Server extends EventEmitter implements P2pInterface { constructor (config: P2pConfigType, chain: ChainConfigType, autoStart: boolean = true) { super(); - assert(isObject(config), 'Expected a P2P configuration object'); - - assert(isObject(chain), 'Expected a chain definition object'); + assert(isObject(config), 'Expected P2P configuration'); + assert(isObject(chain), 'Expected chain definition'); this._config = config; this._chain = chain; diff --git a/packages/client-rpc/package.json b/packages/client-rpc/package.json index 71686d44..22f4aebc 100644 --- a/packages/client-rpc/package.json +++ b/packages/client-rpc/package.json @@ -34,7 +34,9 @@ }, "dependencies": { "@polkadot/util": "^0.9.1", + "babel-runtime": "^6.26.0", "co-body": "^5.1.1", + "eventemitter3": "^2.0.3", "koa": "^2.4.1", "koa-route": "^3.2.0", "koa-websocket": "^4.1.0" diff --git a/packages/client-rpc/src/jsonrpc/response.spec.js b/packages/client-rpc/src/jsonrpc/response.spec.js index 39a5dfcb..05e1b343 100644 --- a/packages/client-rpc/src/jsonrpc/response.spec.js +++ b/packages/client-rpc/src/jsonrpc/response.spec.js @@ -3,7 +3,7 @@ const { createResponse } = require('./index'); describe('createResponse', () => { - it('creates a valid JSONRPC structure', () => { + it('creates a valid JsonRpc structure', () => { expect( createResponse(123, 'test result') ).toEqual({ diff --git a/packages/client-rpc/src/server.js b/packages/client-rpc/src/server.js index 8f218576..de0f71b0 100644 --- a/packages/client-rpc/src/server.js +++ b/packages/client-rpc/src/server.js @@ -1,7 +1,7 @@ // ISC, Copyright 2017 Jaco Greeff // @flow -import type { HandlersType, JsonRpcError, JsonRpcRequest, JsonRpcResponse, RpcConfigType, RpcType } from './types'; +import type { HandlersType, JsonRpcError, JsonRpcRequest, JsonRpcResponse, RpcConfigType, RpcInterface, RpcType } from './types'; type PostContextType = { body: string, @@ -26,12 +26,13 @@ const ExtError = require('@polkadot/util/ext/error'); const l = require('@polkadot/util/logger')('rpc'); const isError = require('@polkadot/util/is/error'); const isFunction = require('@polkadot/util/is/function'); +const EventEmitter = require('eventemitter3'); const defaults = require('./defaults'); const { createError, createResponse } = require('./jsonrpc'); const { validateConfig, validateRequest, validateHandlers } = require('./validate'); -module.exports = class RPCServer { +module.exports = class RPCServer extends EventEmitter implements RpcInterface { _handlers: HandlersType; _path: string; _port: number; @@ -39,6 +40,8 @@ module.exports = class RPCServer { _type: Array; constructor ({ path = defaults.PATH, port = defaults.PORT, type = defaults.TYPE }: RpcConfigType, handlers: HandlersType, autoStart: boolean = true) { + super(); + validateConfig({ path, port, type }); validateHandlers(handlers); @@ -77,6 +80,7 @@ module.exports = class RPCServer { this._server = app.listen(this._port); l.log(`Server started on port=${this._port} for type=${this._type.join(',')}`); + this.emit('started'); } async stop (): Promise { @@ -90,6 +94,7 @@ module.exports = class RPCServer { server.close(); l.log('Server stopped'); + this.emit('stopped'); } _handlePost = async (ctx: PostContextType): Promise => { diff --git a/packages/client-rpc/src/server.spec.js b/packages/client-rpc/src/server.spec.js index 4d78a703..ef194e79 100644 --- a/packages/client-rpc/src/server.spec.js +++ b/packages/client-rpc/src/server.spec.js @@ -67,7 +67,7 @@ describe('Server', () => { expect(result).toMatchObject({ error: { code: ExtError.CODES.INVALID_JSONRPC, - message: "Expected a numeric id, received 'notNumber'" + message: 'Expected a numeric id' } }); }); diff --git a/packages/client-rpc/src/types.js b/packages/client-rpc/src/types.js index e172ba99..71ac867c 100644 --- a/packages/client-rpc/src/types.js +++ b/packages/client-rpc/src/types.js @@ -35,3 +35,9 @@ export type RpcConfigType = { port: number, type: Array }; + +export type RpcInterface$Events = 'started' | 'stopped'; + +export interface RpcInterface { + on (type: RpcInterface$Events, () => any): any; +} diff --git a/packages/client-rpc/src/validate/config.js b/packages/client-rpc/src/validate/config.js index 71d088b4..b901721a 100644 --- a/packages/client-rpc/src/validate/config.js +++ b/packages/client-rpc/src/validate/config.js @@ -8,14 +8,10 @@ const isNumber = require('@polkadot/util/is/number'); const { TYPE } = require('../defaults'); -const TYPE_OR: string = TYPE.map((type) => `'${type}'`).join(' or '); - module.exports = function validateConfig ({ path, port, type }: RpcConfigType): void { - assert(isNumber(port), `Cannot instantiate with non-numeric port='${port}'`); - - assert(Array.isArray(type), `Type should be specified as an Array containing ${TYPE_OR}`); - - assert(type.length !== 0, `Type should have at least one of ${TYPE_OR}`); + assert(isNumber(port), 'Expected a numeric port'); + assert(Array.isArray(type), 'Expected type as an Array'); + assert(type.length !== 0, 'Expected non-empty type Array'); const invalid = type .filter((_type) => !TYPE.includes(_type)) diff --git a/packages/client-rpc/src/validate/config.spec.js b/packages/client-rpc/src/validate/config.spec.js index f5264a22..6707c0d9 100644 --- a/packages/client-rpc/src/validate/config.spec.js +++ b/packages/client-rpc/src/validate/config.spec.js @@ -6,19 +6,19 @@ describe('validateConfig', () => { it('throws when non-numeric port is specified', () => { expect( () => validateConfig({ port: 'abc' }) - ).toThrow(/non-numeric port='abc'/); + ).toThrow(/numeric port/); }); it('throws when type is not an array', () => { expect( () => validateConfig({ port: 123, type: 'notArray' }) - ).toThrow(/Type should be specified as an Array/); + ).toThrow(/as an Array/); }); it('throws when type is an empty array', () => { expect( () => validateConfig({ port: 123, type: [] }) - ).toThrow(/Type should have at least one/); + ).toThrow(/non-empty type/); }); it('throws when unknown type is found', () => { diff --git a/packages/client-rpc/src/validate/handlers.js b/packages/client-rpc/src/validate/handlers.js index 08805f15..8b604a9d 100644 --- a/packages/client-rpc/src/validate/handlers.js +++ b/packages/client-rpc/src/validate/handlers.js @@ -5,11 +5,14 @@ import type { HandlersType } from '../types'; const assert = require('@polkadot/util/assert'); const isFunction = require('@polkadot/util/is/function'); +const isObject = require('@polkadot/util/is/object'); module.exports = function validateHandlers (handlers: HandlersType = {}): void { + assert(isObject(handlers), 'Expected handler mapping object'); + const handlerKeys = Object.keys(handlers); - assert(handlerKeys.length !== 0, 'Cannot instantiate without handlers'); + assert(handlerKeys.length !== 0, 'Expected non-empty handler mapping'); const invalid = handlerKeys .filter((key) => !isFunction(handlers[key])) diff --git a/packages/client-rpc/src/validate/handlers.spec.js b/packages/client-rpc/src/validate/handlers.spec.js index 865c7135..0c213a00 100644 --- a/packages/client-rpc/src/validate/handlers.spec.js +++ b/packages/client-rpc/src/validate/handlers.spec.js @@ -3,16 +3,16 @@ const { validateHandlers } = require('./index'); describe('validateHandlers', () => { - it('throws when handlers are undefined', () => { + it('throws when handlers is non-object', () => { expect( - () => validateHandlers() - ).toThrow(/without handlers/); + () => validateHandlers('notAnObject') + ).toThrow(/handler mapping object/); }); it('throws when handlers are empty', () => { expect( () => validateHandlers({}) - ).toThrow(/without handlers/); + ).toThrow(/non-empty handler/); }); it('throws when non-function handlers are found', () => { diff --git a/packages/client-rpc/src/validate/request.js b/packages/client-rpc/src/validate/request.js index 6313ce00..321a3d71 100644 --- a/packages/client-rpc/src/validate/request.js +++ b/packages/client-rpc/src/validate/request.js @@ -4,12 +4,8 @@ const assert = require('@polkadot/util/assert'); const ExtError = require('@polkadot/util/ext/error'); const isNumber = require('@polkadot/util/is/number'); -const isUndefined = require('@polkadot/util/is/undefined'); module.exports = function validateRequest (id: number, jsonrpc: string): void { - assert(jsonrpc === '2.0', `Invalid jsonrpc field, expected '2.0', got '${jsonrpc}'`, ExtError.CODES.INVALID_JSONRPC); - - assert(!isUndefined(id), `Expected a defined id, received '${id}'`, ExtError.CODES.INVALID_JSONRPC); - - assert(isNumber(id), `Expected a numeric id, received '${id}'`, ExtError.CODES.INVALID_JSONRPC); + assert(jsonrpc === '2.0', `Invalid jsonrpc field, expected '2.0'`, ExtError.CODES.INVALID_JSONRPC); + assert(isNumber(id), `Expected a numeric id`, ExtError.CODES.INVALID_JSONRPC); }; diff --git a/packages/client-rpc/src/validate/request.spec.js b/packages/client-rpc/src/validate/request.spec.js index cbc1c416..da98d07f 100644 --- a/packages/client-rpc/src/validate/request.spec.js +++ b/packages/client-rpc/src/validate/request.spec.js @@ -4,18 +4,12 @@ describe('validateRequest', () => { it('fails when jsonrpc !== 2.0', () => { expect( () => validateRequest(0, '1.0') - ).toThrow(/Invalid jsonrpc field, expected '2.0', got '1.0'/); - }); - - it('fails when id is not defined', () => { - expect( - () => validateRequest(undefined, '2.0') - ).toThrow(/Expected a defined id, received 'undefined'/); + ).toThrow(/expected '2.0'/); }); it('fails when id is non-numeric', () => { expect( () => validateRequest('someId', '2.0') - ).toThrow(/Expected a numeric id, received 'someId'/); + ).toThrow(/numeric id/); }); }); diff --git a/packages/client-wasm/src/create/instance.js b/packages/client-wasm/src/create/instance.js index 4d8c54ad..2cf2a1f0 100644 --- a/packages/client-wasm/src/create/instance.js +++ b/packages/client-wasm/src/create/instance.js @@ -7,7 +7,7 @@ const isInstanceOf = require('@polkadot/util/is/instanceOf'); const createImports = require('./imports'); module.exports = function createInstance (module: WebAssemblyModule, imports?: WebAssemblyImports): WebAssemblyInstance { - assert(isInstanceOf(module, WebAssembly.Module), 'Cannot create from non-WebAssembly.Module'); + assert(isInstanceOf(module, WebAssembly.Module), 'Expected WebAssembly.Module'); return new WebAssembly.Instance(module, createImports(imports)); }; diff --git a/packages/client-wasm/src/create/instance.spec.js b/packages/client-wasm/src/create/instance.spec.js index c3cd2d15..2f71bfda 100644 --- a/packages/client-wasm/src/create/instance.spec.js +++ b/packages/client-wasm/src/create/instance.spec.js @@ -30,7 +30,7 @@ describe('createInstance', () => { it('throws and error on non-WebAssembly module', () => { expect( () => createInstance('nonAModule') - ).toThrow(/Cannot create from non/); + ).toThrow(/WebAssembly\.Module/); }); it('creates an instance with the module & imports', () => { diff --git a/packages/client-wasm/src/create/module.js b/packages/client-wasm/src/create/module.js index 44822d22..13731e7a 100644 --- a/packages/client-wasm/src/create/module.js +++ b/packages/client-wasm/src/create/module.js @@ -4,10 +4,9 @@ const assert = require('@polkadot/util/assert'); const isUint8Array = require('@polkadot/util/is/uint8Array'); -module.exports = function createModule (code: Uint8Array): WebAssemblyModule { - assert(isUint8Array(code), 'Cannot create from non-Uint8Array'); +module.exports = function createModule (bytecode: Uint8Array): WebAssemblyModule { + assert(isUint8Array(bytecode), 'Expected bytecode as Uint8Array'); + assert(WebAssembly.validate(bytecode), 'Expected valid wasm bytecode'); - assert(WebAssembly.validate(code), 'Invalid wasm bytecode supplied'); - - return new WebAssembly.Module(code); + return new WebAssembly.Module(bytecode); }; diff --git a/packages/client-wasm/src/create/module.spec.js b/packages/client-wasm/src/create/module.spec.js index ff7d9010..a672502e 100644 --- a/packages/client-wasm/src/create/module.spec.js +++ b/packages/client-wasm/src/create/module.spec.js @@ -29,13 +29,13 @@ describe('createModule', () => { it('throws an error on non-Uint8Array bytecode', () => { expect( () => createModule('nonUint8Array') - ).toThrow(/Cannot create from non/); + ).toThrow(/code as Uint8Array/); }); it('throws error on non-Wasm inputs', () => { expect( () => createModule(new Uint8Array([1, 2, 3])) - ).toThrow(/Invalid wasm bytecode supplied/); + ).toThrow(/valid wasm bytecode/); }); it('calls the Module constructor with the code', () => { diff --git a/packages/client-wasm/src/wasm.js b/packages/client-wasm/src/wasm.js index 5dbf3b39..67b7b284 100644 --- a/packages/client-wasm/src/wasm.js +++ b/packages/client-wasm/src/wasm.js @@ -9,11 +9,11 @@ const { createInstance, createModule } = require('./create'); module.exports = class Wasm { constructor (instance: WebAssemblyInstance) { - assert(isInstanceOf(instance, WebAssembly.Instance), 'WebAssembly instance to be provided'); + assert(isInstanceOf(instance, WebAssembly.Instance), 'Expected WebAssembly.Instance'); const exports = instance.exports; - assert(isObject(exports), 'No exports found on WebAssembly instance'); + assert(isObject(exports), 'Expected function exports'); Object.keys(exports).forEach((key: string) => { Object.defineProperty(this, key, { @@ -24,8 +24,8 @@ module.exports = class Wasm { }); } - static fromCode (code: Uint8Array, imports?: WebAssemblyImports): Wasm { - const module = createModule(code); + static fromCode (bytecode: Uint8Array, imports?: WebAssemblyImports): Wasm { + const module = createModule(bytecode); const instance = createInstance(module, imports); return new Wasm(instance); diff --git a/packages/client-wasm/src/wasm.spec.js b/packages/client-wasm/src/wasm.spec.js index 99d9930f..c7adcd93 100644 --- a/packages/client-wasm/src/wasm.spec.js +++ b/packages/client-wasm/src/wasm.spec.js @@ -28,13 +28,13 @@ describe('Wasm', () => { it('check for instance as WebAssembly.Instance', () => { expect( () => new Wasm('notInstance') - ).toThrow(/WebAssembly instance to be provided/); + ).toThrow(/WebAssembly\.Instance/); }); it('disallows empty exports', () => { expect( () => new Wasm(new WebAssembly.Instance()) - ).toThrow(/No exports found/); + ).toThrow(/Expected function exports/); }); });