@almaviacx/gge-toolkit-service 2.9.1 → 2.9.3

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.
Files changed (43) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.js +2 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/models/CallTask.d.ts +11 -0
  5. package/dist/models/CallTask.js +3 -0
  6. package/dist/models/CallTask.js.map +1 -0
  7. package/dist/models/Context.d.ts +1 -0
  8. package/dist/models/index.d.ts +1 -0
  9. package/dist/models/index.js +1 -0
  10. package/dist/models/index.js.map +1 -1
  11. package/dist/tests/almavia-twilio-runtime.js +49 -76
  12. package/dist/tests/almavia-twilio-runtime.js.map +1 -1
  13. package/dist/tests/twilio-runtime.d.ts +1 -1
  14. package/dist/tests/twilio-runtime.js +34 -34
  15. package/dist/tests/twilio-runtime.js.map +1 -1
  16. package/dist/utils/__tests__/callreason.test.js +30 -93
  17. package/dist/utils/__tests__/callreason.test.js.map +1 -1
  18. package/dist/utils/__tests__/message.test.js +10 -10
  19. package/dist/utils/__tests__/message.test.js.map +1 -1
  20. package/dist/utils/__tests__/phonenumber.test.js +45 -119
  21. package/dist/utils/__tests__/phonenumber.test.js.map +1 -1
  22. package/dist/utils/__tests__/video.test.js +35 -110
  23. package/dist/utils/__tests__/video.test.js.map +1 -1
  24. package/dist/utils/calendar.js +71 -133
  25. package/dist/utils/calendar.js.map +1 -1
  26. package/dist/utils/callreason.js +41 -113
  27. package/dist/utils/callreason.js.map +1 -1
  28. package/dist/utils/conversation.js +37 -93
  29. package/dist/utils/conversation.js.map +1 -1
  30. package/dist/utils/flexFlows.js +60 -130
  31. package/dist/utils/flexFlows.js.map +1 -1
  32. package/dist/utils/message.js +9 -9
  33. package/dist/utils/message.js.map +1 -1
  34. package/dist/utils/phonenumber.js +72 -142
  35. package/dist/utils/phonenumber.js.map +1 -1
  36. package/dist/utils/video.js +85 -167
  37. package/dist/utils/video.js.map +1 -1
  38. package/dist/utils/voiceCall.d.ts +8 -0
  39. package/dist/utils/voiceCall.js +168 -0
  40. package/dist/utils/voiceCall.js.map +1 -0
  41. package/dist/utils/worker.js +77 -170
  42. package/dist/utils/worker.js.map +1 -1
  43. package/package.json +3 -5
