Skip to content

Commit 735c219

Browse files
authored
voice - fix issues around stopping transcription (microsoft#191774)
1 parent 61a31ee commit 735c219

File tree

4 files changed

+217
-101
lines changed

4 files changed

+217
-101
lines changed

src/vs/base/common/event.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,24 @@ export namespace Event {
557557
return new Promise(resolve => once(event)(resolve));
558558
}
559559

560+
/**
561+
* Creates an event out of a promise that fires once when the promise is
562+
* resolved with the result of the promise or `undefined`.
563+
*/
564+
export function fromPromise<T>(promise: Promise<T>): Event<T | undefined> {
565+
const result = new Emitter<T | undefined>();
566+
567+
promise.then(res => {
568+
result.fire(res);
569+
}, () => {
570+
result.fire(undefined);
571+
}).finally(() => {
572+
result.dispose();
573+
});
574+
575+
return result.event;
576+
}
577+
560578
/**
561579
* Adds a listener to an event and calls the listener immediately with undefined as the event object.
562580
*

src/vs/base/test/common/event.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55
import * as assert from 'assert';
66
import { stub } from 'sinon';
7-
import { timeout } from 'vs/base/common/async';
7+
import { DeferredPromise, timeout } from 'vs/base/common/async';
88
import { CancellationToken } from 'vs/base/common/cancellation';
99
import { errorHandler, setUnexpectedErrorHandler } from 'vs/base/common/errors';
1010
import { AsyncEmitter, DebounceEmitter, DynamicListEventMultiplexer, Emitter, Event, EventBufferer, EventMultiplexer, IWaitUntil, MicrotaskEmitter, PauseableEmitter, Relay, createEventDeliveryQueue } from 'vs/base/common/event';
@@ -1158,6 +1158,48 @@ suite('Event utils', () => {
11581158
listener.dispose(); // should not crash
11591159
});
11601160

1161+
suite('fromPromise', () => {
1162+
1163+
test('not yet resolved', async function () {
1164+
return new Promise(resolve => {
1165+
let promise = new DeferredPromise<number>();
1166+
1167+
Event.fromPromise(promise.p)(e => {
1168+
assert.strictEqual(e, 1);
1169+
1170+
promise = new DeferredPromise();
1171+
1172+
Event.fromPromise(promise.p)(() => {
1173+
resolve();
1174+
});
1175+
1176+
promise.error(undefined);
1177+
});
1178+
1179+
promise.complete(1);
1180+
});
1181+
});
1182+
1183+
test('already resolved', async function () {
1184+
return new Promise(resolve => {
1185+
let promise = new DeferredPromise<number>();
1186+
promise.complete(1);
1187+
1188+
Event.fromPromise(promise.p)(e => {
1189+
assert.strictEqual(e, 1);
1190+
1191+
promise = new DeferredPromise();
1192+
promise.error(undefined);
1193+
1194+
Event.fromPromise(promise.p)(() => {
1195+
resolve();
1196+
});
1197+
});
1198+
1199+
});
1200+
});
1201+
});
1202+
11611203
suite('Relay', () => {
11621204
test('should input work', () => {
11631205
const e1 = new Emitter<number>();

0 commit comments

Comments
 (0)