Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .babelrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"presets": [["@babel/preset-env", { "targets": { "node": "current" } }]]
}
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ coverage/
.nyc_output/
diff
npm-debug.log
dist
6 changes: 6 additions & 0 deletions .prettierrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"semi": false,
"singleQuote": true,
"trailingComma": "all",
"arrowParens": "avoid"
}
96 changes: 45 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
<h1 align="center">Promise-based RPC client and server for web workers</h1>
<p align="center">
<a href="https://www.npmjs.com/package/@librpc/web" target="_blank">
<img src="https://img.shields.io/npm/v/@librpc/web.svg" alt="NPM version" target="_blank"></img>
</a>
<a href="https://travis-ci.org/librpc/web" target="_blank">
<img src="https://travis-ci.org/librpc/web.svg?branch=master" alt="Build Status" target="_blank"></img>
</a>
<a href='https://coveralls.io/github/librpc/web?branch=master'>
<img src='https://coveralls.io/repos/github/librpc/web/badge.svg?branch=master' alt='Coverage Status' />
</a>
<a href="https://github.com/feross/standard" target="_blank">
<img src="https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat" alt="js-standard-style"/>
</a>
</p>
# Promise-based RPC client and server for web workers

Forked from https://github.com/librpc/web to add transferrables and serialized-error

## Table of Contents

Expand All @@ -34,50 +22,53 @@
## Install

```
npm install --save @librpc/web
npm install --save librpc-web-mod
```

or download [dev](https://unpkg.com/@librpc/web/dist/web-rpc.umd.js) or [prod](https://unpkg.com/@librpc/web/dist/web-rpc.min.js) version

## Usage

```js
// server.js
import { Server as RpcServer } from '@librpc/web'
import { Server as RpcServer } from 'librpc-web-mod'

function wait (time) {
function wait(time) {
return new Promise(resolve => setTimeout(resolve, time))
}

self.rpcServer = new RpcServer({
add ({ x, y }) { return x + y },
task () { return wait(1000) },
error () { return err },
transfer (buffer) { return { buffer }}
add({ x, y }) {
return x + y
},
task() {
return wait(1000)
},
error() {
return err
},
transfer(buffer) {
return { buffer }
},
})
```

```js
// client.js
import { Client as RpcClient } from '@librpc/web'
import { Client as RpcClient } from 'librpc-web-mod'

var worker = new window.Worker('server.js')

var rpcClient = new RpcClient({ workers: [worker] })

rpcClient.call('add', { x: 1, y: 1})
.then(res => console.log(res)) // 2
rpcClient.call('add', { x: 1, y: 1 }).then(res => console.log(res)) // 2

rpcClient.call('length')
.catch(err => console.log(err)) // Unknown RPC method "length"
rpcClient.call('length').catch(err => console.log(err)) // Unknown RPC method "length"

rpcClient.call('task', null, { timeout: 100 })
.catch(err => console.log(err)) // Timeout exceeded for RPC method "task"
rpcClient.call('task', null, { timeout: 100 }).catch(err => console.log(err)) // Timeout exceeded for RPC method "task"

rpcClient.call('error')
.catch(err => console.log(err)) // ReferenceError: err is not defined
rpcClient.call('error').catch(err => console.log(err)) // ReferenceError: err is not defined

rpcClient.call('transfer', new ArrayBuffer(0xff))
rpcClient
.call('transfer', new ArrayBuffer(0xff))
.then(res => console.log(res.buffer)) // ArrayBuffer(255)
```

Expand All @@ -89,11 +80,21 @@ rpcClient.call('transfer', new ArrayBuffer(0xff))

```js
var server = new RpcServer({
add ({ x, y }) { return x + y },
sub ({ x, y }) { return x - y },
mul ({ x, y }) { return x * y },
div ({ x, y }) { return x / y },
pow ({ x, y }) { return x ** y }
add({ x, y }) {
return x + y
},
sub({ x, y }) {
return x - y
},
mul({ x, y }) {
return x * y
},
div({ x, y }) {
return x / y
},
pow({ x, y }) {
return x ** y
},
})
```

Expand Down Expand Up @@ -123,21 +124,23 @@ Client could be connected to several workers for better CPU utilization. Request
#### `#call(method: string, data: *, { timeout = 2000 } = {}): Promise<*>`

```js
client.call('pow', { x: 2, y: 10 })
.then(result => console.log(result))
client.call('pow', { x: 2, y: 10 }).then(result => console.log(result))
```

Remote procedure call. Only ArrayBuffers will be transferred automatically (not TypedArrays).

Error would be thrown, if:

- it happened during procedure
- you try to call an unexisted procedure
- procedure execution takes more than `timeout`

#### `#on(eventName: string, listener: (*) => void)`

```js
function listener (data) { console.log(data) }
function listener(data) {
console.log(data)
}
client.on('update', listener)
```

Expand All @@ -150,12 +153,3 @@ client.off('update', listener)
```

Stop listen to server events.

## Development

Command | Description
------- | -----------
`npm run check` | Check standard code style by [snazzy](https://www.npmjs.com/package/snazzy)
`npm run build` | Wrap source code in [UMD](https://github.com/umdjs/umd) by [rollup](http://rollupjs.org/)
`npm run test` | Run tests by [tape](https://github.com/substack/tape) and compute code coverage by [nyc](https://github.com/bcoe/nyc)
`npm run min` | Minify code by [UglifyJS2](https://github.com/mishoo/UglifyJS2)
Loading