@@ -22,179 +22,97 @@ var __importStar = (this && this.__importStar) || function (mod) {
22
22
  __setModuleDefault(result, mod);
23
23
  return result;
24
24
  };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __generator = (this && this.__generator) || function (thisArg, body) {
35
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
- function verb(n) { return function (v) { return step([n, v]); }; }
38
- function step(op) {
39
- if (f) throw new TypeError("Generator is already executing.");
40
- while (_) try {
41
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
- if (y = 0, t) op = [op[0] & 2, t.value];
43
- switch (op[0]) {
44
- case 0: case 1: t = op; break;
45
- case 4: _.label++; return { value: op[1], done: false };
46
- case 5: _.label++; y = op[1]; op = [0]; continue;
47
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
- default:
49
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
- if (t[2]) _.ops.pop();
54
- _.trys.pop(); continue;
55
- }
56
- op = body.call(thisArg, _);
57
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
- }
60
- };
61
25
  Object.defineProperty(exports, "__esModule", { value: true });
62
26
  exports.getVideoUrlTemplated = exports.saveVideoData = exports.findVideoUiBaseUrl = void 0;
63
- var mustache = __importStar(require("mustache"));
64
- var nanoid_1 = require("nanoid");
65
- var findVideoUiBaseUrl = function (context) { return __awaiter(void 0, void 0, void 0, function () {
66
- var client, SERVICE_MISC, DOC_CFG, doc, serviceList, service, envList;
27
+ const mustache = __importStar(require("mustache"));
28
+ const nanoid_1 = require("nanoid");
29
+ const findVideoUiBaseUrl = async (context) => {
67
30
  var _a, _b;
68
- return __generator(this, function (_c) {
69
- switch (_c.label) {
70
- case 0:
71
- client = context.getTwilioClient();
72
- SERVICE_MISC = context.SERVICE_MISC, DOC_CFG = context.DOC_CFG;
73
- return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch()];
74
- case 1:
75
- doc = _c.sent();
76
- if (doc && ((_b = (_a = doc.data) === null || _a === void 0 ? void 0 : _a.video) === null || _b === void 0 ? void 0 : _b.userInterfaceUrl)) {
77
- return [2 /*return*/, doc.data.video.userInterfaceUrl];
78
- }
79
- return [4 /*yield*/, client.serverless.v1.services.list()];
80
- case 2:
81
- serviceList = _c.sent();
82
- service = serviceList.find(function (s) { return s.uniqueName === "gge-ui-video"; });
83
- if (!service) {
84
- throw "no service gge-ui-video found";
85
- }
86
- return [4 /*yield*/, client.serverless.v1.services(service.sid).environments.list()];
87
- case 3:
88
- envList = _c.sent();
89
- return [2 /*return*/, "https://".concat(envList[0].domainName)];
90
- }
91
- });
92
- }); };
31
+ const client = context.getTwilioClient();
32
+ const { SERVICE_MISC, DOC_CFG } = context;
33
+ const doc = await client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch();
34
+ if (doc && ((_b = (_a = doc.data) === null || _a === void 0 ? void 0 : _a.video) === null || _b === void 0 ? void 0 : _b.userInterfaceUrl)) {
35
+ return doc.data.video.userInterfaceUrl;
36
+ }
37
+ const serviceList = await client.serverless.v1.services.list();
38
+ const service = serviceList.find((s) => s.uniqueName === "gge-ui-video");
39
+ if (!service) {
40
+ throw "no service gge-ui-video found";
41
+ }
42
+ const envList = await client.serverless.v1.services(service.sid).environments.list();
43
+ return `https://${envList[0].domainName}`;
44
+ };
93
45
  exports.findVideoUiBaseUrl = findVideoUiBaseUrl;
