@corti/dictation-web 0.6.0-rc.1 → 0.6.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bundle.js CHANGED
@@ -962,36 +962,43 @@ function c5({ context: c6, subscribe: e10 }) {
962
962
  }
963
963
 
964
964
  // dist/utils/devices.js
965
- async function requestMicAccess() {
966
- if (!navigator.permissions) {
967
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
968
- stream.getTracks().forEach((track) => {
969
- track.stop();
965
+ async function primeMicStream() {
966
+ if (navigator.permissions) {
967
+ const permissionStatus = await navigator.permissions.query({
968
+ name: "microphone"
970
969
  });
971
- return;
970
+ if (permissionStatus.state === "denied") {
971
+ throw new Error("Microphone permission is denied");
972
+ }
972
973
  }
973
- const permissionStatus = await navigator.permissions.query({
974
- name: "microphone"
974
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
975
+ stream.getTracks().forEach((track) => {
976
+ track.stop();
975
977
  });
976
- if (permissionStatus.state === "denied") {
977
- throw new Error("Microphone permission is denied");
978
- }
979
- if (permissionStatus.state === "prompt") {
980
- const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
981
- stream.getTracks().forEach((track) => {
982
- track.stop();
983
- });
984
- }
985
978
  }
986
979
  async function getAudioDevices() {
987
980
  if (!navigator.mediaDevices?.enumerateDevices) {
988
981
  throw new Error("MediaDevices API is not available");
989
982
  }
990
- await requestMicAccess();
983
+ let audioDevices = await listAudioInputs();
984
+ if (needsMicPriming(audioDevices)) {
985
+ await primeMicStream();
986
+ audioDevices = await listAudioInputs();
987
+ }
988
+ return {
989
+ defaultDevice: audioDevices[0],
990
+ devices: audioDevices
991
+ };
992
+ }
993
+ async function listAudioInputs() {
991
994
  const devices = await navigator.mediaDevices.enumerateDevices();
992
- const audioDevices = devices.filter((device) => device.kind === "audioinput");
993
- const defaultDevice = audioDevices.length > 0 ? audioDevices[0] : void 0;
994
- return { defaultDevice, devices: audioDevices };
995
+ return devices.filter((device) => device.kind === "audioinput");
996
+ }
997
+ function needsMicPriming(audioInputs) {
998
+ if (audioInputs.length === 0) {
999
+ return false;
1000
+ }
1001
+ return audioInputs.some((d3) => d3.deviceId === "" || d3.label === "");
995
1002
  }
996
1003
 
997
1004
  // dist/utils/events.js
@@ -1048,6 +1055,13 @@ function usageEvent(detail) {
1048
1055
  detail
1049
1056
  });
1050
1057
  }
1058
+ function deltaUsageEvent(detail) {
1059
+ return new CustomEvent("delta-usage", {
1060
+ bubbles: true,
1061
+ composed: true,
1062
+ detail
1063
+ });
1064
+ }
1051
1065
  function errorToMessage(error) {
1052
1066
  if (error instanceof Error) {
1053
1067
  return error.message;
@@ -1850,15 +1864,16 @@ var StreamConfigStatusMessageType = {
1850
1864
  ConfigDenied: "CONFIG_DENIED",
1851
1865
  ConfigMissing: "CONFIG_MISSING",
1852
1866
  ConfigNotProvided: "CONFIG_NOT_PROVIDED",
1853
- ConfigAlreadyReceived: "CONFIG_ALREADY_RECEIVED",
1854
- ConfigTimeout: "CONFIG_TIMEOUT"
1867
+ ConfigAlreadyReceived: "CONFIG_ALREADY_RECEIVED"
1855
1868
  };
1856
1869
 
1857
1870
  // node_modules/@corti/sdk/dist/esm/api/types/TranscribeConfigStatusMessageType.mjs
1858
1871
  var TranscribeConfigStatusMessageType = {
1859
1872
  ConfigAccepted: "CONFIG_ACCEPTED",
1860
1873
  ConfigDenied: "CONFIG_DENIED",
1861
- ConfigTimeout: "CONFIG_TIMEOUT"
1874
+ ConfigTimeout: "CONFIG_TIMEOUT",
1875
+ ConfigAlreadyReceived: "CONFIG_ALREADY_RECEIVED",
1876
+ ConfigMissing: "CONFIG_MISSING"
1862
1877
  };
1863
1878
 
1864
1879
  // node_modules/@corti/sdk/dist/esm/core/schemas/builders/schema-utils/stringifyValidationErrors.mjs
@@ -2198,15 +2213,15 @@ var HttpResponsePromise = class _HttpResponsePromise extends Promise {
2198
2213
  };
2199
2214
 
2200
2215
  // node_modules/@corti/sdk/dist/esm/core/fetcher/Headers.mjs
2201
- var Headers;
2216
+ var Headers2;
2202
2217
  if (typeof globalThis.Headers !== "undefined") {
2203
- Headers = globalThis.Headers;
2218
+ Headers2 = globalThis.Headers;
2204
2219
  } else {
2205
- Headers = class Headers2 {
2220
+ Headers2 = class Headers3 {
2206
2221
  constructor(init) {
2207
2222
  this.headers = /* @__PURE__ */ new Map();
2208
2223
  if (init) {
2209
- if (init instanceof Headers2) {
2224
+ if (init instanceof Headers3) {
2210
2225
  init.forEach((value, key) => this.append(key, value));
2211
2226
  } else if (Array.isArray(init)) {
2212
2227
  for (const [key, value] of init) {
@@ -2277,7 +2292,7 @@ if (typeof globalThis.Headers !== "undefined") {
2277
2292
 
2278
2293
  // node_modules/@corti/sdk/dist/esm/core/fetcher/RawResponse.mjs
2279
2294
  var abortRawResponse = {
2280
- headers: new Headers(),
2295
+ headers: new Headers2(),
2281
2296
  redirected: false,
2282
2297
  status: 499,
2283
2298
  statusText: "Client Closed Request",
@@ -2285,7 +2300,7 @@ var abortRawResponse = {
2285
2300
  url: ""
2286
2301
  };
2287
2302
  var unknownRawResponse = {
2288
- headers: new Headers(),
2303
+ headers: new Headers2(),
2289
2304
  redirected: false,
2290
2305
  status: 0,
2291
2306
  statusText: "Unknown Error",
@@ -2859,7 +2874,7 @@ var SENSITIVE_HEADERS = /* @__PURE__ */ new Set([
2859
2874
  ]);
2860
2875
  function redactHeaders(headers) {
2861
2876
  const filtered = {};
2862
- for (const [key, value] of headers instanceof Headers ? headers.entries() : Object.entries(headers)) {
2877
+ for (const [key, value] of headers instanceof Headers2 ? headers.entries() : Object.entries(headers)) {
2863
2878
  if (SENSITIVE_HEADERS.has(key.toLowerCase())) {
2864
2879
  filtered[key] = "[REDACTED]";
2865
2880
  } else {
@@ -2957,7 +2972,7 @@ function redactUrl(url) {
2957
2972
  function getHeaders(args) {
2958
2973
  return __awaiter10(this, void 0, void 0, function* () {
2959
2974
  var _a;
2960
- const newHeaders = new Headers();
2975
+ const newHeaders = new Headers2();
2961
2976
  newHeaders.set("Accept", args.responseType === "json" ? "application/json" : args.responseType === "text" ? "text/plain" : args.responseType === "sse" ? "text/event-stream" : "*/*");
2962
2977
  if (args.body !== void 0 && args.contentType != null) {
2963
2978
  newHeaders.set("Content-Type", args.contentType);
@@ -5964,8 +5979,7 @@ var StreamConfigStatusMessageType2 = schemas_exports.enum_([
5964
5979
  "CONFIG_DENIED",
5965
5980
  "CONFIG_MISSING",
5966
5981
  "CONFIG_NOT_PROVIDED",
5967
- "CONFIG_ALREADY_RECEIVED",
5968
- "CONFIG_TIMEOUT"
5982
+ "CONFIG_ALREADY_RECEIVED"
5969
5983
  ]);
5970
5984
 
5971
5985
  // node_modules/@corti/sdk/dist/esm/serialization/types/StreamConfigStatusMessage.mjs
@@ -5974,6 +5988,12 @@ var StreamConfigStatusMessage = schemas_exports.object({
5974
5988
  reason: schemas_exports.string().optional()
5975
5989
  });
5976
5990
 
5991
+ // node_modules/@corti/sdk/dist/esm/serialization/types/StreamDeltaUsageMessage.mjs
5992
+ var StreamDeltaUsageMessage = schemas_exports.object({
5993
+ type: schemas_exports.stringLiteral("delta_usage"),
5994
+ credits: schemas_exports.number()
5995
+ });
5996
+
5977
5997
  // node_modules/@corti/sdk/dist/esm/serialization/types/StreamEndedMessage.mjs
5978
5998
  var StreamEndedMessage = schemas_exports.object({
5979
5999
  type: schemas_exports.stringLiteral("ENDED")
@@ -6057,6 +6077,7 @@ var StreamSocketResponse = schemas_exports.undiscriminatedUnion([
6057
6077
  StreamTranscriptMessage,
6058
6078
  StreamFactsMessage,
6059
6079
  StreamFlushedMessage,
6080
+ StreamDeltaUsageMessage,
6060
6081
  StreamEndedMessage,
6061
6082
  StreamUsageMessage,
6062
6083
  StreamErrorMessage,
@@ -6079,7 +6100,13 @@ var TranscribeCommandMessage = schemas_exports.object({
6079
6100
  });
6080
6101
 
6081
6102
  // node_modules/@corti/sdk/dist/esm/serialization/types/TranscribeConfigStatusMessageType.mjs
6082
- var TranscribeConfigStatusMessageType2 = schemas_exports.enum_(["CONFIG_ACCEPTED", "CONFIG_DENIED", "CONFIG_TIMEOUT"]);
6103
+ var TranscribeConfigStatusMessageType2 = schemas_exports.enum_([
6104
+ "CONFIG_ACCEPTED",
6105
+ "CONFIG_DENIED",
6106
+ "CONFIG_TIMEOUT",
6107
+ "CONFIG_ALREADY_RECEIVED",
6108
+ "CONFIG_MISSING"
6109
+ ]);
6083
6110
 
6084
6111
  // node_modules/@corti/sdk/dist/esm/serialization/types/TranscribeConfigStatusMessage.mjs
6085
6112
  var TranscribeConfigStatusMessage = schemas_exports.object({
@@ -6088,6 +6115,12 @@ var TranscribeConfigStatusMessage = schemas_exports.object({
6088
6115
  sessionId: schemas_exports.string()
6089
6116
  });
6090
6117
 
6118
+ // node_modules/@corti/sdk/dist/esm/serialization/types/TranscribeDeltaUsageMessage.mjs
6119
+ var TranscribeDeltaUsageMessage = schemas_exports.object({
6120
+ type: schemas_exports.stringLiteral("delta_usage"),
6121
+ credits: schemas_exports.number()
6122
+ });
6123
+
6091
6124
  // node_modules/@corti/sdk/dist/esm/serialization/types/TranscribeEndedMessage.mjs
6092
6125
  var TranscribeEndedMessage = schemas_exports.object({
6093
6126
  type: schemas_exports.stringLiteral("ended")
@@ -6138,6 +6171,7 @@ var TranscribeUsageMessage = schemas_exports.object({
6138
6171
  var TranscribeSocketResponse = schemas_exports.undiscriminatedUnion([
6139
6172
  TranscribeUsageMessage,
6140
6173
  TranscribeFlushedMessage,
6174
+ TranscribeDeltaUsageMessage,
6141
6175
  TranscribeEndedMessage,
6142
6176
  TranscribeErrorMessage,
6143
6177
  TranscribeTranscriptMessage,
@@ -7521,8 +7555,8 @@ function normalizeClientOptions(options) {
7521
7555
  const headers = mergeHeaders({
7522
7556
  "X-Fern-Language": "JavaScript",
7523
7557
  "X-Fern-SDK-Name": "@corti/sdk",
7524
- "X-Fern-SDK-Version": "1.0.0-rc.5",
7525
- "User-Agent": "@corti/sdk/1.0.0-rc.5",
7558
+ "X-Fern-SDK-Version": "1.0.0",
7559
+ "User-Agent": "@corti/sdk/1.0.0",
7526
7560
  "X-Fern-Runtime": RUNTIME.type,
7527
7561
  "X-Fern-Runtime-Version": RUNTIME.version,
7528
7562
  "Tenant-Name": options === null || options === void 0 ? void 0 : options.tenantName
@@ -11829,7 +11863,7 @@ var CortiClient = class {
11829
11863
  }
11830
11864
  };
11831
11865
 
11832
- // node_modules/@corti/sdk/dist/esm/custom/utils/encodeHeadersAsWsProtocols.mjs
11866
+ // node_modules/@corti/sdk/dist/esm/custom/agents/CustomAgents.mjs
11833
11867
  var __awaiter32 = function(thisArg, _arguments, P2, generator) {
11834
11868
  function adopt(value) {
11835
11869
  return value instanceof P2 ? value : new P2(function(resolve) {
@@ -11857,8 +11891,46 @@ var __awaiter32 = function(thisArg, _arguments, P2, generator) {
11857
11891
  step((generator = generator.apply(thisArg, _arguments || [])).next());
11858
11892
  });
11859
11893
  };
11894
+ var CustomAgents = class extends AgentsClient {
11895
+ constructor() {
11896
+ super(...arguments);
11897
+ this.getCardUrl = (agentId) => __awaiter32(this, void 0, void 0, function* () {
11898
+ const encodedAgentId = encodeURIComponent(agentId);
11899
+ return new URL(`/agents/${encodedAgentId}/agent-card.json`, (yield Supplier.get(this._options.environment)).agents);
11900
+ });
11901
+ }
11902
+ };
11903
+
11904
+ // node_modules/@corti/sdk/dist/esm/custom/utils/encodeHeadersAsWsProtocols.mjs
11905
+ var __awaiter33 = function(thisArg, _arguments, P2, generator) {
11906
+ function adopt(value) {
11907
+ return value instanceof P2 ? value : new P2(function(resolve) {
11908
+ resolve(value);
11909
+ });
11910
+ }
11911
+ return new (P2 || (P2 = Promise))(function(resolve, reject) {
11912
+ function fulfilled(value) {
11913
+ try {
11914
+ step(generator.next(value));
11915
+ } catch (e10) {
11916
+ reject(e10);
11917
+ }
11918
+ }
11919
+ function rejected(value) {
11920
+ try {
11921
+ step(generator["throw"](value));
11922
+ } catch (e10) {
11923
+ reject(e10);
11924
+ }
11925
+ }
11926
+ function step(result) {
11927
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
11928
+ }
11929
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
11930
+ });
11931
+ };
11860
11932
  function buildProtocolsFromHeaders(headers_1) {
11861
- return __awaiter32(this, arguments, void 0, function* (headers, filterSdkHeaders = false) {
11933
+ return __awaiter33(this, arguments, void 0, function* (headers, filterSdkHeaders = false) {
11862
11934
  if (!headers || Object.keys(headers).length === 0) {
11863
11935
  return [];
11864
11936
  }
@@ -11876,7 +11948,7 @@ function buildProtocolsFromHeaders(headers_1) {
11876
11948
  });
11877
11949
  }
11878
11950
  function getWsProtocols(options, proxyProtocols) {
11879
- return __awaiter32(this, void 0, void 0, function* () {
11951
+ return __awaiter33(this, void 0, void 0, function* () {
11880
11952
  const headerProtocols = options.encodeHeadersAsWsProtocols && options.headers ? yield buildProtocolsFromHeaders(options.headers, true) : [];
11881
11953
  const resolvedProxy = proxyProtocols == null ? [] : Array.isArray(proxyProtocols) ? proxyProtocols : yield buildProtocolsFromHeaders(proxyProtocols, false);
11882
11954
  const combined = [...headerProtocols, ...resolvedProxy];
@@ -11911,7 +11983,7 @@ function parseStreamResponseType(raw) {
11911
11983
  }
11912
11984
 
11913
11985
  // node_modules/@corti/sdk/dist/esm/custom/stream/CustomStream.mjs
11914
- var __awaiter33 = function(thisArg, _arguments, P2, generator) {
11986
+ var __awaiter34 = function(thisArg, _arguments, P2, generator) {
11915
11987
  function adopt(value) {
11916
11988
  return value instanceof P2 ? value : new P2(function(resolve) {
11917
11989
  resolve(value);
@@ -11952,7 +12024,6 @@ var __rest3 = function(s8, e10) {
11952
12024
  var STREAM_CONFIG_REJECTION_TYPES = [
11953
12025
  StreamConfigStatusMessageType.ConfigDenied,
11954
12026
  StreamConfigStatusMessageType.ConfigMissing,
11955
- StreamConfigStatusMessageType.ConfigTimeout,
11956
12027
  StreamConfigStatusMessageType.ConfigNotProvided
11957
12028
  ];
11958
12029
  var CustomStream = class extends StreamClient {
@@ -11964,7 +12035,7 @@ var CustomStream = class extends StreamClient {
11964
12035
  const _super = Object.create(null, {
11965
12036
  connect: { get: () => super.connect }
11966
12037
  });
11967
- return __awaiter33(this, void 0, void 0, function* () {
12038
+ return __awaiter34(this, void 0, void 0, function* () {
11968
12039
  var _a, _b, _c, _d, _e, _f, _g, _h;
11969
12040
  const { configuration, awaitConfiguration = true, proxy } = args, rest = __rest3(args, ["configuration", "awaitConfiguration", "proxy"]);
11970
12041
  const useProxyPath = proxy || this._encodeHeadersAsWsProtocols;
@@ -11992,7 +12063,7 @@ var CustomStream = class extends StreamClient {
11992
12063
  * CONFIG_NOT_PROVIDED / connection error / ENDED.
11993
12064
  */
11994
12065
  _connectWithConfigAck(socket, configuration) {
11995
- return __awaiter33(this, void 0, void 0, function* () {
12066
+ return __awaiter34(this, void 0, void 0, function* () {
11996
12067
  const configAck = this._buildConfigAckPromise(socket);
11997
12068
  yield socket.waitForOpen();
11998
12069
  socket.sendConfiguration({ type: "config", configuration });
@@ -12018,7 +12089,7 @@ var CustomStream = class extends StreamClient {
12018
12089
  });
12019
12090
  socket.socket.addEventListener("message", (event) => {
12020
12091
  const type = parseStreamResponseType(event.data);
12021
- if (type == null || type === StreamConfigStatusMessageType.ConfigAccepted) {
12092
+ if (type == null || type === StreamConfigStatusMessageType.ConfigAccepted || type === StreamConfigStatusMessageType.ConfigAlreadyReceived) {
12022
12093
  return;
12023
12094
  }
12024
12095
  if (STREAM_CONFIG_REJECTION_TYPES.includes(type) || type === "error") {
@@ -12045,7 +12116,7 @@ var CustomStream = class extends StreamClient {
12045
12116
  const type = parseStreamResponseType(event.data);
12046
12117
  if (type == null)
12047
12118
  return;
12048
- if (type === StreamConfigStatusMessageType.ConfigAccepted) {
12119
+ if (type === StreamConfigStatusMessageType.ConfigAccepted || type === StreamConfigStatusMessageType.ConfigAlreadyReceived) {
12049
12120
  cleanup();
12050
12121
  resolve();
12051
12122
  } else if (STREAM_CONFIG_REJECTION_TYPES.includes(type)) {
@@ -12089,7 +12160,7 @@ function parseTranscribeResponseType(raw) {
12089
12160
  }
12090
12161
 
12091
12162
  // node_modules/@corti/sdk/dist/esm/custom/transcribe/CustomTranscribe.mjs
12092
- var __awaiter34 = function(thisArg, _arguments, P2, generator) {
12163
+ var __awaiter35 = function(thisArg, _arguments, P2, generator) {
12093
12164
  function adopt(value) {
12094
12165
  return value instanceof P2 ? value : new P2(function(resolve) {
12095
12166
  resolve(value);
@@ -12129,7 +12200,8 @@ var __rest4 = function(s8, e10) {
12129
12200
  };
12130
12201
  var TRANSCRIBE_CONFIG_REJECTION_TYPES = [
12131
12202
  TranscribeConfigStatusMessageType.ConfigDenied,
12132
- TranscribeConfigStatusMessageType.ConfigTimeout
12203
+ TranscribeConfigStatusMessageType.ConfigTimeout,
12204
+ TranscribeConfigStatusMessageType.ConfigMissing
12133
12205
  ];
12134
12206
  var CustomTranscribe = class extends TranscribeClient {
12135
12207
  constructor(options) {
@@ -12140,7 +12212,7 @@ var CustomTranscribe = class extends TranscribeClient {
12140
12212
  const _super = Object.create(null, {
12141
12213
  connect: { get: () => super.connect }
12142
12214
  });
12143
- return __awaiter34(this, void 0, void 0, function* () {
12215
+ return __awaiter35(this, void 0, void 0, function* () {
12144
12216
  var _a, _b, _c, _d, _e, _f, _g, _h;
12145
12217
  const _j = args !== null && args !== void 0 ? args : {}, { configuration, awaitConfiguration = true, proxy } = _j, rest = __rest4(_j, ["configuration", "awaitConfiguration", "proxy"]);
12146
12218
  const useProxyPath = proxy || this._encodeHeadersAsWsProtocols;
@@ -12168,7 +12240,7 @@ var CustomTranscribe = class extends TranscribeClient {
12168
12240
  * connection error / ended.
12169
12241
  */
12170
12242
  _connectWithConfigAck(socket, configuration) {
12171
- return __awaiter34(this, void 0, void 0, function* () {
12243
+ return __awaiter35(this, void 0, void 0, function* () {
12172
12244
  const configAck = this._buildConfigAckPromise(socket);
12173
12245
  yield socket.waitForOpen();
12174
12246
  socket.sendConfiguration({ type: "config", configuration });
@@ -12194,7 +12266,7 @@ var CustomTranscribe = class extends TranscribeClient {
12194
12266
  });
12195
12267
  socket.socket.addEventListener("message", (event) => {
12196
12268
  const type = parseTranscribeResponseType(event.data);
12197
- if (type == null || type === TranscribeConfigStatusMessageType.ConfigAccepted) {
12269
+ if (type == null || type === TranscribeConfigStatusMessageType.ConfigAccepted || type === TranscribeConfigStatusMessageType.ConfigAlreadyReceived) {
12198
12270
  return;
12199
12271
  }
12200
12272
  if (TRANSCRIBE_CONFIG_REJECTION_TYPES.includes(type) || type === "error") {
@@ -12221,7 +12293,7 @@ var CustomTranscribe = class extends TranscribeClient {
12221
12293
  const type = parseTranscribeResponseType(event.data);
12222
12294
  if (type == null)
12223
12295
  return;
12224
- if (type === TranscribeConfigStatusMessageType.ConfigAccepted) {
12296
+ if (type === TranscribeConfigStatusMessageType.ConfigAccepted || type === TranscribeConfigStatusMessageType.ConfigAlreadyReceived) {
12225
12297
  cleanup();
12226
12298
  resolve();
12227
12299
  } else if (TRANSCRIBE_CONFIG_REJECTION_TYPES.includes(type)) {
@@ -12298,7 +12370,7 @@ function decodeToken2(token) {
12298
12370
  }
12299
12371
 
12300
12372
  // node_modules/@corti/sdk/dist/esm/custom/utils/resolveClientOptions.mjs
12301
- var __awaiter35 = function(thisArg, _arguments, P2, generator) {
12373
+ var __awaiter36 = function(thisArg, _arguments, P2, generator) {
12302
12374
  function adopt(value) {
12303
12375
  return value instanceof P2 ? value : new P2(function(resolve) {
12304
12376
  resolve(value);
@@ -12356,7 +12428,7 @@ function resolveClientOptions(options) {
12356
12428
  };
12357
12429
  }
12358
12430
  const auth = opts.auth;
12359
- const discoveryPromise = (() => __awaiter35(this, void 0, void 0, function* () {
12431
+ const discoveryPromise = (() => __awaiter36(this, void 0, void 0, function* () {
12360
12432
  var _a;
12361
12433
  const tokenResponse = yield auth.refreshAccessToken(auth.refreshToken);
12362
12434
  const decoded = decodeToken2((_a = tokenResponse.accessToken) !== null && _a !== void 0 ? _a : "");
@@ -12377,12 +12449,44 @@ function resolveClientOptions(options) {
12377
12449
  }
12378
12450
 
12379
12451
  // node_modules/@corti/sdk/dist/esm/custom/CortiClient.mjs
12452
+ var __awaiter37 = function(thisArg, _arguments, P2, generator) {
12453
+ function adopt(value) {
12454
+ return value instanceof P2 ? value : new P2(function(resolve) {
12455
+ resolve(value);
12456
+ });
12457
+ }
12458
+ return new (P2 || (P2 = Promise))(function(resolve, reject) {
12459
+ function fulfilled(value) {
12460
+ try {
12461
+ step(generator.next(value));
12462
+ } catch (e10) {
12463
+ reject(e10);
12464
+ }
12465
+ }
12466
+ function rejected(value) {
12467
+ try {
12468
+ step(generator["throw"](value));
12469
+ } catch (e10) {
12470
+ reject(e10);
12471
+ }
12472
+ }
12473
+ function step(result) {
12474
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
12475
+ }
12476
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
12477
+ });
12478
+ };
12380
12479
  var CortiClient2 = class extends CortiClient {
12381
12480
  constructor(options) {
12382
12481
  const opts = options;
12383
12482
  const ctx = resolveClientOptions(options);
12384
12483
  const restOptions = Object.assign(Object.assign(Object.assign({}, opts), { tenantName: ctx.tenantName, environment: getEnvironment(ctx.environment) }), ctx.initialTokenResponse != null ? { initialTokenResponse: ctx.initialTokenResponse } : {});
12385
12484
  super(authToBaseOptions(opts.auth, restOptions));
12485
+ this.getAuthHeaders = () => __awaiter37(this, void 0, void 0, function* () {
12486
+ var _a;
12487
+ const req = yield this._options.authProvider.getAuthRequest();
12488
+ return new Headers(Object.assign(Object.assign({}, (_a = req.headers) !== null && _a !== void 0 ? _a : {}), { "Tenant-Name": yield Supplier.get(this._options.tenantName) }));
12489
+ });
12386
12490
  setDefaultWithCredentials(options.withCredentials);
12387
12491
  this._encodeHeadersAsWsProtocols = options.encodeHeadersAsWsProtocols;
12388
12492
  }
@@ -12398,6 +12502,10 @@ var CortiClient2 = class extends CortiClient {
12398
12502
  var _a;
12399
12503
  return (_a = this._transcribe) !== null && _a !== void 0 ? _a : this._transcribe = new CustomTranscribe(Object.assign(Object.assign({}, this._options), { encodeHeadersAsWsProtocols: this._encodeHeadersAsWsProtocols }));
12400
12504
  }
12505
+ get agents() {
12506
+ var _a;
12507
+ return (_a = this._agents) !== null && _a !== void 0 ? _a : this._agents = new CustomAgents(this._options);
12508
+ }
12401
12509
  };
12402
12510
 
12403
12511
  // node_modules/@corti/sdk/dist/esm/custom/proxy/CustomProxyStream.mjs
@@ -12744,11 +12852,10 @@ function normalizeKeybinding(keybinding) {
12744
12852
  if (!keybinding) {
12745
12853
  return null;
12746
12854
  }
12747
- const trimmed = keybinding.trim();
12748
- if (trimmed === "") {
12855
+ if (keybinding !== " " && keybinding.trim() === "") {
12749
12856
  return null;
12750
12857
  }
12751
- return normalizeKeyForKeybinding(trimmed);
12858
+ return normalizeKeyForKeybinding(keybinding);
12752
12859
  }
12753
12860
  function matchesKeybinding(event, keybinding) {
12754
12861
  const normalizedKeybinding = normalizeKeybinding(keybinding);
@@ -13413,6 +13520,9 @@ var DictationRecordingButton = class DictationRecordingButton2 extends i4 {
13413
13520
  case "usage":
13414
13521
  this.dispatchEvent(usageEvent(message));
13415
13522
  break;
13523
+ case "delta_usage":
13524
+ this.dispatchEvent(deltaUsageEvent(message));
13525
+ break;
13416
13526
  case "error":
13417
13527
  this.dispatchEvent(errorEvent(message.error));
13418
13528
  __classPrivateFieldGet7(this, _DictationRecordingButton_instances, "m", _DictationRecordingButton_handleStop).call(this);
@@ -26,7 +26,7 @@ import { KeybindingController } from "../controllers/keybinding-controller.js";
26
26
  import { MediaController } from "../controllers/media-controller.js";
27
27
  import ButtonStyles from "../styles/buttons.js";
28
28
  import RecordingButtonStyles from "../styles/recording-button.js";
29
- import { audioLevelChangedEvent, commandEvent, errorEvent, networkActivityEvent, recordingStateChangedEvent, streamClosedEvent, transcriptEvent, usageEvent, } from "../utils/events.js";
29
+ import { audioLevelChangedEvent, commandEvent, deltaUsageEvent, errorEvent, networkActivityEvent, recordingStateChangedEvent, streamClosedEvent, transcriptEvent, usageEvent, } from "../utils/events.js";
30
30
  import "./audio-visualiser.js";
31
31
  import "../icons/icons.js";
32
32
  let DictationRecordingButton = class DictationRecordingButton extends LitElement {
@@ -60,6 +60,9 @@ let DictationRecordingButton = class DictationRecordingButton extends LitElement
60
60
  case "usage":
61
61
  this.dispatchEvent(usageEvent(message));
62
62
  break;
63
+ case "delta_usage":
64
+ this.dispatchEvent(deltaUsageEvent(message));
65
+ break;
63
66
  case "error":
64
67
  this.dispatchEvent(errorEvent(message.error));
65
68
  __classPrivateFieldGet(this, _DictationRecordingButton_instances, "m", _DictationRecordingButton_handleStop).call(this);
@@ -1 +1 @@
1
- {"version":3,"file":"recording-button.js","sourceRoot":"","sources":["../../src/components/recording-button.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti, CortiAuth } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport {\n type CSSResultGroup,\n html,\n LitElement,\n type PropertyValues,\n} from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { AUDIO_CHUNK_INTERVAL_MS } from \"../constants.js\";\nimport {\n accessTokenContext,\n authConfigContext,\n debugDisplayAudioContext,\n dictationConfigContext,\n pushToTalkKeybindingContext,\n recordingStateContext,\n regionContext,\n selectedDeviceContext,\n socketProxyContext,\n socketUrlContext,\n tenantNameContext,\n toggleToTalkKeybindingContext,\n} from \"../contexts/dictation-context.js\";\nimport {\n DictationController,\n type TranscribeMessage,\n} from \"../controllers/dictation-controller.js\";\nimport { KeybindingController } from \"../controllers/keybinding-controller.js\";\nimport { MediaController } from \"../controllers/media-controller.js\";\nimport ButtonStyles from \"../styles/buttons.js\";\nimport RecordingButtonStyles from \"../styles/recording-button.js\";\nimport type { ProxyOptions, RecordingState } from \"../types.js\";\nimport {\n audioLevelChangedEvent,\n commandEvent,\n errorEvent,\n networkActivityEvent,\n type RecordingStateChangedEventDetail,\n recordingStateChangedEvent,\n streamClosedEvent,\n transcriptEvent,\n usageEvent,\n} from \"../utils/events.js\";\n\nimport \"./audio-visualiser.js\";\nimport \"../icons/icons.js\";\n\n@customElement(\"dictation-recording-button\")\nexport class DictationRecordingButton extends LitElement {\n @consume({ context: recordingStateContext, subscribe: true })\n @state()\n _recordingState: RecordingState = \"stopped\";\n\n @consume({ context: selectedDeviceContext, subscribe: true })\n @state()\n _selectedDevice?: MediaDeviceInfo;\n\n @consume({ context: accessTokenContext, subscribe: true })\n @state()\n _accessToken?: string;\n\n @consume({ context: authConfigContext, subscribe: true })\n @state()\n _authConfig?: CortiAuth.AuthTokenDerivable;\n\n @consume({ context: regionContext, subscribe: true })\n @state()\n _region?: string;\n\n @consume({ context: tenantNameContext, subscribe: true })\n @state()\n _tenantName?: string;\n\n @consume({ context: dictationConfigContext, subscribe: true })\n @state()\n _dictationConfig?: Corti.TranscribeConfig;\n\n @consume({ context: socketUrlContext, subscribe: true })\n @state()\n _socketUrl?: string;\n\n @consume({ context: socketProxyContext, subscribe: true })\n @state()\n _socketProxy?: ProxyOptions;\n\n @consume({ context: debugDisplayAudioContext, subscribe: true })\n @state()\n _debug_displayAudio?: boolean;\n\n @consume({ context: pushToTalkKeybindingContext, subscribe: true })\n @state()\n _pushToTalkKeybinding?: string | null;\n\n @consume({ context: toggleToTalkKeybindingContext, subscribe: true })\n @state()\n _toggleToTalkKeybinding?: string | null;\n\n @property({ type: Boolean })\n allowButtonFocus: boolean = false;\n\n #mediaController = new MediaController(this);\n #dictationController = new DictationController(this);\n #keybindingController = new KeybindingController(this);\n #closeConnectionOnInit = false;\n #processing = false;\n #connection: RecordingStateChangedEventDetail[\"connection\"] = \"CLOSED\";\n\n static styles: CSSResultGroup = [RecordingButtonStyles, ButtonStyles];\n\n protected update(changedProperties: PropertyValues) {\n if (\n changedProperties.has(\"_recordingState\") &&\n this._recordingState === \"recording\" &&\n this.#closeConnectionOnInit\n ) {\n this.#closeConnectionOnInit = false;\n this.#handleStop();\n }\n\n super.update(changedProperties);\n }\n\n #handleClick(event: MouseEvent): void {\n if (!this.allowButtonFocus) {\n event.preventDefault();\n }\n\n this.toggleRecording();\n }\n\n #handleWebSocketMessage = (message: TranscribeMessage): void => {\n switch (message.type) {\n case \"CONFIG_DENIED\":\n this.dispatchEvent(\n errorEvent(`Config denied: ${message.reason ?? \"Unknown reason\"}`),\n );\n this.#handleStop();\n break;\n case \"CONFIG_TIMEOUT\":\n this.dispatchEvent(errorEvent(\"Config timeout\"));\n this.#handleStop();\n break;\n case \"transcript\":\n this.dispatchEvent(transcriptEvent(message));\n break;\n case \"command\":\n this.dispatchEvent(commandEvent(message));\n break;\n case \"usage\":\n this.dispatchEvent(usageEvent(message));\n break;\n case \"error\":\n this.dispatchEvent(errorEvent(message.error));\n this.#handleStop();\n break;\n case \"flushed\":\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n this.#processing = false;\n this.#dispatchRecordingStateChanged(this._recordingState);\n }\n break;\n }\n };\n\n #handleWebSocketError = (error: Error): void => {\n this.dispatchEvent(errorEvent(\"Socket error: \" + error.message));\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.#handleStop();\n };\n\n #handleWebSocketClose = (event: unknown): void => {\n // When we already have new socket opened\n if (\n this.#dictationController.isConnectionOpen() ||\n this.#dictationController.isConnecting()\n ) {\n return;\n }\n\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.dispatchEvent(streamClosedEvent(event));\n this.#dispatchRecordingStateChanged(this._recordingState);\n };\n\n #dispatchRecordingStateChanged(state: RecordingState): void {\n this.dispatchEvent(\n recordingStateChangedEvent(state, {\n connection: this.#connection,\n processing: this.#processing,\n }),\n );\n }\n\n async #handleStart(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"initializing\");\n\n try {\n await this.#mediaController.initialize(() => {\n if (this._recordingState === \"recording\") {\n this.dispatchEvent(errorEvent(\"Recording device access was lost.\"));\n this.#handleStop();\n }\n }, this.#dictationController.mediaRecorderHandler);\n this.#mediaController.mediaRecorder?.start(AUDIO_CHUNK_INTERVAL_MS);\n this.#mediaController.startAudioLevelMonitoring((level) => {\n this.dispatchEvent(audioLevelChangedEvent(level));\n });\n\n this.#processing = true;\n\n if (this.#connection !== \"OPEN\") {\n this.#connection = \"CONNECTING\";\n }\n\n this.#dispatchRecordingStateChanged(\"recording\");\n\n const isNewConnection = await this.#dictationController.connect(\n this._dictationConfig,\n {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n },\n );\n\n if (isNewConnection === \"superseded\") {\n return;\n }\n\n this.#connection = \"OPEN\";\n\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n await this.#handleStop();\n }\n }\n\n async #handleStop(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"stopping\");\n\n try {\n this.#mediaController.stopAudioLevelMonitoring();\n await this.#mediaController.stopRecording();\n\n this.#dispatchRecordingStateChanged(\"stopped\");\n\n await this.#dictationController.pause();\n await this.#mediaController.cleanup();\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n public startRecording(): void {\n if (this._recordingState !== \"stopped\") {\n return;\n }\n\n this.#handleStart();\n }\n\n public stopRecording(): void {\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n return;\n }\n\n if (this._recordingState === \"initializing\") {\n this.#closeConnectionOnInit = true;\n return;\n }\n\n this.#handleStop();\n }\n\n public toggleRecording(): void {\n if (this._recordingState === \"stopped\") {\n this.startRecording();\n } else if (this._recordingState === \"recording\") {\n this.stopRecording();\n }\n }\n\n public async openConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this.#dictationController.isConnectionOpen()) {\n return;\n }\n\n try {\n this.#connection = \"CONNECTING\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n\n await this.#dictationController.connect(this._dictationConfig, {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n });\n\n this.#connection = \"OPEN\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.#connection = \"CLOSED\";\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n public async closeConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this.#dictationController.isConnecting()) {\n await this.#dictationController.waitForConnection();\n }\n\n if (!this.#dictationController.isConnectionOpen()) {\n this.#connection = \"CLOSED\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n return;\n }\n\n try {\n this.#connection = \"CLOSING\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n await this.#dictationController.closeConnection(\n this.#handleWebSocketClose,\n );\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n render() {\n const isLoading =\n this._recordingState === \"initializing\" ||\n this._recordingState === \"stopping\";\n const isRecording = this._recordingState === \"recording\";\n\n return html`\n <button\n @click=${this.#handleClick}\n ?disabled=${isLoading}\n class=${isRecording ? \"red\" : \"accent\"}\n aria-label=${isRecording ? \"Stop recording\" : \"Start recording\"}\n aria-pressed=${isRecording}\n >\n ${\n isLoading\n ? html`<icon-loading-spinner />`\n : isRecording\n ? html`<icon-recording />`\n : html`<icon-mic-on />`\n }\n <dictation-audio-visualiser\n .level=${this.#mediaController.audioLevel}\n ?active=${isRecording}\n />\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-recording-button\": DictationRecordingButton;\n }\n}\n"]}
1
+ {"version":3,"file":"recording-button.js","sourceRoot":"","sources":["../../src/components/recording-button.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Corti, CortiAuth } from \"@corti/sdk\";\nimport { consume } from \"@lit/context\";\nimport {\n type CSSResultGroup,\n html,\n LitElement,\n type PropertyValues,\n} from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { AUDIO_CHUNK_INTERVAL_MS } from \"../constants.js\";\nimport {\n accessTokenContext,\n authConfigContext,\n debugDisplayAudioContext,\n dictationConfigContext,\n pushToTalkKeybindingContext,\n recordingStateContext,\n regionContext,\n selectedDeviceContext,\n socketProxyContext,\n socketUrlContext,\n tenantNameContext,\n toggleToTalkKeybindingContext,\n} from \"../contexts/dictation-context.js\";\nimport {\n DictationController,\n type TranscribeMessage,\n} from \"../controllers/dictation-controller.js\";\nimport { KeybindingController } from \"../controllers/keybinding-controller.js\";\nimport { MediaController } from \"../controllers/media-controller.js\";\nimport ButtonStyles from \"../styles/buttons.js\";\nimport RecordingButtonStyles from \"../styles/recording-button.js\";\nimport type { ProxyOptions, RecordingState } from \"../types.js\";\nimport {\n audioLevelChangedEvent,\n commandEvent,\n deltaUsageEvent,\n errorEvent,\n networkActivityEvent,\n type RecordingStateChangedEventDetail,\n recordingStateChangedEvent,\n streamClosedEvent,\n transcriptEvent,\n usageEvent,\n} from \"../utils/events.js\";\n\nimport \"./audio-visualiser.js\";\nimport \"../icons/icons.js\";\n\n@customElement(\"dictation-recording-button\")\nexport class DictationRecordingButton extends LitElement {\n @consume({ context: recordingStateContext, subscribe: true })\n @state()\n _recordingState: RecordingState = \"stopped\";\n\n @consume({ context: selectedDeviceContext, subscribe: true })\n @state()\n _selectedDevice?: MediaDeviceInfo;\n\n @consume({ context: accessTokenContext, subscribe: true })\n @state()\n _accessToken?: string;\n\n @consume({ context: authConfigContext, subscribe: true })\n @state()\n _authConfig?: CortiAuth.AuthTokenDerivable;\n\n @consume({ context: regionContext, subscribe: true })\n @state()\n _region?: string;\n\n @consume({ context: tenantNameContext, subscribe: true })\n @state()\n _tenantName?: string;\n\n @consume({ context: dictationConfigContext, subscribe: true })\n @state()\n _dictationConfig?: Corti.TranscribeConfig;\n\n @consume({ context: socketUrlContext, subscribe: true })\n @state()\n _socketUrl?: string;\n\n @consume({ context: socketProxyContext, subscribe: true })\n @state()\n _socketProxy?: ProxyOptions;\n\n @consume({ context: debugDisplayAudioContext, subscribe: true })\n @state()\n _debug_displayAudio?: boolean;\n\n @consume({ context: pushToTalkKeybindingContext, subscribe: true })\n @state()\n _pushToTalkKeybinding?: string | null;\n\n @consume({ context: toggleToTalkKeybindingContext, subscribe: true })\n @state()\n _toggleToTalkKeybinding?: string | null;\n\n @property({ type: Boolean })\n allowButtonFocus: boolean = false;\n\n #mediaController = new MediaController(this);\n #dictationController = new DictationController(this);\n #keybindingController = new KeybindingController(this);\n #closeConnectionOnInit = false;\n #processing = false;\n #connection: RecordingStateChangedEventDetail[\"connection\"] = \"CLOSED\";\n\n static styles: CSSResultGroup = [RecordingButtonStyles, ButtonStyles];\n\n protected update(changedProperties: PropertyValues) {\n if (\n changedProperties.has(\"_recordingState\") &&\n this._recordingState === \"recording\" &&\n this.#closeConnectionOnInit\n ) {\n this.#closeConnectionOnInit = false;\n this.#handleStop();\n }\n\n super.update(changedProperties);\n }\n\n #handleClick(event: MouseEvent): void {\n if (!this.allowButtonFocus) {\n event.preventDefault();\n }\n\n this.toggleRecording();\n }\n\n #handleWebSocketMessage = (message: TranscribeMessage): void => {\n switch (message.type) {\n case \"CONFIG_DENIED\":\n this.dispatchEvent(\n errorEvent(`Config denied: ${message.reason ?? \"Unknown reason\"}`),\n );\n this.#handleStop();\n break;\n case \"CONFIG_TIMEOUT\":\n this.dispatchEvent(errorEvent(\"Config timeout\"));\n this.#handleStop();\n break;\n case \"transcript\":\n this.dispatchEvent(transcriptEvent(message));\n break;\n case \"command\":\n this.dispatchEvent(commandEvent(message));\n break;\n case \"usage\":\n this.dispatchEvent(usageEvent(message));\n break;\n case \"delta_usage\":\n this.dispatchEvent(deltaUsageEvent(message));\n break;\n case \"error\":\n this.dispatchEvent(errorEvent(message.error));\n this.#handleStop();\n break;\n case \"flushed\":\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n this.#processing = false;\n this.#dispatchRecordingStateChanged(this._recordingState);\n }\n break;\n }\n };\n\n #handleWebSocketError = (error: Error): void => {\n this.dispatchEvent(errorEvent(\"Socket error: \" + error.message));\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.#handleStop();\n };\n\n #handleWebSocketClose = (event: unknown): void => {\n // When we already have new socket opened\n if (\n this.#dictationController.isConnectionOpen() ||\n this.#dictationController.isConnecting()\n ) {\n return;\n }\n\n this.#processing = false;\n this.#connection = \"CLOSED\";\n this.dispatchEvent(streamClosedEvent(event));\n this.#dispatchRecordingStateChanged(this._recordingState);\n };\n\n #dispatchRecordingStateChanged(state: RecordingState): void {\n this.dispatchEvent(\n recordingStateChangedEvent(state, {\n connection: this.#connection,\n processing: this.#processing,\n }),\n );\n }\n\n async #handleStart(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"initializing\");\n\n try {\n await this.#mediaController.initialize(() => {\n if (this._recordingState === \"recording\") {\n this.dispatchEvent(errorEvent(\"Recording device access was lost.\"));\n this.#handleStop();\n }\n }, this.#dictationController.mediaRecorderHandler);\n this.#mediaController.mediaRecorder?.start(AUDIO_CHUNK_INTERVAL_MS);\n this.#mediaController.startAudioLevelMonitoring((level) => {\n this.dispatchEvent(audioLevelChangedEvent(level));\n });\n\n this.#processing = true;\n\n if (this.#connection !== \"OPEN\") {\n this.#connection = \"CONNECTING\";\n }\n\n this.#dispatchRecordingStateChanged(\"recording\");\n\n const isNewConnection = await this.#dictationController.connect(\n this._dictationConfig,\n {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n },\n );\n\n if (isNewConnection === \"superseded\") {\n return;\n }\n\n this.#connection = \"OPEN\";\n\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n await this.#handleStop();\n }\n }\n\n async #handleStop(): Promise<void> {\n this.#dispatchRecordingStateChanged(\"stopping\");\n\n try {\n this.#mediaController.stopAudioLevelMonitoring();\n await this.#mediaController.stopRecording();\n\n this.#dispatchRecordingStateChanged(\"stopped\");\n\n await this.#dictationController.pause();\n await this.#mediaController.cleanup();\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n public startRecording(): void {\n if (this._recordingState !== \"stopped\") {\n return;\n }\n\n this.#handleStart();\n }\n\n public stopRecording(): void {\n if (\n this._recordingState === \"stopped\" ||\n this._recordingState === \"stopping\"\n ) {\n return;\n }\n\n if (this._recordingState === \"initializing\") {\n this.#closeConnectionOnInit = true;\n return;\n }\n\n this.#handleStop();\n }\n\n public toggleRecording(): void {\n if (this._recordingState === \"stopped\") {\n this.startRecording();\n } else if (this._recordingState === \"recording\") {\n this.stopRecording();\n }\n }\n\n public async openConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this.#dictationController.isConnectionOpen()) {\n return;\n }\n\n try {\n this.#connection = \"CONNECTING\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n\n await this.#dictationController.connect(this._dictationConfig, {\n onClose: this.#handleWebSocketClose,\n onError: this.#handleWebSocketError,\n onMessage: this.#handleWebSocketMessage,\n onNetworkActivity: (direction, data) => {\n this.dispatchEvent(networkActivityEvent(direction, data));\n },\n });\n\n this.#connection = \"OPEN\";\n this.#dispatchRecordingStateChanged(this._recordingState);\n } catch (error) {\n this.#connection = \"CLOSED\";\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n public async closeConnection(): Promise<void> {\n if (this._recordingState !== \"stopped\" || this.#processing) {\n return;\n }\n\n if (this.#dictationController.isConnecting()) {\n await this.#dictationController.waitForConnection();\n }\n\n if (!this.#dictationController.isConnectionOpen()) {\n this.#connection = \"CLOSED\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n return;\n }\n\n try {\n this.#connection = \"CLOSING\";\n this.#dispatchRecordingStateChanged(\"stopped\");\n await this.#dictationController.closeConnection(\n this.#handleWebSocketClose,\n );\n } catch (error) {\n this.dispatchEvent(errorEvent(error));\n }\n }\n\n render() {\n const isLoading =\n this._recordingState === \"initializing\" ||\n this._recordingState === \"stopping\";\n const isRecording = this._recordingState === \"recording\";\n\n return html`\n <button\n @click=${this.#handleClick}\n ?disabled=${isLoading}\n class=${isRecording ? \"red\" : \"accent\"}\n aria-label=${isRecording ? \"Stop recording\" : \"Start recording\"}\n aria-pressed=${isRecording}\n >\n ${\n isLoading\n ? html`<icon-loading-spinner />`\n : isRecording\n ? html`<icon-recording />`\n : html`<icon-mic-on />`\n }\n <dictation-audio-visualiser\n .level=${this.#mediaController.audioLevel}\n ?active=${isRecording}\n />\n </button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"dictation-recording-button\": DictationRecordingButton;\n }\n}\n"]}
@@ -11,7 +11,7 @@ interface DictationControllerHost extends ReactiveControllerHost {
11
11
  _socketProxy?: ProxyOptions;
12
12
  _dictationConfig?: Corti.TranscribeConfig;
13
13
  }
14
- export type TranscribeMessage = Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage | Corti.TranscribeEndedMessage | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage | Corti.TranscribeFlushedMessage;
14
+ export type TranscribeMessage = Corti.TranscribeConfigStatusMessage | Corti.TranscribeUsageMessage | Corti.TranscribeDeltaUsageMessage | Corti.TranscribeEndedMessage | Corti.TranscribeErrorMessage | Corti.TranscribeTranscriptMessage | Corti.TranscribeCommandMessage | Corti.TranscribeFlushedMessage;
15
15
  interface WebSocketCallbacks {
16
16
  onMessage?: (message: TranscribeMessage) => void;
17
17
  onError?: (error: Error) => void;