Comparing version 0.0.1 to 0.1.0
{ | ||
"name": "burrata", | ||
"version": "0.0.1", | ||
"version": "0.1.0", | ||
"description": "Robust, developer-friendly postMessage.", | ||
@@ -22,16 +22,41 @@ "repository": "https://github.com/timdp/burrata", | ||
"scripts": { | ||
"prepare": "yarn run build", | ||
"clean": "yarn run rimraf dist", | ||
"build": "yarn run clean && yarn run build:bundle && yarn run build:minify", | ||
"prepublishOnly": "yarn run build", | ||
"clean": "yarn run clean:dist && yarn run clean:coverage", | ||
"clean:dist": "yarn run rimraf dist", | ||
"clean:coverage": "yarn run rimraf dist", | ||
"build": "yarn run clean:dist && yarn run build:bundle && yarn run build:minify", | ||
"build:bundle": "yarn run rollup -c", | ||
"build:minify": "yarn run uglifyjs -c -m -o dist/burrata.min.js dist/burrata.js", | ||
"test": "yarn run standard" | ||
"test": "yarn run build && yarn run test:lint && yarn run test:e2e", | ||
"test:lint": "yarn run standard", | ||
"test:e2e": "yarn run clean:coverage && yarn run karma start --single-run" | ||
}, | ||
"dependencies": { | ||
"@babel/polyfill": "^7.0.0-beta.51", | ||
"p-defer": "^1.0.0" | ||
"@babel/runtime": "^7.0.0-beta.51", | ||
"custom-event": "^1.0.1", | ||
"event-target-shim": "^3.0.1", | ||
"p-defer": "^1.0.0", | ||
"serialize-error": "^2.1.0" | ||
}, | ||
"devDependencies": { | ||
"@babel/core": "^7.0.0-beta.51", | ||
"@babel/plugin-transform-runtime": "^7.0.0-beta.51", | ||
"@babel/preset-env": "^7.0.0-beta.51", | ||
"babel-loader": "^8.0.0-beta", | ||
"babel-plugin-istanbul": "^4.1.6", | ||
"chai": "^4.1.2", | ||
"dirty-chai": "^2.0.1", | ||
"es6-error": "^4.1.1", | ||
"karma": "^2.0.3", | ||
"karma-chai": "^0.1.0", | ||
"karma-chrome-launcher": "^2.2.0", | ||
"karma-coverage": "^1.1.2", | ||
"karma-coveralls": "^1.2.1", | ||
"karma-dirty-chai": "^2.0.0", | ||
"karma-junit-reporter": "^1.2.0", | ||
"karma-mocha": "^1.3.0", | ||
"karma-mocha-iframes": "^0.5.2", | ||
"karma-spec-reporter": "^0.0.32", | ||
"karma-webpack": "^3.0.0", | ||
"mocha": "^5.2.0", | ||
"rimraf": "^2.6.2", | ||
@@ -44,10 +69,16 @@ "rollup": "^0.60.7", | ||
"standard": "^11.0.1", | ||
"uglify-js": "^3.4.0" | ||
"uglify-js": "^3.4.0", | ||
"webpack": "^4.12.0" | ||
}, | ||
"standard": { | ||
"globals": [ | ||
"EventTarget", | ||
"CustomEvent" | ||
"describe", | ||
"it", | ||
"before", | ||
"after", | ||
"beforeEach", | ||
"afterEach", | ||
"expect" | ||
] | ||
} | ||
} |
@@ -7,2 +7,45 @@ # Burrata | ||
## Usage | ||
1. Load `dist/burrata.js` with a `<script>` tag. This will put the `burrata` | ||
object on the `window`. | ||
2. Create an instance of `Master`, register some commands, and call `init()` to | ||
listen for commands from slaves: | ||
```js | ||
const master = new burrata.Master() | ||
// Register the "echo" command, which sends back the value of the "msg" arg. | ||
master.setHandler('echo', async ({ msg }) => { | ||
return msg | ||
}) | ||
// Start listening for commands. | ||
master.init() | ||
``` | ||
3. Add an `<iframe>` for each slave. In the iframe HTML document, load | ||
`burrata.js` again and set up the slave: | ||
```js | ||
// Choose a unique ID for this slave. | ||
const id = '123' | ||
const slave = new burrata.Slave(id) | ||
// Connect to master. | ||
await slave.init() | ||
// Call "echo" on master and print the result. | ||
const response = await slave.send('echo', { msg: 'Hello!' }) | ||
console.log('Response: ' + response) | ||
``` | ||
Slaves can define command handlers using the same API. See the [demo](demo/) for | ||
more examples. | ||
## Known Issues | ||
- Coverage reporting is currently broken. | ||
## Author | ||
@@ -9,0 +52,0 @@ |
@@ -1,4 +0,2 @@ | ||
import '@babel/polyfill' | ||
export { Master } from './master' | ||
export { Slave } from './slave' |
@@ -1,6 +0,6 @@ | ||
import { Peer } from './peer' | ||
import { Node } from './node' | ||
import { Receiver } from './receiver' | ||
import { Sender } from './sender' | ||
class SlaveStub extends Peer { | ||
class SlaveStub extends Node { | ||
constructor (master, id, target) { | ||
@@ -21,3 +21,3 @@ super(id, target, '*') | ||
class Master extends Peer { | ||
class Master extends Node { | ||
constructor (target = window) { | ||
@@ -52,3 +52,3 @@ super('', target, '*') | ||
for (let i = 0; i < slaves.length; ++i) { | ||
result[slaves[i]] = responses[i] | ||
result[slaves[i].id] = responses[i] | ||
} | ||
@@ -59,5 +59,5 @@ return result | ||
_accept (id, win) { | ||
const peer = new SlaveStub(this, id, win) | ||
this._slaves[id] = peer | ||
return peer | ||
const node = new SlaveStub(this, id, win) | ||
this._slaves[id] = node | ||
return node | ||
} | ||
@@ -64,0 +64,0 @@ } |
@@ -0,7 +1,9 @@ | ||
import CustomEvent from 'custom-event' | ||
import defer from 'p-defer' | ||
import { Peer } from './peer' | ||
import serializeError from 'serialize-error' | ||
import { Node } from './node' | ||
class Receiver { | ||
constructor (peer) { | ||
this._peer = peer | ||
constructor (node) { | ||
this._node = node | ||
this._dfds = {} | ||
@@ -48,3 +50,3 @@ this._onMessage = this._onMessage.bind(this) | ||
async _handleConnect ({ id, from }, source) { | ||
const slave = this._peer._accept(from, source) | ||
const slave = this._node._accept(from, source) | ||
slave._send('response', id) | ||
@@ -56,22 +58,21 @@ const evt = new CustomEvent('connect', { | ||
}) | ||
this._peer.dispatchEvent(evt) | ||
this._node.dispatchEvent(evt) | ||
} | ||
async _handleRequest ({ id, from, payload: { type, args } }) { | ||
if (!Peer.instances.hasOwnProperty(from)) { | ||
if (!Node.instances.hasOwnProperty(from)) { | ||
return | ||
} | ||
const peer = Peer.instances[from] | ||
const node = Node.instances[from] | ||
let result = null | ||
let error = null | ||
try { | ||
result = await this._peer.handle(type, args, peer) | ||
result = await this._node.handle(type, args, node) | ||
} catch (err) { | ||
let errStr = 'Unknown error' | ||
error = { message: '' + err } | ||
try { | ||
errStr = '' + err | ||
} catch (err2) {} | ||
error = { message: errStr } | ||
error = serializeError(err) | ||
} catch (_) {} | ||
} finally { | ||
peer._send('response', id, { error, result }) | ||
node._send('response', id, { error, result }) | ||
} | ||
@@ -87,3 +88,15 @@ } | ||
if (error != null) { | ||
reject(new Error(error.message)) | ||
const err = new Error(error.message) | ||
;['name', 'stack'].forEach(name => { | ||
const value = error[name] | ||
try { | ||
Object.defineProperty(err, name, { | ||
configurable: true, | ||
enumerable: false, | ||
value, | ||
writable: true | ||
}) | ||
} catch (_) {} | ||
}) | ||
reject(err) | ||
} else { | ||
@@ -90,0 +103,0 @@ resolve(result) |
let count = 0 | ||
class Sender { | ||
constructor (peer) { | ||
this._peer = peer | ||
constructor (node) { | ||
this._node = node | ||
this._id = count++ | ||
@@ -21,3 +21,3 @@ this._msgId = 0 | ||
const id = `${this._id}:${msgId}` | ||
const receiving = this._peer._receive(id) | ||
const receiving = this._node._receive(id) | ||
this._send(command, id, payload) | ||
@@ -28,3 +28,3 @@ return receiving | ||
_send (type, id, payload = {}) { | ||
const { id: from, target, origin } = this._peer | ||
const { id: from, target, origin } = this._node | ||
const msg = JSON.stringify({ type, from, id, payload }) | ||
@@ -31,0 +31,0 @@ target.postMessage(msg, origin) |
@@ -1,6 +0,6 @@ | ||
import { Peer } from './peer' | ||
import { Node } from './node' | ||
import { Receiver } from './receiver' | ||
import { Sender } from './sender' | ||
class Slave extends Peer { | ||
class Slave extends Node { | ||
constructor (id, target = window.parent, origin = '*') { | ||
@@ -7,0 +7,0 @@ super(id, target, origin) |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
57
211181
5
29
4379
+ Addedcustom-event@^1.0.1
+ Addedevent-target-shim@^3.0.1
+ Addedserialize-error@^2.1.0
+ Added@babel/runtime@7.26.7(transitive)
+ Addedcustom-event@1.0.1(transitive)
+ Addedevent-target-shim@3.0.2(transitive)
+ Addedregenerator-runtime@0.14.1(transitive)
+ Addedserialize-error@2.1.0(transitive)
- Removed@babel/polyfill@^7.0.0-beta.51
- Removed@babel/polyfill@7.12.1(transitive)
- Removedcore-js@2.6.12(transitive)
- Removedregenerator-runtime@0.13.11(transitive)