94
- var getVideoLinkTtl = function (context, attributes, taskCreated) { return __awaiter(void 0, void 0, void 0, function () {
95
- var client, SERVICE_MISC, DOC_CFG, doc, dateEnd, now;
46
+ const getVideoLinkTtl = async (context, attributes, taskCreated) => {
96
47
  var _a;
97
- return __generator(this, function (_b) {
98
- switch (_b.label) {
99
- case 0:
100
- if (!(attributes.direction === "inbound" || taskCreated)) return [3 /*break*/, 2];
101
- client = context.getTwilioClient();
102
- SERVICE_MISC = context.SERVICE_MISC, DOC_CFG = context.DOC_CFG;
103
- return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch()];
104
- case 1:
105
- doc = _b.sent();
106
- return [2 /*return*/, doc && ((_a = doc.data.video) === null || _a === void 0 ? void 0 : _a.outboundValidity) ? doc.data.video.outboundValidity * 60 : 3600]; /* 1 hour */
107
- case 2:
108
- if (attributes.dateRangeEnd) {
109
- dateEnd = new Date(attributes.dateRangeEnd).getTime();
110
- now = new Date().getTime();
111
- return [2 /*return*/, Math.round((dateEnd - now) / 1000)];
112
- }
113
- else {
114
- return [2 /*return*/, 3600];
115
- }
116
- _b.label = 3;
117
- case 3: return [2 /*return*/];
118
- }
119
- });
120
- }); };
121
- var saveVideoData = function (context, attributes, taskCreated, workflowSid, prevKey) { return __awaiter(void 0, void 0, void 0, function () {
122
- var logger, client, SERVICE_MISC, MAP_VIDEO, ttlTask, key, data, error_1, ttl;
123
- return __generator(this, function (_a) {
124
- switch (_a.label) {
125
- case 0:
126
- logger = context.logger;
127
- client = context.getTwilioClient();
128
- SERVICE_MISC = context.SERVICE_MISC, MAP_VIDEO = context.MAP_VIDEO;
129
- ttlTask = getVideoLinkTtl(context, attributes, taskCreated);
130
- key = prevKey || (0, nanoid_1.nanoid)(6);
131
- if (!!prevKey) return [3 /*break*/, 6];
132
- _a.label = 1;
133
- case 1:
134
- key = (0, nanoid_1.nanoid)(6);
135
- _a.label = 2;
136
- case 2:
137
- _a.trys.push([2, 4, , 5]);
138
- return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems(key).fetch()];
139
- case 3:
140
- data = _a.sent();
141
- return [3 /*break*/, 5];
142
- case 4:
143
- error_1 = _a.sent();
144
- return [3 /*break*/, 5];
145
- case 5:
146
- if (data != null) return [3 /*break*/, 1];
147
- _a.label = 6;
148
- case 6:
149
- if (!workflowSid) {
150
- data = { attributes: attributes, taskCreated: taskCreated };
151
- }
152
- else if (typeof workflowSid === "string") {
153
- data = { attributes: attributes, taskCreated: taskCreated, workflowSid: workflowSid };
154
- }
155
- else {
156
- // pour compatibilité avec versions précédentes
157
- data = { attributes: attributes, taskCreated: taskCreated, flowSid: workflowSid.sid, flowName: workflowSid.friendlyName };
158
- }
159
- return [4 /*yield*/, ttlTask];
160
- case 7:
161
- ttl = _a.sent();
162
- logger.info("Save video data with key ".concat(key, " with an availability of ").concat(ttl, " seconds"), attributes);
163
- if (!prevKey) return [3 /*break*/, 9];
164
- return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems(key).update({ data: data, ttl: ttl })];
165
- case 8:
166
- _a.sent();
167
- return [3 /*break*/, 11];
168
- case 9: return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems.create({ key: key, data: data, ttl: ttl })];
169
- case 10:
170
- _a.sent();
171
- _a.label = 11;
172
- case 11: return [2 /*return*/, key];
173
- }
174
- });
175
- }); };
48
+ if (attributes.direction === "inbound" || taskCreated) {
49
+ // on prend le temps configuré
50
+ const client = context.getTwilioClient();
51
+ const { SERVICE_MISC, DOC_CFG } = context;
52
+ const doc = await client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch();
53
+ return doc && ((_a = doc.data.video) === null || _a === void 0 ? void 0 : _a.outboundValidity) ? doc.data.video.outboundValidity * 60 : 3600; /* 1 hour */
54
+ }
55
+ else if (attributes.dateRangeEnd) {
56
+ // rdv, on prend la date de fin du rdv
57
+ const dateEnd = new Date(attributes.dateRangeEnd).getTime();
58
+ const now = new Date().getTime();
59
+ return Math.round((dateEnd - now) / 1000);
60
+ }
61
+ else {
62
+ return 3600;
63
+ }
64
+ };
65
+ const saveVideoData = async (context, attributes, taskCreated, workflowSid, prevKey) => {
66
+ const { logger } = context;
67
+ const client = context.getTwilioClient();
68
+ const { SERVICE_MISC, MAP_VIDEO } = context;
69
+ const ttlTask = getVideoLinkTtl(context, attributes, taskCreated);
70
+ let key = prevKey || (0, nanoid_1.nanoid)(6);
71
+ let data;
72
+ if (!prevKey) {
73
+ do {
74
+ key = (0, nanoid_1.nanoid)(6);
75
+ try {
76
+ data = await client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems(key).fetch();
77
+ // eslint-disable-next-line no-empty
78
+ }
79
+ catch (error) { }
80
+ } while (data != null);
81
+ }
82
+ if (!workflowSid) {
83
+ data = { attributes, taskCreated };
84
+ }
85
+ else if (typeof workflowSid === "string") {
86
+ data = { attributes, taskCreated, workflowSid };
87
+ }
88
+ else {
89
+ // pour compatibilité avec versions précédentes
90
+ data = { attributes, taskCreated, flowSid: workflowSid.sid, flowName: workflowSid.friendlyName };
91
+ }
92
+ const ttl = await ttlTask;
93
+ logger.info(`Save video data with key ${key} with an availability of ${ttl} seconds`, attributes);
94
+ if (prevKey) {
95
+ await client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems(key).update({ data, ttl });
96
+ }
97
+ else {
98
+ await client.sync.v1.services(SERVICE_MISC).syncMaps(MAP_VIDEO).syncMapItems.create({ key, data, ttl });
99
+ }
100
+ return key;
101
+ };
176
102
  exports.saveVideoData = saveVideoData;
