@almaviacx/gge-toolkit-service 2.8.0 → 2.8.2
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/tests/almavia-twilio-runtime.js +48 -76
- package/dist/tests/almavia-twilio-runtime.js.map +1 -1
- package/dist/tests/twilio-runtime.d.ts +1 -1
- package/dist/tests/twilio-runtime.js +34 -34
- package/dist/tests/twilio-runtime.js.map +1 -1
- package/dist/utils/__tests__/callreason.test.js +30 -93
- package/dist/utils/__tests__/callreason.test.js.map +1 -1
- package/dist/utils/__tests__/message.test.js +10 -10
- package/dist/utils/__tests__/message.test.js.map +1 -1
- package/dist/utils/__tests__/phonenumber.test.js +45 -119
- package/dist/utils/__tests__/phonenumber.test.js.map +1 -1
- package/dist/utils/__tests__/video.test.js +35 -110
- package/dist/utils/__tests__/video.test.js.map +1 -1
- package/dist/utils/calendar.js +71 -133
- package/dist/utils/calendar.js.map +1 -1
- package/dist/utils/callreason.js +41 -113
- package/dist/utils/callreason.js.map +1 -1
- package/dist/utils/conversation.js +37 -93
- package/dist/utils/conversation.js.map +1 -1
- package/dist/utils/flexFlows.js +60 -130
- package/dist/utils/flexFlows.js.map +1 -1
- package/dist/utils/message.js +9 -9
- package/dist/utils/message.js.map +1 -1
- package/dist/utils/phonenumber.js +68 -136
- package/dist/utils/phonenumber.js.map +1 -1
- package/dist/utils/video.js +85 -167
- package/dist/utils/video.js.map +1 -1
- package/dist/utils/voiceCall.js +156 -286
- package/dist/utils/voiceCall.js.map +1 -1
- package/dist/utils/worker.js +77 -170
- package/dist/utils/worker.js.map +1 -1
- package/package.json +2 -4
package/dist/utils/video.js
CHANGED
|
@@ -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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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.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.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.services(service.sid).environments.list();
|
|
43
|
+
return `https://${envList[0].domainName}`;
|
|
44
|
+
};
|
|
93
45
|
exports.findVideoUiBaseUrl = findVideoUiBaseUrl;
|
|
94
|
-
|
|
95
|
-
var client, SERVICE_MISC, DOC_CFG, doc, dateEnd, now;
|
|
46
|
+
const getVideoLinkTtl = async (context, attributes, taskCreated) => {
|
|
96
47
|
var _a;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
178
|
-
var SERVICE_MISC, DOC_CFG, client, doc;
|
|
103
|
+
const getVideoUrlTemplated = async (context, url) => {
|
|
179
104
|
var _a;
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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
|
package/dist/utils/video.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/utils/video.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../src/utils/video.ts"],"names":[],"mappings":"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"}
|