An EventEmitter that works over localStorage.
This module exposes a single class,
EventEmitter. Just create an instance of this class and start emitting events.
new EventEmitter([string room], [object options])
Creates a new EventEmitter, which lets you emit and listen for events.
The room ID is used to distinguish between different connections or rooms: when an EventEmitter emits an event, all open tabs in the same origin are notified of the event. With rooms, you can separate different channels: only EventEmitters with the same room ID as the source, will fire an event.
Rooms are optional: all emitters that don't have a room ID assigned, will behave as one room.
- attach: a boolean indicating whether to automatically start listening for events. Default: true
- emulate: a boolean indicating whether events should be emulated on the source emitter. When a key in localStorage is changed, all tabs in the same origin are notified, except the one that changed the key. Setting this to true (the default) will emulate the event on the source EventEmitter.
EventEmitter#listeners : object
An object mapping event names to arrays or registered listeners.
EventEmitter#room : string
The room ID of this emitter.
EventEmitter#options : options
The sanitized options for this emitter.
EventEmitter#version : string
The version of the library.
EventEmitter#attach([object origin (window)]) : this
Start listening for events; calls
origin is not defined. Called automatically on creation when options.attach is not
EventEmitter#detach([object origin (window)]) : this
Stop listening for events; calls
origin is not defined.
EventEmitter#handleEvent(StorageEvent event) : void
The listener for the
EventEmitter#_emit(Event event) : this
event on this emitter, i.e. call all listeners registered with this emitter.
EventEmitter#on(string event, function listener) : this
listener on this emitter for
EventEmitter#emit(string event, any data) : this
event with some data.
data must be abel to be passed through
JSON.stringify and will be added to the event object as
How it works
The inner workings under the hood are actually fairly simple: to emit en event, the
__events__ key in localStorage is changed to a specific string, formatted like this:
<room ID>,<random ID>,<data>.
<room ID>is the room ID of the source emitter. Other emitters will check if it matches their ID.
<random ID>is a randomly generated 20-digit number. When the same event is emitted, with the same data in the same room, the string saved in localStorage wouldn't change without this random ID. In this case, the
storageevent wouldn't fire on the other pages.
<data>is an stringified JSON object, containing some info about the event. It is parsed at the other end os the line.