y-serviceworker
Version:
Service Worker Connector for Yjs (enables communication with a Service Worker)
1 lines • 4.24 kB
Source Map (JSON)
{"version":3,"sources":["../yjs/node_modules/browser-pack/_prelude.js","src/ServiceWorker.js"],"names":[],"mappings":";;;;;;AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"y-serviceworker.es6","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})","/* global Y, MessageChannel */\n'use strict'\n\nfunction extend (Y) {\n class YServiceWorker extends Y.AbstractConnector {\n constructor (y, options) {\n if (options === undefined) {\n throw new Error('Options must not be undefined!')\n }\n if (options.room == null) {\n throw new Error('You must define a room name!')\n }\n\n options.role = 'slave'\n options.preferUntransformed = true\n super(y, options)\n this.debug = Y.debug('y:service-worker')\n\n this.y.db.stopGarbageCollector()\n this.options = options\n this.guid = Y.utils.generateGuid() // we send this unique id with every postMessage. Later it becomes the userId\n var self = this\n var setNewServiceWorker = function (sw) {\n self.serviceworker = sw\n var messageChannel = new MessageChannel()\n messageChannel.port1.onmessage = self.messageEventListener\n self.serviceworker.postMessage({\n type: 'join',\n room: options.room,\n auth: options.auth,\n guid: self.guid\n }, [messageChannel.port2])\n self.userJoined('serviceworker', 'master')\n }\n navigator.serviceWorker.ready.then(function (registration) {\n setNewServiceWorker(registration.controller || registration.active)\n self.whenSynced(function () {\n self.setUserId(self.guid)\n })\n navigator.serviceWorker.addEventListener('controllerchange', function () {\n self.debug('controllerchanged')\n var sw = navigator.serviceWorker.controller\n if (self.serviceworker !== sw && sw !== null) {\n self.debug('replace old sw')\n self.userLeft('serviceworker')\n setNewServiceWorker(sw)\n }\n })\n })\n\n this.messageEventListener = function (event) {\n if (event.data.room === options.room && (event.data.guid == null || event.data.guid === self.guid)) {\n if (event.data.type === 'message') {\n self.receiveMessage('serviceworker', event.data.message)\n }\n }\n }\n navigator.serviceWorker.addEventListener('message', this.messageEventListener)\n }\n destroy () {\n navigator.serviceWorker.removeEventListener('message', this.messageEventListener)\n this.userLeft('serviceworker')\n this.serviceworker.postMessage({\n type: 'leave',\n room: this.options.room,\n guid: this.guid\n })\n }\n disconnect () {\n // do nothing\n }\n reconnect () {\n // do nothing\n }\n send (uid, message) {\n this.broadcast(message)\n super.send(uid, message)\n }\n broadcast (message) {\n this.serviceworker.postMessage({\n type: 'message',\n room: this.options.room,\n message: message,\n guid: this.guid\n })\n super.broadcast(message)\n }\n isDisconnected () {\n return false\n }\n }\n Y.extend('serviceworker', YServiceWorker)\n}\n\nmodule.exports = extend\nif (typeof Y !== 'undefined') {\n extend(Y)\n}\n"]}