177
- var getVideoUrlTemplated = function (context, url) { return __awaiter(void 0, void 0, void 0, function () {
178
- var SERVICE_MISC, DOC_CFG, client, doc;
103
+ const getVideoUrlTemplated = async (context, url) => {
179
104
  var _a;
180
- return __generator(this, function (_b) {
181
- switch (_b.label) {
182
- case 0:
183
- SERVICE_MISC = context.SERVICE_MISC, DOC_CFG = context.DOC_CFG;
184
- client = context.getTwilioClient();
185
- return [4 /*yield*/, client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch()];
186
- case 1:
187
- doc = _b.sent();
188
- if (doc && ((_a = doc.data.video) === null || _a === void 0 ? void 0 : _a.template)) {
189
- return [2 /*return*/, mustache.render(doc.data.video.template, {
190
- attributes: {
191
- url: url,
192
- },
193
- })];
194
- }
195
- return [2 /*return*/, url];
196
- }
197
- });
198
- }); };
105
+ const { SERVICE_MISC, DOC_CFG } = context;
106
+ const client = context.getTwilioClient();
107
+ const doc = await client.sync.v1.services(SERVICE_MISC).documents(DOC_CFG).fetch();
108
+ if (doc && ((_a = doc.data.video) === null || _a === void 0 ? void 0 : _a.template)) {
109
+ return mustache.render(doc.data.video.template, {
110
+ attributes: {
111
+ url,
112
+ },
113
+ });
114
+ }
115
+ return url;
116
+ };
199
117
  exports.getVideoUrlTemplated = getVideoUrlTemplated;
200
118
  //# sourceMappingURL=video.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/utils/video.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/utils/video.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Context, CallTask } from "../models";
