@kano/common
Advanced tools
Comparing version 1.0.2 to 1.0.3
import { EventEmitter, Event } from '../events/index.js'; | ||
// Event triggered immediately | ||
const shortcutEvent = Object.freeze(function (callback, context) { | ||
let handle = setTimeout(callback.bind(context), 0); | ||
return { dispose() { clearTimeout(handle); } }; | ||
const shortcutEvent = Object.freeze((callback, context) => { | ||
const handle = setTimeout(callback.bind(context), 0); | ||
return { dispose() { clearTimeout(handle); } }; | ||
}); | ||
@@ -11,10 +11,10 @@ | ||
export const CancellationTokenTypes = { | ||
None: Object.freeze({ | ||
isCancellationRequested: false, | ||
onCancellationRequested: Event.None, | ||
}), | ||
Cancelled: Object.freeze({ | ||
isCancellationRequested: true, | ||
onCancellationRequested: shortcutEvent, | ||
}), | ||
None: Object.freeze({ | ||
isCancellationRequested: false, | ||
onCancellationRequested: Event.None, | ||
}), | ||
Cancelled: Object.freeze({ | ||
isCancellationRequested: true, | ||
onCancellationRequested: shortcutEvent, | ||
}), | ||
}; | ||
@@ -32,66 +32,64 @@ | ||
} | ||
cancel() { | ||
if (!this._isCancelled) { | ||
this._isCancelled = true; | ||
if (this._emitter) { | ||
this._emitter.fire(undefined); | ||
this.dispose(); | ||
} | ||
} | ||
} | ||
get isCancellationRequested() { | ||
return this._isCancelled; | ||
} | ||
cancel() { | ||
if (!this._isCancelled) { | ||
this._isCancelled = true; | ||
if (this._emitter) { | ||
this._emitter.fire(undefined); | ||
this.dispose(); | ||
} | ||
} | ||
} | ||
get isCancellationRequested() { | ||
return this._isCancelled; | ||
} | ||
get onCancellationRequested() { | ||
if (this._isCancelled) { | ||
return shortcutEvent; | ||
} | ||
if (!this._emitter) { | ||
this._emitter = new EventEmitter(); | ||
} | ||
return this._emitter.event; | ||
} | ||
get onCancellationRequested() { | ||
if (this._isCancelled) { | ||
return shortcutEvent; | ||
} | ||
if (!this._emitter) { | ||
this._emitter = new EventEmitter(); | ||
} | ||
return this._emitter.event; | ||
} | ||
dispose() { | ||
if (this._emitter) { | ||
this._emitter.dispose(); | ||
this._emitter = undefined; | ||
} | ||
} | ||
dispose() { | ||
if (this._emitter) { | ||
this._emitter.dispose(); | ||
this._emitter = undefined; | ||
} | ||
} | ||
} | ||
export class CancellationTokenSource { | ||
get token() { | ||
if (!this._token) { | ||
// be lazy and create the token only when | ||
// actually needed | ||
this._token = new CancellationToken(); | ||
} | ||
return this._token; | ||
} | ||
get token() { | ||
if (!this._token) { | ||
// be lazy and create the token only when | ||
// actually needed | ||
this._token = new CancellationToken(); | ||
} | ||
return this._token; | ||
} | ||
cancel() { | ||
if (!this._token) { | ||
// save an object by returning the default | ||
// cancelled token when cancellation happens | ||
// before someone asks for the token | ||
this._token = CancellationToken.Cancelled; | ||
cancel() { | ||
if (!this._token) { | ||
// save an object by returning the default | ||
// cancelled token when cancellation happens | ||
// before someone asks for the token | ||
this._token = CancellationToken.Cancelled; | ||
} else if (this._token instanceof CancellationToken) { | ||
// actually cancel | ||
this._token.cancel(); | ||
} | ||
} | ||
} else if (this._token instanceof CancellationToken) { | ||
// actually cancel | ||
this._token.cancel(); | ||
} | ||
} | ||
dispose() { | ||
if (!this._token) { | ||
// ensure to initialize with an empty token if we had none | ||
this._token = CancellationToken.None; | ||
} else if (this._token instanceof CancellationToken) { | ||
// actually dispose | ||
this._token.dispose(); | ||
} | ||
} | ||
} | ||
dispose() { | ||
if (!this._token) { | ||
// ensure to initialize with an empty token if we had none | ||
this._token = CancellationToken.None; | ||
} else if (this._token instanceof CancellationToken) { | ||
// actually dispose | ||
this._token.dispose(); | ||
} | ||
} | ||
} |
export const Event = { | ||
get None() { | ||
const _disposable = { dispose() { } }; | ||
return function () { return _disposable; }; | ||
} | ||
} | ||
return function none() { return _disposable; }; | ||
}, | ||
}; | ||
@@ -16,3 +16,4 @@ export class EventEmitter { | ||
} | ||
const addedListener = this._listeners.push(!thisArg ? listener : [listener, thisArg]); | ||
const addedListener = this._listeners.push(!thisArg ? | ||
listener : [listener, thisArg]); | ||
const result = { | ||
@@ -26,9 +27,9 @@ dispose: () => { | ||
this._listeners.splice(index, 1); | ||
} | ||
}, | ||
}; | ||
if (Array.isArray(disposables)) { | ||
disposables.push(result); | ||
if (disposables && typeof disposables.push === 'function') { | ||
disposables.push(result); | ||
} | ||
return result; | ||
} | ||
}; | ||
} | ||
@@ -38,10 +39,10 @@ return this._event; | ||
fire(event) { | ||
if (this._listeners) { | ||
// put all [listener,event]-pairs into delivery queue | ||
// then emit all event. an inner/nested event might be | ||
// the driver of this | ||
if (!this._deliveryQueue) { | ||
this._deliveryQueue = []; | ||
if (this._listeners) { | ||
// put all [listener,event]-pairs into delivery queue | ||
// then emit all event. an inner/nested event might be | ||
// the driver of this | ||
if (!this._deliveryQueue) { | ||
this._deliveryQueue = []; | ||
} | ||
this._listeners.forEach((listener) => { | ||
@@ -51,21 +52,21 @@ this._deliveryQueue.push([listener, event]); | ||
while (this._deliveryQueue.length > 0) { | ||
const [listener, event] = this._deliveryQueue.shift(); | ||
while (this._deliveryQueue.length > 0) { | ||
const [listener, e] = this._deliveryQueue.shift(); | ||
if (typeof listener === 'function') { | ||
listener.call(undefined, event); | ||
listener.call(undefined, e); | ||
} else { | ||
listener[0].call(listener[1], event); | ||
listener[0].call(listener[1], e); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
dispose() { | ||
if (this._listeners) { | ||
this._listeners = null; | ||
} | ||
if (this._deliveryQueue) { | ||
this._deliveryQueue.length = 0; | ||
} | ||
this._disposed = true; | ||
} | ||
if (this._listeners) { | ||
this._listeners = null; | ||
} | ||
if (this._deliveryQueue) { | ||
this._deliveryQueue.length = 0; | ||
} | ||
this._disposed = true; | ||
} | ||
} | ||
@@ -83,3 +84,3 @@ | ||
}; | ||
if (Array.isArray(disposables)) { | ||
if (disposables && typeof disposables.push === 'function') { | ||
disposables.push(result); | ||
@@ -100,3 +101,3 @@ } | ||
}; | ||
if (Array.isArray(disposables)) { | ||
if (disposables && typeof disposables.push === 'function') { | ||
disposables.push(result); | ||
@@ -103,0 +104,0 @@ } |
@@ -15,5 +15,43 @@ export class Disposables { | ||
export const Disposable = { | ||
None: { dispose() {} }, | ||
None: { dispose() { } }, | ||
}; | ||
/** | ||
* Comvenience function to call dispose on an array of disposable objects. | ||
* Also support a single disposable or a set of them passed to the function | ||
* @param {Disposable} first A single or array of disposable objects | ||
* @param {...Disposable} rest An array of disposable | ||
*/ | ||
export function dispose(first, ...rest) { | ||
if (Array.isArray(first)) { | ||
first.forEach(d => d && d.dispose()); | ||
return []; | ||
} else if (rest.length === 0) { | ||
if (first) { | ||
first.dispose(); | ||
return first; | ||
} | ||
return undefined; | ||
} | ||
dispose(first); | ||
dispose(rest); | ||
return []; | ||
} | ||
/** | ||
* Convenience function to combine a set of disposable object into one | ||
* @param {Disposable[]} disposables An array of disposable to combine into one | ||
*/ | ||
export function combinedDisposable(disposables) { | ||
return { dispose: () => dispose(disposables) }; | ||
} | ||
/** | ||
* Returns a disposable for a given function | ||
* @param {Function} fn A function freeing up a resource | ||
*/ | ||
export function toDisposable(fn) { | ||
return { dispose() { fn(); } }; | ||
} | ||
export default Disposables; |
{ | ||
"name": "@kano/common", | ||
"version": "1.0.2", | ||
"version": "1.0.3", | ||
"main": "index.js", | ||
@@ -8,6 +8,20 @@ "repository": "git@github.com:KanoComputing/web-common.git", | ||
"license": "MIT", | ||
"scripts": { | ||
"serve-test": "web-tester serve **/*.test.js", | ||
"test": "web-tester run **/*.test.js", | ||
"test-ci": "yarn run --silent test -r xunit > test-results.xml", | ||
"coverage": "web-tester cover **/*.test.js", | ||
"coverage-ci": "yarn run --silent coverage -r cobertura", | ||
"lint": "eslint ./index.js ./cancellation/index.js ./events/index.js ./events/emitter.js ./lifecycle/index.js ./lifecycle/disposables.js ./time/index.js", | ||
"lint-ci": "yarn lint -f checkstyle -o eslint.xml", | ||
"prepublishOnly": "yarn lint" | ||
}, | ||
"devDependencies": { | ||
"@kano/eslint-config": "^1.0.0", | ||
"@kano/web-tester": "^1.0.0-alpha.14", | ||
"chai": "^4.1.2", | ||
"eslint": "^4.19.1", | ||
"eslint-plugin-import": "^2.14.0", | ||
"mocha": "^5.2.0" | ||
} | ||
} |
@@ -9,3 +9,3 @@ export function subscribeTimeout(callback, timeout, thisArg, disposables) { | ||
}; | ||
if (Array.isArray(disposables)) { | ||
if (disposables && typeof disposables.push === 'function') { | ||
disposables.push(result); | ||
@@ -24,3 +24,3 @@ } | ||
}; | ||
if (Array.isArray(disposables)) { | ||
if (disposables && typeof disposables.push === 'function') { | ||
disposables.push(result); | ||
@@ -27,0 +27,0 @@ } |
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
11146
13
293
6