diff --git a/rollup.config.js b/rollup.config.js index 0ab8065..a25c50e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,12 +1,17 @@ -import typescript from 'rollup-plugin-typescript2'; -import pkg from './package.json'; +const typescript = require('rollup-plugin-typescript2'); +const pkg = require('./package.json'); -export default [ - { - input: 'src/index.ts', - output: [{file: pkg.main, format: 'cjs'}, {file: pkg.module, format: 'es'}], - plugins: [ - typescript(), - ], - }, -]; +export default { + input: 'src/index.ts', + output: [{file: pkg.main, format: 'cjs'}, {file: pkg.module, format: 'es'}], + plugins: [ + typescript({ + tsConfigOverride: { + compilerOptions: { + declaration: true, + allowJs: false, + }, + }, + }), + ], +}; diff --git a/src/JsonRpc.spec.ts b/src/JsonRpc.spec.ts new file mode 100644 index 0000000..49cd3d4 --- /dev/null +++ b/src/JsonRpc.spec.ts @@ -0,0 +1,61 @@ +import * as puppeteer from 'puppeteer'; +import {rollup} from 'rollup'; +import config from '../rollup.config'; +let browser: puppeteer.Browser; +let page: puppeteer.Page; + +beforeAll(async () => { + const bundle = await rollup({ + input: config['input'], + plugins: config['plugins'], + }); + const {code} = await bundle.generate({format: 'iife', name: 'JsonRpc'}); + browser = await puppeteer.launch(); + page = await browser.newPage(); + await page.addScriptTag({content: code}); + await page.setContent(``); + await page.evaluate(` + let resolve; + let reject; + let rpc; + const handshakePromise = new Promise(r => resolve = r); + window.addEventListener('message', e => { + const [port] = e.ports; + port.start(); + rpc = new JsonRpc({source: port, destination: port}); + resolve(); + }); + `); + const [, frame] = page.frames(); + await frame.addScriptTag({content: code}); + await frame.evaluate(` + const {port1, port2} = new MessageChannel(); + + const rpc = new JsonRpc({ + source: port1, + destination: port1, + methods: { + greet: name => 'Hello, ' + name, + }, + }); + port1.start(); + + window.top.postMessage({}, '*', [port2]); + `); + await page.evaluate(`handshakePromise`); +}); + +afterAll(async () => { + (await browser) && browser.close(); +}); + +it('calls between iframes', async () => { + const result = await page.evaluate(`rpc.call('greet', 'Alice')`); + expect(result).toEqual('Hello, Alice'); +}); + +it('fails on missing', async () => { + await expect(page.evaluate(`rpc.call('missing')`)).rejects.toMatchObject({ + message: /method not found/i, + }); +}); diff --git a/src/JsonRpc.test.ts b/src/JsonRpc.test.ts index bd8194a..898168c 100644 --- a/src/JsonRpc.test.ts +++ b/src/JsonRpc.test.ts @@ -116,7 +116,7 @@ describe('mounted', () => { }); it('communicates between iframes', async () => { - const result = await rpc1.call('greet', 'Alice'); + const result = await rpc1.call('greet', ['Alice']); expect(result).toEqual(`Hello, Alice`); }); diff --git a/src/JsonRpc.ts b/src/JsonRpc.ts index 21f0852..1977378 100644 --- a/src/JsonRpc.ts +++ b/src/JsonRpc.ts @@ -139,7 +139,7 @@ class JsonRpc { if (response.result) { deferred.resolve(response.result); } else { - deferred.reject(response.error); + deferred.reject(Object.assign(Error(), response.error)); } } @@ -152,7 +152,7 @@ class JsonRpc { private handleMessage = (e: MessageEvent) => { if (e.data.method) { this.handleRequest(e.data).then(response => - this.postMessage(e.source, response) + this.destination && this.postMessage(this.destination, response) ); } else { this.handleResponse(e.data); diff --git a/tsconfig.json b/tsconfig.json index c9a7ad9..c811c28 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,11 @@ { "compilerOptions": { - "declaration": true, + "allowJs": true, "strict": true, "strictFunctionTypes": false, "target": "es5", "module": "esnext", + "moduleResolution": "Node", "lib": ["es5", "es2015", "es2016", "dom"] } } diff --git a/yarn.lock b/yarn.lock index 459f529..19ddf4b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20,6 +20,10 @@ version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" +"@types/events@*": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" + "@types/jest@^23.3.1": version "23.3.1" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf" @@ -28,6 +32,19 @@ version "10.9.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897" +"@types/puppeteer@^1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.6.4.tgz#c3b27b72241c782053f21e3996edad561e31db9a" + dependencies: + "@types/events" "*" + "@types/node" "*" + +"@types/rollup@^0.54.0": + version "0.54.0" + resolved "https://registry.yarnpkg.com/@types/rollup/-/rollup-0.54.0.tgz#e3ab3a7b3c1bf92969602dd92a589de39f324a31" + dependencies: + rollup "*" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -46,6 +63,12 @@ acorn@^5.0.0, acorn@^5.5.3: version "5.7.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + dependencies: + es6-promisify "^5.0.0" + ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -528,6 +551,15 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -582,7 +614,7 @@ data-urls@^1.0.0: whatwg-mimetype "^2.1.0" whatwg-url "^7.0.0" -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -704,6 +736,16 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" +es6-promise@^4.0.3: + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -832,6 +874,15 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-zip@^1.6.6: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -858,6 +909,12 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" @@ -1130,6 +1187,13 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -1166,7 +1230,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -1983,6 +2047,10 @@ mime-types@^2.1.12, mime-types@~2.1.19: dependencies: mime-db "~1.36.0" +mime@^2.0.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" @@ -2025,7 +2093,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.0, mkdirp@^0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2317,6 +2385,10 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -2372,6 +2444,10 @@ process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + prompts@^0.1.9: version "0.1.14" resolved "https://registry.yarnpkg.com/prompts/-/prompts-0.1.14.tgz#a8e15c612c5c9ec8f8111847df3337c9cbd443b2" @@ -2379,6 +2455,10 @@ prompts@^0.1.9: kleur "^2.0.1" sisteransi "^0.1.1" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -2395,6 +2475,19 @@ punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" +puppeteer@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.8.0.tgz#9e8bbd2f5448cc19cac220efc0512837104877ad" + dependencies: + debug "^3.1.0" + extract-zip "^1.6.6" + https-proxy-agent "^2.2.1" + mime "^2.0.3" + progress "^2.0.0" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^5.1.1" + qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" @@ -2431,7 +2524,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.6: +readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -2581,6 +2674,13 @@ rollup-pluginutils@2.3.1: estree-walker "^0.5.2" micromatch "^2.3.11" +rollup@*: + version "0.66.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.66.2.tgz#77acdb9f4093f5f035ce75480577c40a81ea7999" + dependencies: + "@types/estree" "0.0.39" + "@types/node" "*" + rollup@^0.65.2: version "0.65.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.65.2.tgz#e1532e3c1a2e102c89d99289a184fcbbc7cd4b4a" @@ -2981,6 +3081,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + typescript@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" @@ -3142,7 +3246,7 @@ write-file-atomic@^2.1.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" -ws@^5.2.0: +ws@^5.1.1, ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" dependencies: @@ -3186,3 +3290,9 @@ yargs@^11.0.0: which-module "^2.0.0" y18n "^3.2.1" yargs-parser "^9.0.2" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1"