2
+ export declare const createVoiceCall: (context: Context, callData: CallTask, voiceCallMediaProvider: string) => Promise<{
3
+ voiceCallId: any;
4
+ uploadUrl: any;
5
+ } | undefined>;
6
+ export declare const uploadRecording: (context: Context, uploadUrl: string, recordingURL: string) => Promise<void>;
7
+ export declare const updateVoiceCall: (context: Context, voiceCallId: string, data: any) => Promise<void>;
8
+ export declare const updateVoiceCallTranscription: (context: Context, voiceCallId: string, voiceCallField: string, transcriptSid: string) => Promise<void>;
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateVoiceCallTranscription = exports.updateVoiceCall = exports.uploadRecording = exports.createVoiceCall = void 0;
4
+ const twilio_toolkit_service_1 = require("@almaviacx/twilio-toolkit-service");
5
+ const getUserId = async (context, client, callData) => {
6
+ const { logger } = context;
7
+ const workerSid = callData.workerSid;
8
+ const workerEmail = callData.workerEmail;
9
+ let data = undefined;
10
+ let cacheExisting = false;
11
+ logger.info(`[sf_voicecall] Get user Id for ${workerSid}/${workerEmail}`);
12
+ try {
13
+ const workerCache = await client.sync.v1
14
+ .services(context.SERVICE_MISC)
15
+ .syncMaps(context.MAP_EMAIL)
16
+ .syncMapItems(workerEmail)
17
+ .fetch();
18
+ data = workerCache.data;
19
+ cacheExisting = true;
20
+ }
21
+ catch (error) {
22
+ logger.debug(`[sf_voicecall] Can't read cache for ${workerEmail}`, error);
23
+ data = { sid: workerSid };
24
+ }
25
+ if (data.sfId) {
26
+ logger.debug(`[sf_voicecall] SF user id loaded from cache for ${workerEmail} : ${data.sfId}`);
27
+ return data.sfId;
28
+ }
29
+ try {
30
+ const query = encodeURIComponent(`Select Id FROM User WHERE CORE_FLEX_Twilio_SID__c='${workerSid}'`);
31
+ const callResult = await twilio_toolkit_service_1.callSfdc.callApi(`services/data/v57.0/query?q=${query}`, context, {}, 30000, "get", false);
32
+ if (callResult && callResult.records && callResult.records.length) {
33
+ data.sfId = callResult.records[0].Id;
34
+ }
35
+ else {
36
+ logger.error(`[sf_voicecall] No user id found in SF for ${workerSid}`);
37
+ return undefined;
38
+ }
39
+ }
40
+ catch (error) {
41
+ logger.error("[sf_voicecall] Error getting user id in SF", error);
42
+ return undefined;
43
+ }
44
+ try {
45
+ if (cacheExisting) {
46
+ await client.sync.v1
47
+ .services(context.SERVICE_MISC)
48
+ .syncMaps(context.MAP_EMAIL)
49
+ .syncMapItems(workerEmail)
50
+ .update({ data });
51
+ logger.debug(`[sf_voicecall] Cache updated for ${workerEmail} : ${data.sfId}`);
52
+ }
53
+ else {
54
+ await client.sync.v1
55
+ .services(context.SERVICE_MISC)
56
+ .syncMaps(context.MAP_EMAIL)
57
+ .syncMapItems.create({ key: workerEmail, data, ttl: 24 * 60 * 60 });
58
+ logger.debug(`[sf_voicecall] Cache created for ${workerEmail} : ${data.sfId}`);
59
+ }
60
+ }
61
+ catch (error) {
62
+ logger.error(`[sf_voicecall] Can't update cache for ${workerEmail}`, error);
63
+ }
64
+ return data.sfId;
65
+ };
66
+ const getRecording = async (context, client, callData) => {
67
+ const { logger } = context;
68
+ const recordingSid = callData.recordingSid;
69
+ if (!recordingSid) {
70
+ const dateCreated = new Date();
71
+ const dateUpdated = new Date();
72
+ dateCreated.setSeconds(dateCreated.getSeconds() - 1);
73
+ return {
74
+ dateCreated,
75
+ dateUpdated,
76
+ duration: 1
77
+ };
78
+ }
79
+ const recording = await client.recordings(recordingSid).fetch();
80
+ if (recording.status !== 'completed') {
81
+ logger.debug(`[sf_voicecall] Recording ${recordingSid} is not completed. Waiting for completion...`, recording);
82
+ await twilio_toolkit_service_1.miscUtils.sleep(1000);
83
+ return await getRecording(context, client, callData);
84
+ }
85
+ logger.info(`[sf_voicecall] Get recording ${recordingSid}`, recording);
86
+ return recording;
87
+ };
88
+ const createVoiceCall = async (context, callData, voiceCallMediaProvider) => {
89
+ const client = context.getTwilioClient();
90
+ const { logger } = context;
91
+ try {
92
+ const [recording, userId] = await Promise.all([
93
+ getRecording(context, client, callData),
94
+ getUserId(context, client, callData)
95
+ ]);
96
+ const userData = userId ? { userId } : { userEmail: callData.workerEmail };
97
+ const recMode = context.REC_MODE || "mono";
98
+ const voicecallsData = {
99
+ calls: [
100
+ Object.assign({ toPhoneNumber: callData.toPhoneNumber, fromPhoneNumber: callData.fromPhoneNumber, startDateTime: recording.dateCreated.toISOString(), endDateTime: recording.dateUpdated.toISOString(), callType: callData.callType, recordingDuration: recording.duration > 0 ? recording.duration : 1, numberChannels: recMode === "mono" ? 1 : 2, externalId: callData.externalId, recordingFormat: "mp3", recordId: callData.recordId, mediaProviderId: voiceCallMediaProvider }, userData)
101
+ ]
102
+ };
103
+ logger.info("[sf_voicecall] Send voice call", voicecallsData);
104
+ const result = await twilio_toolkit_service_1.callSfdc.callApi("services/data/v64.0/voicecalls", context, voicecallsData, 30000, "post", false);
105
+ logger.info("[sf_voicecall] Send voice call result", result);
106
+ if (result.calls && result.calls.length) {
107
+ return {
108
+ voiceCallId: result.calls[0].voiceCallId,
109
+ uploadUrl: result.calls[0].uploadUrl.substring(context.SFDC_URL.length)
110
+ };
111
+ }
112
+ }
113
+ catch (error) {
114
+ logger.error("[sf_voicecall] Exception occured creating voice call", error);
115
+ }
116
+ return undefined;
117
+ };
118
+ exports.createVoiceCall = createVoiceCall;
119
+ const uploadRecording = async (context, uploadUrl, recordingURL) => {
120
+ const { logger } = context;
121
+ const uploadData = { recordingURL, name: "no_authentication" };
122
+ try {
123
+ logger.info("[sf_voicecall] Upload url", uploadData);
124
+ const uploadResult = await twilio_toolkit_service_1.callSfdc.callApi(uploadUrl, context, uploadData, 30000, "post", false, "multipart/form-data");
125
+ logger.info("[sf_voicecall] Upload url result", uploadResult);
126
+ }
127
+ catch (error) {
128
+ logger.error("[sf_voicecall] Exception occured uploading recording", error);
129
+ }
130
+ };
131
+ exports.uploadRecording = uploadRecording;
132
+ const updateVoiceCall = async (context, voiceCallId, data) => {
133
+ const { logger } = context;
134
+ try {
135
+ const result = await twilio_toolkit_service_1.callSfdc.callApi(`services/data/v66.0/sobjects/voicecall/${voiceCallId}`, context, data, 30000, "patch", false);
136
+ logger.info(`[sf_voicecall] Update voice call ${voiceCallId} result`, result);
137
+ }
138
+ catch (error) {
139
+ logger.error("[sf_voicecall] Update voice call error", error);
140
+ }
141
+ };
142
+ exports.updateVoiceCall = updateVoiceCall;
143
+ const updateVoiceCallTranscription = async (context, voiceCallId, voiceCallField, transcriptSid) => {
144
+ const { logger } = context;
145
+ const client = context.getTwilioClient();
146
+ const [transcript, sentences] = await Promise.all([
147
+ client.intelligence.v2.transcripts(transcriptSid).fetch(),
148
+ client.intelligence.v2.transcripts(transcriptSid).sentences.list()
149
+ ]);
150
+ const callSid = transcript.channel.media_properties.source_sid;
151
+ const participants = [];
152
+ transcript.channel.participants.forEach((p) => {
153
+ participants[p.channel_participant] = p.full_name.startsWith('client') ? 'agent' : 'customer';
154
+ });
155
+ const result = sentences.map((s) => ({
156
+ start: s.startTime,
157
+ text: s.transcript,
158
+ user: participants[s.mediaChannel]
159
+ }));
160
+ logger.debug(`[sf_voicecall] Transcription for call ${callSid}`, result);
161
+ const data = {};
162
+ data[voiceCallField] = JSON.stringify(result);
163
+ await (0, exports.updateVoiceCall)(context, voiceCallId, data);
164
+ // remove transcript from Twilio after update SFDC
165
+ await client.intelligence.v2.transcripts(transcriptSid).remove();
166
+ };
167
+ exports.updateVoiceCallTranscription = updateVoiceCallTranscription;
168
+ //# sourceMappingURL=voiceCall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voiceCall.js","sourceRoot":"","sources":["../../src/utils/voiceCall.ts"],"names":[],"mappings":"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"}