test('Delayer - cancel should cancel all calls to trigger', function () { let count = 0; let factory = () => { return Promise.resolve(++count); }; let delayer = new async.Delayer(0); let promises: Thenable<any>[] = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); delayer.cancel(); return Promise.all(promises).then(() => { assert(!delayer.isTriggered()); }); });
test('Delayer - trigger, cancel, then trigger again', function () { let count = 0; let factory = () => { return TPromise.as(++count); }; let delayer = new Async.Delayer(0); let promises: TPromise[] = []; assert(!delayer.isTriggered()); const p = delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); delayer.cancel(); const p = TPromise.join(promises).then(() => { promises = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); const p = TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); assert(delayer.isTriggered()); return p; }); assert(delayer.isTriggered()); return p; }); assert(delayer.isTriggered()); return p; });
test('Delayer - trigger, cancel, then trigger again', function () { let count = 0; let factory = () => { return Promise.resolve(++count); }; let delayer = new async.Delayer(0); let promises: Thenable<any>[] = []; assert(!delayer.isTriggered()); const p = delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(void 0, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(void 0, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); delayer.cancel(); const p = Promise.all(promises).then(() => { promises = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); const p = Promise.all(promises).then(() => { assert(!delayer.isTriggered()); }); assert(delayer.isTriggered()); return p; }); return p; }); assert(delayer.isTriggered()); return p; });
protected request(channelName: string, name: string, arg: any): Promise { if (!this.disposeDelayer) { return Promise.wrapError('disposed'); } this.disposeDelayer.cancel(); const channel = this.channels[channelName] || (this.channels[channelName] = this.client.getChannel(channelName)); const request: Promise = channel.call(name, arg); // Progress doesn't propagate across 'then', we need to create a promise wrapper const result = new Promise((c, e, p) => { request.then(c, e, p).done(() => { if (!this.activeRequests) { return; } this.activeRequests.splice(this.activeRequests.indexOf(result), 1); if (this.activeRequests.length === 0) { this.disposeDelayer.trigger(() => this.disposeClient()); } }); }, () => request.cancel()); this.activeRequests.push(result); return result; }
request.then(c, e, p).done(() => { if (!this.activeRequests) { return; } this.activeRequests.splice(this.activeRequests.indexOf(result), 1); this.disposeDelayer.trigger(() => this.disposeClient()); });
const p = delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(null, () => { assert(true, 'yes, it was cancelled'); })); assert(delayer.isTriggered()); delayer.cancel(); const p = Promise.all(promises).then(() => { promises = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then(() => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); const p = Promise.all(promises).then(() => { assert(!delayer.isTriggered()); }); assert(delayer.isTriggered()); return p; }); return p; });
this.child.on('exit', (code: any, signal: any) => { process.removeListener('exit', onExit); if (this.activeRequests) { this.activeRequests.forEach(req => req.cancel()); this.activeRequests = []; } if (code && signal !== 'SIGTERM') { console.warn('IPC "' + this.options.serverName + '" crashed with exit code ' + code); this.disposeDelayer.cancel(); this.disposeClient(); } });
test('Delayer - progress should work', function () { let order = 0; let factory = () => new TPromise((c, e, p) => { TPromise.timeout(0).done(() => { p(order++); c(true); }); }); let delayer = new Async.Delayer(0); let promises: TPromise[] = []; let progresses: any[][] = [[], [], []]; promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[0].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[1].push(p))); promises.push(delayer.trigger(factory).then(null, null, (p) => progresses[2].push(p))); return TPromise.join(promises).then(() => { assert.deepEqual(progresses[0], [0]); assert.deepEqual(progresses[1], [0]); assert.deepEqual(progresses[2], [0]); }); });
test('Delayer', () => { let count = 0; let factory = () => { return Promise.resolve(++count); }; let delayer = new async.Delayer(0); let promises: Thenable<any>[] = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); return Promise.all(promises).then(() => { assert(!delayer.isTriggered()); }); });
test('Delayer', function () { let count = 0; let factory = () => { return TPromise.as(++count); }; let delayer = new Async.Delayer(0); let promises: TPromise[] = []; assert(!delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); promises.push(delayer.trigger(factory).then((result) => { assert.equal(result, 1); assert(!delayer.isTriggered()); })); assert(delayer.isTriggered()); return TPromise.join(promises).then(() => { assert(!delayer.isTriggered()); }); });