From 74f14160bd0c8c081e6d486ced895ce1754c0643 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 15 Mar 2018 16:33:21 +0100 Subject: [PATCH] Add api.extra.* (test) methods (#55) --- packages/api-format/src/output.js | 5 ++- .../api-jsonrpc/src/extra/getBlockNumber.js | 18 ++++++++++ .../api-jsonrpc/src/extra/getClientTime.js | 18 ++++++++++ packages/api-jsonrpc/src/extra/index.js | 19 +++++++++++ packages/api-jsonrpc/src/index.js | 2 ++ packages/api-jsonrpc/src/types.js | 4 +-- packages/api/src/create/interface.js | 9 +++-- packages/api/src/create/interface.spec.js | 33 ++++++++++--------- packages/api/src/index.js | 17 ++++++---- packages/api/src/types.js | 5 +-- 10 files changed, 101 insertions(+), 29 deletions(-) create mode 100644 packages/api-jsonrpc/src/extra/getBlockNumber.js create mode 100644 packages/api-jsonrpc/src/extra/getClientTime.js create mode 100644 packages/api-jsonrpc/src/extra/index.js diff --git a/packages/api-format/src/output.js b/packages/api-format/src/output.js index 7085471a91..64c8bac5e7 100644 --- a/packages/api-format/src/output.js +++ b/packages/api-format/src/output.js @@ -5,15 +5,18 @@ import type { InterfaceOutputType } from '@polkadot/api-jsonrpc/types'; +const bnDecode = require('@polkadot/primitives-json/bn/decode'); const headerDecode = require('@polkadot/primitives-json/header/decode'); const echo = require('./echo'); const util = require('./util'); const formatters = { + 'BlockNumber': bnDecode, 'Header': headerDecode, 'OutData': echo, - 'StorageData': echo + 'StorageData': echo, + 'U64': bnDecode }; module.exports = function formatOutput (output: InterfaceOutputType, value: mixed): mixed { diff --git a/packages/api-jsonrpc/src/extra/getBlockNumber.js b/packages/api-jsonrpc/src/extra/getBlockNumber.js new file mode 100644 index 0000000000..43fb26bb94 --- /dev/null +++ b/packages/api-jsonrpc/src/extra/getBlockNumber.js @@ -0,0 +1,18 @@ +// Copyright 2017-2018 Jaco Greeff +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. +// @flow + +import type { InterfaceMethodDefinition } from '../types'; + +/** + @name getBlockNumber + @signature extra_getBlockNumber (): BlockNumber + @summary Retrieves the best blockNumber + @description + Returns the best blockNumber available on the client +*/ +module.exports = ({ + inputs: [], + output: { type: 'BlockNumber' } +}: InterfaceMethodDefinition); diff --git a/packages/api-jsonrpc/src/extra/getClientTime.js b/packages/api-jsonrpc/src/extra/getClientTime.js new file mode 100644 index 0000000000..c7877d7e87 --- /dev/null +++ b/packages/api-jsonrpc/src/extra/getClientTime.js @@ -0,0 +1,18 @@ +// Copyright 2017-2018 Jaco Greeff +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. +// @flow + +import type { InterfaceMethodDefinition } from '../types'; + +/** + @name getClientTime + @signature extra_getClientTime (): U64 + @summary Retrieves the current time + @description + Returns the current time on the running node +*/ +module.exports = ({ + inputs: [], + output: { type: 'U64' } +}: InterfaceMethodDefinition); diff --git a/packages/api-jsonrpc/src/extra/index.js b/packages/api-jsonrpc/src/extra/index.js new file mode 100644 index 0000000000..e7ada3fbda --- /dev/null +++ b/packages/api-jsonrpc/src/extra/index.js @@ -0,0 +1,19 @@ +// Copyright 2017-2018 Jaco Greeff +// This software may be modified and distributed under the terms +// of the ISC license. See the LICENSE file for details. +// @flow + +import type { InterfaceDefinition } from '../types'; + +const getBlockNumber = require('./getBlockNumber'); +const getClientTime = require('./getClientTime'); + +/** + @summary Extended methods not available in all clients. +*/ +module.exports = ({ + methods: { + getBlockNumber, + getClientTime + } +}: InterfaceDefinition); diff --git a/packages/api-jsonrpc/src/index.js b/packages/api-jsonrpc/src/index.js index 602e63e8c9..6d845b04ef 100644 --- a/packages/api-jsonrpc/src/index.js +++ b/packages/api-jsonrpc/src/index.js @@ -6,6 +6,7 @@ import type { InterfaceDefinitions } from './types'; const chain = require('./chain'); +const extra = require('./extra'); const state = require('./state'); /** @@ -13,5 +14,6 @@ const state = require('./state'); */ module.exports = ({ chain, + extra, state }: InterfaceDefinitions); diff --git a/packages/api-jsonrpc/src/types.js b/packages/api-jsonrpc/src/types.js index 7086979ce3..3a3f223548 100644 --- a/packages/api-jsonrpc/src/types.js +++ b/packages/api-jsonrpc/src/types.js @@ -5,7 +5,7 @@ export type FormatInputType = 'Address' | 'CallData' | 'H256' | 'HeaderHash' | 'String'; -export type FormatOutputType = 'Header' | 'OutData' | 'StorageData'; +export type FormatOutputType = 'BlockNumber' | 'Header' | 'OutData' | 'StorageData' | 'U64'; export type InterfaceInputType = { name: string, @@ -22,7 +22,7 @@ export type InterfaceMethodDefinition = { output: InterfaceOutputType }; -export type InterfaceTypes = 'chain' | 'state'; +export type InterfaceTypes = 'chain' | 'extra' | 'state'; export type InterfaceDefinition$Methods = { [string]: InterfaceMethodDefinition diff --git a/packages/api/src/create/interface.js b/packages/api/src/create/interface.js index faaff105b2..074aa6d311 100644 --- a/packages/api/src/create/interface.js +++ b/packages/api/src/create/interface.js @@ -3,15 +3,20 @@ // of the ISC license. See the LICENSE file for details. // @flow -import type { InterfaceDefinition } from '@polkadot/api-jsonrpc/types'; +import type { InterfaceTypes } from '@polkadot/api-jsonrpc/types'; import type { ProviderInterface } from '@polkadot/api-provider/types'; import type { ApiInterface$Section } from '../types'; +const interfaces = require('@polkadot/api-jsonrpc'); + const createMethod = require('./method'); const createSubscribe = require('./subscribe'); -module.exports = function createInterface (provider: ProviderInterface, { methods }: InterfaceDefinition, section: string): ApiInterface$Section { +console.log('interfaces', interfaces); + +module.exports = function createInterface (provider: ProviderInterface, section: InterfaceTypes): ApiInterface$Section { const exposed: $Shape = {}; + const { methods } = interfaces[section]; exposed.subscribe = createSubscribe(provider, section, methods); exposed.unsubscribe = provider.unsubscribe; diff --git a/packages/api/src/create/interface.spec.js b/packages/api/src/create/interface.spec.js index 3da42574af..b42a852820 100644 --- a/packages/api/src/create/interface.spec.js +++ b/packages/api/src/create/interface.spec.js @@ -4,6 +4,23 @@ const isFunction = require('@polkadot/util/is/function'); +jest.mock('./@polkadot/api-jsonrpc', () => ({ + test: { + methods: { + blah: { + inputs: [ + { name: 'foo', type: 'Address' } + ], + output: { type: 'Address' } + }, + bleh: { + inputs: [], + output: { type: 'Address' } + } + } + } +})); + const createInterface = require('./interface'); describe('createInterface', () => { @@ -11,26 +28,12 @@ describe('createInterface', () => { let provider; beforeEach(() => { - const definition = { - methods: { - blah: { - inputs: [ - { name: 'foo', type: 'Address' } - ], - output: { type: 'Address' } - }, - bleh: { - inputs: [], - output: { type: 'Address' } - } - } - }; provider = { send: jest.fn((method, params) => { return Promise.resolve(params[0]); }) }; - container = createInterface(provider, definition, 'test'); + container = createInterface(provider, 'test'); }); it('adds the specified methods to the interface', () => { diff --git a/packages/api/src/index.js b/packages/api/src/index.js index 696ecd91af..ca25c7b650 100644 --- a/packages/api/src/index.js +++ b/packages/api/src/index.js @@ -3,20 +3,23 @@ // of the ISC license. See the LICENSE file for details. // @flow +import type { InterfaceTypes } from '@polkadot/api-jsonrpc/types'; import type { ProviderInterface } from '@polkadot/api-provider/types'; import type { ApiInterface } from './types'; -const interfaces = require('@polkadot/api-jsonrpc'); const assert = require('@polkadot/util/assert'); const isFunction = require('@polkadot/util/is/function'); const createInterface = require('./create/interface'); -module.exports = function api (provider: ProviderInterface): ApiInterface { - assert(provider && isFunction(provider.send), 'Expected Provider'); +const ALL_INTERFACES: Array = ['chain', 'extra', 'state']; - return { - chain: createInterface(provider, interfaces.chain, 'chain'), - state: createInterface(provider, interfaces.state, 'state') - }; +module.exports = function api (provider: ProviderInterface): ApiInterface { + assert(provider && isFunction(provider.send), 'Expected Provider to API create'); + + return ALL_INTERFACES.reduce((result, type: InterfaceTypes) => { + result[type] = createInterface(provider, type); + + return result; + }, ({}: $Shape)); }; diff --git a/packages/api/src/types.js b/packages/api/src/types.js index b3ed0e145c..2e4bdafbd7 100644 --- a/packages/api/src/types.js +++ b/packages/api/src/types.js @@ -3,6 +3,8 @@ // of the ISC license. See the LICENSE file for details. // @flow +import type { InterfaceTypes } from '@polkadot/api-jsonrpc/types'; + export type ApiInterface$Section$Method = (...params: Array) => Promise; export type ApiInterface$Section = { @@ -13,6 +15,5 @@ export type ApiInterface$Section = { }; export type ApiInterface = { - chain: ApiInterface$Section, - state: ApiInterface$Section + [InterfaceTypes]: ApiInterface$Section }