Comparing version 2.0.2 to 3.0.0
@@ -5,2 +5,18 @@ # Change Log | ||
<a name="3.0.0"></a> | ||
# [3.0.0](https://github.com/vesparny/brcast/compare/v2.0.2...v3.0.0) (2017-08-02) | ||
### Performance Improvements | ||
* improve performance by not allocating an unsubscribe function for ([e70f01e](https://github.com/vesparny/brcast/commit/e70f01e)) | ||
### BREAKING CHANGES | ||
* subscribe does not return a function anymore, but a | ||
subscriptionId instead | ||
<a name="2.0.2"></a> | ||
@@ -7,0 +23,0 @@ ## [2.0.2](https://github.com/vesparny/brcast/compare/v2.0.1...v2.0.2) (2017-07-27) |
function createBroadcast (initialState) { | ||
var listeners = {}; | ||
var id = 0; | ||
var id = 1; | ||
var _state = initialState; | ||
var getState = function () { return _state; }; | ||
function getState () { | ||
return _state | ||
} | ||
var setState = function (state) { | ||
function setState (state) { | ||
_state = state; | ||
var keys = Object.keys(listeners); | ||
for (var i = 0; i < keys.length; i += 1) { | ||
var i = 0; | ||
var len = keys.length; | ||
for (; i < len; i++) { | ||
// if a listener gets unsubscribed during setState we just skip it | ||
if (typeof listeners[keys[i]] !== 'undefined') { | ||
listeners[keys[i]](state); | ||
} | ||
if (listeners[keys[i]]) { listeners[keys[i]](state); } | ||
} | ||
}; | ||
} | ||
var subscribe = function (listener) { | ||
if (typeof listener !== 'function') { throw new Error('listener must be a function.') } | ||
// subscribe to changes and return the subscriptionId | ||
function subscribe (listener) { | ||
if (typeof listener !== 'function') { | ||
throw new Error('listener must be a function.') | ||
} | ||
var currentId = id; | ||
var isSubscribed = true; | ||
listeners[currentId] = listener; | ||
id += 1; | ||
return function unsubscribe () { | ||
// in case unsubscribe gets called multiple times we simply return | ||
if (!isSubscribed) { return } | ||
isSubscribed = false; | ||
delete listeners[currentId]; | ||
} | ||
}; | ||
return currentId | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe } | ||
// remove subscription by removing the listener function | ||
function unsubscribe (id) { | ||
listeners[id] = undefined; | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe, unsubscribe: unsubscribe } | ||
} | ||
module.exports = createBroadcast; |
@@ -1,2 +0,2 @@ | ||
function createBroadcast(t){var e={},r=0,n=t;return{getState:function(){return n},setState:function(t){n=t;for(var r=Object.keys(e),o=0;o<r.length;o+=1)void 0!==e[r[o]]&&e[r[o]](t)},subscribe:function(t){if("function"!=typeof t)throw new Error("listener must be a function.");var n=r,o=!0;return e[n]=t,r+=1,function(){o&&(o=!1,delete e[n])}}}}module.exports=createBroadcast; | ||
function createBroadcast(t){var e={},r=1,n=t;return{getState:function(){return n},setState:function(t){n=t;for(var r=Object.keys(e),o=0,u=r.length;o<u;o++)e[r[o]]&&e[r[o]](t)},subscribe:function(t){if("function"!=typeof t)throw new Error("listener must be a function.");var n=r;return e[n]=t,r+=1,n},unsubscribe:function(t){e[t]=void 0}}}module.exports=createBroadcast; | ||
//# sourceMappingURL=brcast.cjs.min.js.map |
function createBroadcast (initialState) { | ||
var listeners = {}; | ||
var id = 0; | ||
var id = 1; | ||
var _state = initialState; | ||
var getState = function () { return _state; }; | ||
function getState () { | ||
return _state | ||
} | ||
var setState = function (state) { | ||
function setState (state) { | ||
_state = state; | ||
var keys = Object.keys(listeners); | ||
for (var i = 0; i < keys.length; i += 1) { | ||
var i = 0; | ||
var len = keys.length; | ||
for (; i < len; i++) { | ||
// if a listener gets unsubscribed during setState we just skip it | ||
if (typeof listeners[keys[i]] !== 'undefined') { | ||
listeners[keys[i]](state); | ||
} | ||
if (listeners[keys[i]]) { listeners[keys[i]](state); } | ||
} | ||
}; | ||
} | ||
var subscribe = function (listener) { | ||
if (typeof listener !== 'function') { throw new Error('listener must be a function.') } | ||
// subscribe to changes and return the subscriptionId | ||
function subscribe (listener) { | ||
if (typeof listener !== 'function') { | ||
throw new Error('listener must be a function.') | ||
} | ||
var currentId = id; | ||
var isSubscribed = true; | ||
listeners[currentId] = listener; | ||
id += 1; | ||
return function unsubscribe () { | ||
// in case unsubscribe gets called multiple times we simply return | ||
if (!isSubscribed) { return } | ||
isSubscribed = false; | ||
delete listeners[currentId]; | ||
} | ||
}; | ||
return currentId | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe } | ||
// remove subscription by removing the listener function | ||
function unsubscribe (id) { | ||
listeners[id] = undefined; | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe, unsubscribe: unsubscribe } | ||
} | ||
export default createBroadcast; |
@@ -9,33 +9,37 @@ (function (global, factory) { | ||
var listeners = {}; | ||
var id = 0; | ||
var id = 1; | ||
var _state = initialState; | ||
var getState = function () { return _state; }; | ||
function getState () { | ||
return _state | ||
} | ||
var setState = function (state) { | ||
function setState (state) { | ||
_state = state; | ||
var keys = Object.keys(listeners); | ||
for (var i = 0; i < keys.length; i += 1) { | ||
var i = 0; | ||
var len = keys.length; | ||
for (; i < len; i++) { | ||
// if a listener gets unsubscribed during setState we just skip it | ||
if (typeof listeners[keys[i]] !== 'undefined') { | ||
listeners[keys[i]](state); | ||
} | ||
if (listeners[keys[i]]) { listeners[keys[i]](state); } | ||
} | ||
}; | ||
} | ||
var subscribe = function (listener) { | ||
if (typeof listener !== 'function') { throw new Error('listener must be a function.') } | ||
// subscribe to changes and return the subscriptionId | ||
function subscribe (listener) { | ||
if (typeof listener !== 'function') { | ||
throw new Error('listener must be a function.') | ||
} | ||
var currentId = id; | ||
var isSubscribed = true; | ||
listeners[currentId] = listener; | ||
id += 1; | ||
return function unsubscribe () { | ||
// in case unsubscribe gets called multiple times we simply return | ||
if (!isSubscribed) { return } | ||
isSubscribed = false; | ||
delete listeners[currentId]; | ||
} | ||
}; | ||
return currentId | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe } | ||
// remove subscription by removing the listener function | ||
function unsubscribe (id) { | ||
listeners[id] = undefined; | ||
} | ||
return { getState: getState, setState: setState, subscribe: subscribe, unsubscribe: unsubscribe } | ||
} | ||
@@ -42,0 +46,0 @@ |
@@ -1,2 +0,2 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.brcast=t()}(this,function(){function e(e){var t={},n=0,o=e;return{getState:function(){return o},setState:function(e){o=e;for(var n=Object.keys(t),r=0;r<n.length;r+=1)void 0!==t[n[r]]&&t[n[r]](e)},subscribe:function(e){if("function"!=typeof e)throw new Error("listener must be a function.");var o=n,r=!0;return t[o]=e,n+=1,function(){r&&(r=!1,delete t[o])}}}}return e}); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.brcast=t()}(this,function(){return function(e){var t={},n=1,o=e;return{getState:function(){return o},setState:function(e){o=e;for(var n=Object.keys(t),r=0,u=n.length;r<u;r++)t[n[r]]&&t[n[r]](e)},subscribe:function(e){if("function"!=typeof e)throw new Error("listener must be a function.");var o=n;return t[o]=e,n+=1,o},unsubscribe:function(e){t[e]=void 0}}}}); | ||
//# sourceMappingURL=brcast.umd.min.js.map |
38
index.js
export default function createBroadcast (initialState) { | ||
let listeners = {} | ||
let id = 0 | ||
let id = 1 | ||
let _state = initialState | ||
const getState = () => _state | ||
function getState () { | ||
return _state | ||
} | ||
const setState = state => { | ||
function setState (state) { | ||
_state = state | ||
const keys = Object.keys(listeners) | ||
for (let i = 0; i < keys.length; i += 1) { | ||
let i = 0 | ||
const len = keys.length | ||
for (; i < len; i++) { | ||
// if a listener gets unsubscribed during setState we just skip it | ||
if (typeof listeners[keys[i]] !== 'undefined') { | ||
listeners[keys[i]](state) | ||
} | ||
if (listeners[keys[i]]) listeners[keys[i]](state) | ||
} | ||
} | ||
const subscribe = listener => { | ||
if (typeof listener !== 'function') { throw new Error('listener must be a function.') } | ||
// subscribe to changes and return the subscriptionId | ||
function subscribe (listener) { | ||
if (typeof listener !== 'function') { | ||
throw new Error('listener must be a function.') | ||
} | ||
const currentId = id | ||
let isSubscribed = true | ||
listeners[currentId] = listener | ||
id += 1 | ||
return function unsubscribe () { | ||
// in case unsubscribe gets called multiple times we simply return | ||
if (!isSubscribed) return | ||
isSubscribed = false | ||
delete listeners[currentId] | ||
} | ||
return currentId | ||
} | ||
return { getState, setState, subscribe } | ||
// remove subscription by removing the listener function | ||
function unsubscribe (id) { | ||
listeners[id] = undefined | ||
} | ||
return { getState, setState, subscribe, unsubscribe } | ||
} |
@@ -7,10 +7,18 @@ import brcast from './index' | ||
test('exposes the public API', () => { | ||
const broadcast = brcast() | ||
const methods = Object.keys(broadcast) | ||
expect(methods.length).toBe(4) | ||
expect(methods).toContain('subscribe') | ||
expect(methods).toContain('unsubscribe') | ||
expect(methods).toContain('getState') | ||
expect(methods).toContain('setState') | ||
}) | ||
test('throws if listener is not a function', () => { | ||
const broadcast = brcast() | ||
expect(() => broadcast.subscribe()).toThrow() | ||
expect(() => broadcast.subscribe('throw')).toThrow() | ||
expect(() => broadcast.subscribe({})).toThrow() | ||
expect(() => broadcast.subscribe(() => {})).not.toThrow() | ||
@@ -39,6 +47,5 @@ }) | ||
const broadcast = brcast(1) | ||
const subscription = broadcast.subscribe(handler) | ||
const subscriptionId = broadcast.subscribe(handler) | ||
broadcast.subscribe(handler1) | ||
expect(typeof subscription).toBe('function') | ||
subscription() | ||
broadcast.unsubscribe(subscriptionId) | ||
broadcast.setState(2) | ||
@@ -53,6 +60,6 @@ broadcast.setState(3) | ||
const broadcast = brcast(1) | ||
const subscription = broadcast.subscribe(handler) | ||
const subscriptionId = broadcast.subscribe(handler) | ||
subscription() | ||
subscription() | ||
broadcast.unsubscribe(subscriptionId) | ||
broadcast.unsubscribe(subscriptionId) | ||
broadcast.setState(2) | ||
@@ -69,5 +76,5 @@ expect(handler.mock.calls.length).toBe(0) | ||
broadcast.subscribe(handler) | ||
const unSub1 = broadcast.subscribe(() => { | ||
const sub1Id = broadcast.subscribe(() => { | ||
handler1() | ||
unSub1() | ||
broadcast.unsubscribe(sub1Id) | ||
}) | ||
@@ -86,5 +93,5 @@ broadcast.subscribe(handler2) | ||
const unsubscribeHandles = [] | ||
const unsubscribeIds = [] | ||
const doUnsubscribeAll = () => | ||
unsubscribeHandles.forEach(unsubscribe => unsubscribe()) | ||
unsubscribeIds.forEach(id => broadcast.unsubscribe(id)) | ||
@@ -95,4 +102,4 @@ const handler = jest.fn() | ||
unsubscribeHandles.push(broadcast.subscribe(handler)) | ||
unsubscribeHandles.push( | ||
unsubscribeIds.push(broadcast.subscribe(handler)) | ||
unsubscribeIds.push( | ||
broadcast.subscribe(() => { | ||
@@ -103,3 +110,3 @@ handler1() | ||
) | ||
unsubscribeHandles.push(broadcast.subscribe(handler2)) | ||
unsubscribeIds.push(broadcast.subscribe(handler2)) | ||
@@ -106,0 +113,0 @@ broadcast.setState(2) |
{ | ||
"name": "brcast", | ||
"amdName": "brcast", | ||
"version": "2.0.2", | ||
"version": "3.0.0", | ||
"description": "Tiny data broadcaster with 0 dependencies", | ||
@@ -46,3 +46,3 @@ "jsnext:main": "index.js", | ||
"babel-register": "^6.24.1", | ||
"cross-env": "^4.0.0", | ||
"cross-env": "^5.0.1", | ||
"gzip-size-cli": "^2.0.0", | ||
@@ -55,5 +55,5 @@ "husky": "^0.14.3", | ||
"rimraf": "^2.5.2", | ||
"rollup": "^0.41.4", | ||
"rollup": "^0.45.2", | ||
"rollup-plugin-buble": "^0.15.0", | ||
"rollup-plugin-uglify": "^1.0.1", | ||
"rollup-plugin-uglify": "^2.0.1", | ||
"standard": "^10.0.2", | ||
@@ -60,0 +60,0 @@ "standard-version": "^4.0.0" |
@@ -6,3 +6,3 @@ # Brcast | ||
[![Travis](https://img.shields.io/travis/vesparny/brcast.svg)](https://travis-ci.org/vesparny/brcast) | ||
[![Code Coverage](https://img.shields.io/codecov/c/github/vesparny/fair-analytics.svg?style=flat-square)](https://codecov.io/github/vesparny/fair-analytics) | ||
[![Code Coverage](https://img.shields.io/codecov/c/github/vesparny/brcast.svg?style=flat-square)](https://codecov.io/github/vesparny/brcast) | ||
[![David](https://img.shields.io/david/vesparny/brcast.svg)](https://david-dm.org/vesparny/brcast) | ||
@@ -25,2 +25,3 @@ [![npm](https://img.shields.io/npm/v/brcast.svg)](https://www.npmjs.com/package/brcast) | ||
- [Usage](#usage) | ||
- [API](#API) | ||
- [Testing](#tests) | ||
@@ -63,3 +64,3 @@ - [License](#license) | ||
// subscribe | ||
let unsubscribe = broadcast.subscribe(state => console.log(state)) | ||
const subscriptionId = broadcast.subscribe(state => console.log(state)) | ||
@@ -72,7 +73,64 @@ // setState sets the state and invoke all subscription callbacks passing in the state | ||
// unsubscribe: invoke the function returned by broadcast.subscribe(state => console.log(state)) | ||
// to unbind the handler | ||
unsubscribe() | ||
// unsubscribe to unbind the handler | ||
broadcast.unsubscribe(subscriptionId) | ||
``` | ||
## API | ||
### `brcast([initialState])` | ||
Creates a `broadcast` object. | ||
#### Arguments | ||
1 - [`initialState`] *(any)*: The initial state. | ||
#### Returns | ||
(`broadcast`): An object that holds the state. | ||
### `broadcast.setState(state)` | ||
Store the new state. | ||
#### Arguments | ||
1 - `state` *(any)*: The new state. | ||
#### Returns | ||
Nothing. | ||
### `broadcast.getState()` | ||
Get the stored state. | ||
#### Returns | ||
(`Any`): The stored state. | ||
### `broadcast.subscribe(handler)` | ||
Subscribe to state changes. | ||
#### Arguments | ||
1 - `handler` *(Function)*: The callback to be invoked any time the state changes. | ||
#### Returns | ||
(`Number`): The subscription id to be used to unsubscribe. | ||
### `broadcast.unsubscribe(subscriptionId)` | ||
Unsubscribe the change listener. | ||
#### Arguments | ||
1 - `subscriptionId` *(Number)*: The subscription id returned by subscribing. | ||
#### Returns | ||
Nothing. | ||
## Tests | ||
@@ -79,0 +137,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
20422
244
140