神刀安全网

msgr: nifty client/worker postMessage utility

msgr

Nifty worker/client postMessage utility

Made with ❤ at @outlandish

Table of Contents

  • Import
  • Initialise
  • msgr API
  • Channel API
  • Message API

Import

// ES6 import msgr from 'msgr'  // CommonJS var msgr = require('msgr')  // RequireJS define(['msgr'], function (msgr) {/*...*/})
<!-- Script, available as `window.msgr` --> <script src="/node_modules/msgr/index.js"></script>

Initialise

Example

Client: msgr.client()

Pass in reference to the worker and a collection of message handlers:

const recipient = navigator.serviceWorker.controller  const channel = msgr.client(recipient, {   // Predefined message handlers   SAY_HELLO: (data) => console.log('Hello, ' + data) //=> 'Hello, World!' })  // Send something "unknown" to the worker. // Notice it does not have a tag. channel.send({   username: 'Flanders',   location: 'Springfield' })  // Send a "known" message to the worker channel.send('CACHE_ASSET', '/cat.gif').then(function (message) {   console.log(message) //=> 'Caching complete!' })

Worker: msgr.worker()

On the worker you just pass in your message handlers:

const channel = msgr.worker({   CACHE_ASSET: cacheAsset })  channel.receive(function (data) {   // Do something with an "unknown" message   // that does not have a predefined handler.   console.log(data) //=> { username: 'Flanders', ... } })  // Send something "known" to the client using a tag. channel.send('SAY_HELLO', 'World!')  function cacheAsset (url, respond) {   doCaching().then(function () {     respond('Caching complete!')   }) }

msgr API

msgr.client(serviceWorker, handlers) : Channel

Initialise a msgr client.

  • serviceWorker {ServiceWorkerRegistration} Worker that will receive messages sent via channel
  • handlers {Object} An object of message type/handler mappings

Returns a Channel. See theChannel API Docsfor more details.

Example:

msgr.client(navigator.serviceWorker.controller, {   NOTIFY: function (respond) {     new Notification('You have a notification!')     respond('GOT_THE_NOTIFICATION')   } })

msgr.worker(handlers) : Channel

Initialise a msgr worker.

  • handlers {Object} An object of message type/handler mappings

Returns a Channel. See theChannel API Docsfor more details.

Example:

msgr.worker({   NOTIFY: function (respond) {     new Notification('You have a notification!')     respond('GOT_THE_NOTIFICATION')   } })

Channel API

channel.ready(handler)

Register a handler to be called when the channel is opened between client and worker.

  • handler {Function} The ready handler

Although you can register ready handlers, you can send messages before the channel is open using channel.send() and these will be queued and sent as soon as the channel is ready.

Example:

channel.ready(function () {   application.start() })

channel.send([type,] data) : Promise

Send a message through the channel to the worker/client.

  • [ type ] {String} (optional) The message type
  • data {Any} The message data

Returns a Message. See theMessage API Docsfor more details.

If data is not a string it will be stringified by calling data.toString() .

If called before the channel is ready the message will be queued and sent as soon as the channel is open.

Example:

// Tagged channel.send('NOTIFY_USER', { message: 'Update complete' })  // Untagged channel.send('This is the untagged data')

channel.receive(handler)

Handle an "unknown" message that is not tagged.

  • handler {Function} The message handler

The handler receives two arguments: the data of the message and a respond function.

Example:

channel.receive(function (data, respond) {   console.log('Got some unknown data: ' + data) })

Message API

message.then(handler)

Register a handler to receive the response to a message.

  • handler {Function} Response handler

Note: a message can only have one then handler. Registering more than one will throw an error.

Example:

// In client message handlers msgr({   NOTIFY_USER: function (data, respond) {     new Notification('Job ' + data.id + ' was completed')     respond('From worker: job deleted') // ACK   } })  // In worker channel.send('NOTIFY_USER', { id: 1337 }).then((data) => {   console.log(data) //=> 'From worker: job deleted' })

respond([data])

Send a response to a received message.

This function is passed as the second argument to both "known" and "unknown" message handlers.

  • [ data ] {Any} (optional) The data to respond to the message with

Contributing

All pull requests and issues welcome!

If you’re not sure how, check out Kent C. Dodds’ great video tutorials on egghead.io !

Author & License

msgr was created by Sam Gluck and is released under the MIT license.

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » msgr: nifty client/worker postMessage utility

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址