Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

📪 Nifty service worker/client message utility

License

NotificationsYou must be signed in to change notification settings

sdgluck/msgr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Nifty service worker/client message utility

Made with ❤ at@outlandish

npm versionjs-standard-style

Makes communication between a client and service worker super easy...

  • Send messages from client to worker and vice-versa
  • Accommodates complex communications with a simple API
  • Easily respond to any message
  • Receive one-off responses to messages

To see it being used in the wild, check out the source code offetch-sync.

Table of Contents

Import

Client

// ES6importmsgrfrom'msgr'// CommonJSvarmsgr=require('msgr')// RequireJSdefine(['msgr'],function(msgr){/*...*/})
<!-- Script, available as `window.msgr` --><scriptsrc="/node_modules/msgr/index.js"></script>

Worker

If you are bundling your SW then you can use the Import methods above.

Otherwise...

// importScriptsimportScripts('/node_modules/msgr/index.js')

Initialise & Example

Client:msgr.client()

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

constrecipient=navigator.serviceWorker.controllerconstchannel=msgr.client(recipient,{// Predefined message handlersSAY_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 workerchannel.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:

constchannel=msgr.worker({CACHE_ASSET:(url,respond)=>{cache(url).then(function(){respond('Caching complete!')})}})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!')

Sending Messages

  • Anonymous, data-only message:

    channel.send({requestId:'123'})
  • Type-only message:

    channel.send('RE_CACHE')
  • Typed message with data:

    channel.send('RE_CACHE',{assetUrl:'/cat.gif'})

Receiving Messages

The API for receiving messages is the same for both the worker and client.

  • Anonymous, data-only message:

    channel.receive((data)=>{console.log(data.requestId)//=> '123'})
  • Type-only message:

    msgr.client({RE_CACHE:(data,respond)=>{console.log(data)//=> null}})
  • Typed message with data:

    msgr.client({RE_CACHE:(data,respond)=>{console.log(data.assetUrl)//=> '/cat.gif'}})

msgr API

msgr.client(serviceWorker, handlers) : Channel

Initialise amsgr 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 Docs for more details.

Example:

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

msgr.worker(handlers) : Channel

Initialise amsgr worker.

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

Returns a Channel. See theChannel API Docs for more details.

Example:

msgr.worker({NOTIFY:function(respond){newNotification('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 usingchannel.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 (it will be JSON.stringify'd)

Returns a Message. See theMessage API Docs for more details.

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

Example:

// Typed message, will invoke registered type handlerschannel.send('NOTIFY_USER')// Typed message with data, will invoke registered type handlerschannel.send('NOTIFY_USER',{message:'Update complete'})// Anonymous, will invoke `receive` handlerschannel.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: thedata of the message and arespond 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

Example:

// In client message handlersmsgr({NOTIFY_USER:function(data,respond){newNotification('Job '+data.id+' was completed')respond('From worker: job deleted')// ACK}})// In workerchannel.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 bySam Gluck and is released under the MIT license.

About

📪 Nifty service worker/client message utility

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp