@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/flexFlows.js
CHANGED
|
@@ -1,140 +1,70 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
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;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
exports.getWechatAccount = exports.getWechatFlexFlowSid = exports.getFlowsConfiguration = void 0;
|
|
40
|
-
|
|
41
|
-
return
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}); };
|
|
50
|
-
var getFlexFlow = function (list, phone) {
|
|
51
|
-
var conf = list.find(function (p) { return p.phone === phone; });
|
|
4
|
+
const getDoc = async (context, client) => {
|
|
5
|
+
return await client.sync.v1.services(context.SERVICE_MISC)
|
|
6
|
+
.documents(context.DOC_CFG)
|
|
7
|
+
.fetch();
|
|
8
|
+
};
|
|
9
|
+
const getFlexFlow = (list, phone) => {
|
|
10
|
+
const conf = list.find((p) => p.phone === phone);
|
|
52
11
|
return conf === null || conf === void 0 ? void 0 : conf.studioFlow;
|
|
53
12
|
};
|
|
54
|
-
|
|
55
|
-
var
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
_a =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
case "facebook": return [3 /*break*/, 4];
|
|
66
|
-
case "wechat": return [3 /*break*/, 6];
|
|
67
|
-
}
|
|
68
|
-
return [3 /*break*/, 8];
|
|
69
|
-
case 1:
|
|
70
|
-
if (!(phone === "default" && channelType === "video")) return [3 /*break*/, 3];
|
|
71
|
-
return [4 /*yield*/, getDoc(context, client)];
|
|
72
|
-
case 2:
|
|
73
|
-
doc = _d.sent();
|
|
74
|
-
camp = (_c = (_b = doc === null || doc === void 0 ? void 0 : doc.data) === null || _b === void 0 ? void 0 : _b.video) === null || _c === void 0 ? void 0 : _c.defaultPhone;
|
|
75
|
-
_d.label = 3;
|
|
76
|
-
case 3: return [3 /*break*/, 8];
|
|
77
|
-
case 4: return [4 /*yield*/, getDoc(context, client)];
|
|
78
|
-
case 5:
|
|
79
|
-
doc = _d.sent();
|
|
80
|
-
if (doc && doc.data && doc.data.facebook && doc.data.facebook.pages) {
|
|
81
|
-
return [2 /*return*/, { studioFlow: getFlexFlow(doc.data.facebook.pages, phone) }];
|
|
82
|
-
}
|
|
83
|
-
return [2 /*return*/, undefined];
|
|
84
|
-
case 6: return [4 /*yield*/, getDoc(context, client)];
|
|
85
|
-
case 7:
|
|
86
|
-
doc = _d.sent();
|
|
87
|
-
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
88
|
-
return [2 /*return*/, { studioFlow: getFlexFlow(doc.data.wechat.accounts, phone) }];
|
|
89
|
-
}
|
|
90
|
-
return [2 /*return*/, undefined];
|
|
91
|
-
case 8:
|
|
92
|
-
_d.trys.push([8, 10, , 11]);
|
|
93
|
-
return [4 /*yield*/, client.sync.v1.services(context.SERVICE_MISC)
|
|
94
|
-
.syncMaps(context.MAP_PHONE)
|
|
95
|
-
.syncMapItems(camp)
|
|
96
|
-
.fetch()];
|
|
97
|
-
case 9:
|
|
98
|
-
item = _d.sent();
|
|
99
|
-
return [2 /*return*/, item === null || item === void 0 ? void 0 : item.data[channelType]];
|
|
100
|
-
case 10:
|
|
101
|
-
error_1 = _d.sent();
|
|
102
|
-
logger.error("".concat(camp, " not found in sync phone map"), error_1);
|
|
103
|
-
return [2 /*return*/, undefined];
|
|
104
|
-
case 11: return [2 /*return*/];
|
|
13
|
+
const getFlowsConfiguration = async (context, client, phone, channelType) => {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
const { logger } = context;
|
|
16
|
+
let camp = phone;
|
|
17
|
+
switch (channelType) {
|
|
18
|
+
case "video": {
|
|
19
|
+
if (phone === "default" && channelType === "video") {
|
|
20
|
+
const doc = await getDoc(context, client);
|
|
21
|
+
camp = (_b = (_a = doc === null || doc === void 0 ? void 0 : doc.data) === null || _a === void 0 ? void 0 : _a.video) === null || _b === void 0 ? void 0 : _b.defaultPhone;
|
|
22
|
+
}
|
|
23
|
+
break;
|
|
105
24
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
switch (_a.label) {
|
|
113
|
-
case 0: return [4 /*yield*/, getDoc(context, client)];
|
|
114
|
-
case 1:
|
|
115
|
-
doc = _a.sent();
|
|
116
|
-
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
117
|
-
account = doc.data.wechat.accounts.find(function (a) { return a.id === accountId; });
|
|
118
|
-
return [2 /*return*/, account === null || account === void 0 ? void 0 : account.flexFlow];
|
|
119
|
-
}
|
|
120
|
-
return [2 /*return*/, undefined];
|
|
25
|
+
case "facebook": {
|
|
26
|
+
const doc = await getDoc(context, client);
|
|
27
|
+
if (doc && doc.data && doc.data.facebook && doc.data.facebook.pages) {
|
|
28
|
+
return { studioFlow: getFlexFlow(doc.data.facebook.pages, phone) };
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
121
31
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
switch (_a.label) {
|
|
129
|
-
case 0: return [4 /*yield*/, getDoc(context, client)];
|
|
130
|
-
case 1:
|
|
131
|
-
doc = _a.sent();
|
|
132
|
-
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
133
|
-
return [2 /*return*/, doc.data.wechat.accounts.find(function (a) { return a.id === accountId; })];
|
|
134
|
-
}
|
|
135
|
-
return [2 /*return*/, undefined];
|
|
32
|
+
case "wechat": {
|
|
33
|
+
const doc = await getDoc(context, client);
|
|
34
|
+
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
35
|
+
return { studioFlow: getFlexFlow(doc.data.wechat.accounts, phone) };
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
136
38
|
}
|
|
137
|
-
}
|
|
138
|
-
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const item = await client.sync.v1.services(context.SERVICE_MISC)
|
|
42
|
+
.syncMaps(context.MAP_PHONE)
|
|
43
|
+
.syncMapItems(camp)
|
|
44
|
+
.fetch();
|
|
45
|
+
return item === null || item === void 0 ? void 0 : item.data[channelType];
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
logger.error(`${camp} not found in sync phone map`, error);
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.getFlowsConfiguration = getFlowsConfiguration;
|
|
53
|
+
const getWechatFlexFlowSid = async (context, client, accountId) => {
|
|
54
|
+
const doc = await getDoc(context, client);
|
|
55
|
+
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
56
|
+
const account = doc.data.wechat.accounts.find((a) => a.id === accountId);
|
|
57
|
+
return account === null || account === void 0 ? void 0 : account.flexFlow;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
};
|
|
61
|
+
exports.getWechatFlexFlowSid = getWechatFlexFlowSid;
|
|
62
|
+
const getWechatAccount = async (context, client, accountId) => {
|
|
63
|
+
const doc = await getDoc(context, client);
|
|
64
|
+
if (doc && doc.data && doc.data.wechat && doc.data.wechat.accounts) {
|
|
65
|
+
return doc.data.wechat.accounts.find((a) => a.id === accountId);
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
};
|
|
139
69
|
exports.getWechatAccount = getWechatAccount;
|
|
140
70
|
//# sourceMappingURL=flexFlows.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flexFlows.js","sourceRoot":"","sources":["../../src/utils/flexFlows.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flexFlows.js","sourceRoot":"","sources":["../../src/utils/flexFlows.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/message.js
CHANGED
|
@@ -24,18 +24,18 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.getCustomMessage = void 0;
|
|
27
|
-
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
28
|
require("@twilio-labs/serverless-runtime-types");
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
const getCustomMessage = (context, msgId, lang) => {
|
|
30
|
+
const { logger } = context;
|
|
31
|
+
let fileName = `/localization/custom/${lang}.json`;
|
|
32
32
|
if (!Runtime.getAssets()[fileName]) {
|
|
33
|
-
logger.info(
|
|
34
|
-
fileName =
|
|
33
|
+
logger.info(`file ${fileName} not found, use default lang ${context.DEFAULT_LANG}`);
|
|
34
|
+
fileName = `/localization/custom/${context.DEFAULT_LANG}.json`;
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
const file = Runtime.getAssets()[fileName].path;
|
|
37
|
+
const text = fs.readFileSync(file).toString("utf-8");
|
|
38
|
+
const messages = JSON.parse(text);
|
|
39
39
|
return messages[msgId];
|
|
40
40
|
};
|
|
41
41
|
exports.getCustomMessage = getCustomMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/utils/message.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/utils/message.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAEzB,iDAA+C;AAExC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAE,KAAa,EAAE,IAAa,EAAE,EAAE;IACjF,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,IAAI,QAAQ,GAAG,wBAAwB,IAAI,OAAO,CAAC;IACnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,QAAQ,gCAAgC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACpF,QAAQ,GAAG,wBAAwB,OAAO,CAAC,YAAY,OAAO,CAAC;KAChE;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;IAEhD,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC;AAZW,QAAA,gBAAgB,oBAY3B"}
|
|
@@ -22,162 +22,94 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
22
22
|
__setModuleDefault(result, mod);
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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 };
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.checkWhatsAppNumber = exports.cleanWhatsAppNumber = exports.formatPhone = exports.retrieveFrom = void 0;
|
|
27
|
+
const libphonenumber = __importStar(require("libphonenumber-js"));
|
|
28
|
+
const retrieveFrom = async (phonenumber, to, context) => {
|
|
29
|
+
const { logger } = context;
|
|
30
|
+
const client = context.getTwilioClient();
|
|
31
|
+
const phoneNumbers = (await client.messaging.services(phonenumber).phoneNumbers.list()).map((p) => p.phoneNumber);
|
|
32
|
+
const shortcodes = (await client.messaging.services(phonenumber).shortCodes.list()).map((p) => p.shortCode);
|
|
33
|
+
const phones = [...phoneNumbers, ...shortcodes];
|
|
34
|
+
/*
|
|
35
|
+
disable filter with worker phones
|
|
36
|
+
if (workerSid) {
|
|
37
|
+
const worker = await findWorkerById(context, workerSid);
|
|
38
|
+
const workerPhones = JSON.parse(worker.attributes).phonenumbers;
|
|
39
|
+
phones = phones.filter((p) => workerPhones.includes(p));
|
|
40
|
+
logger.info("phones filter with worker", phones);
|
|
41
|
+
}*/
|
|
42
|
+
let sessions;
|
|
43
|
+
try {
|
|
44
|
+
sessions = await client.sync.v1.services(context.SERVICE_MISC).syncMaps(context.SERVICE_MSG).syncMapItems(phonenumber).fetch();
|
|
45
|
+
// eslint-disable-next-line no-empty
|
|
59
46
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
47
|
+
catch (err) { }
|
|
48
|
+
if (!sessions) {
|
|
49
|
+
logger.info("create a new map for message service");
|
|
50
|
+
const map = await client.sync.v1.services(context.SERVICE_MISC).syncMaps.create({ uniqueName: `customer-${phonenumber}` });
|
|
51
|
+
sessions = await client.sync.v1
|
|
52
|
+
.services(context.SERVICE_MISC)
|
|
53
|
+
.syncMaps(context.SERVICE_MSG)
|
|
54
|
+
.syncMapItems.create({ key: phonenumber, data: { map: map.sid } });
|
|
55
|
+
}
|
|
56
|
+
const mapSid = sessions.data.map;
|
|
57
|
+
let lastPhone;
|
|
58
|
+
try {
|
|
59
|
+
lastPhone = await client.sync.v1.services(context.SERVICE_MISC).syncMaps(mapSid).syncMapItems(to).fetch();
|
|
60
|
+
// eslint-disable-next-line no-empty
|
|
67
61
|
}
|
|
68
|
-
|
|
62
|
+
catch (err) { }
|
|
63
|
+
if (!lastPhone) {
|
|
64
|
+
const rand = Math.floor(Math.random() * phones.length);
|
|
65
|
+
logger.info("new customer, create a item in map, random:", rand);
|
|
66
|
+
lastPhone = await client.sync.v1
|
|
67
|
+
.services(context.SERVICE_MISC)
|
|
68
|
+
.syncMaps(mapSid)
|
|
69
|
+
.syncMapItems.create({ key: to, data: { phonenumber: phones[rand] } });
|
|
70
|
+
}
|
|
71
|
+
else if (!phones.includes(lastPhone.data.phonenumber)) {
|
|
72
|
+
logger.info("phone not present in message service, get a new one");
|
|
73
|
+
const rand = Math.floor(Math.random() * phones.length);
|
|
74
|
+
lastPhone = await client.sync.v1
|
|
75
|
+
.services(context.SERVICE_MISC)
|
|
76
|
+
.syncMaps(mapSid)
|
|
77
|
+
.syncMapItems(to)
|
|
78
|
+
.update({ data: { phonenumber: phones[rand] } });
|
|
79
|
+
}
|
|
80
|
+
const newPhone = lastPhone.data.phonenumber;
|
|
81
|
+
logger.info("phone retrieve in sync", newPhone);
|
|
82
|
+
return newPhone;
|
|
69
83
|
};
|
|
70
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
71
|
-
exports.checkWhatsAppNumber = exports.cleanWhatsAppNumber = exports.formatPhone = exports.retrieveFrom = void 0;
|
|
72
|
-
var libphonenumber = __importStar(require("libphonenumber-js"));
|
|
73
|
-
var retrieveFrom = function (phonenumber, to, context) { return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
-
var logger, client, phoneNumbers, shortcodes, phones, sessions, err_1, map, mapSid, lastPhone, err_2, rand, rand, newPhone;
|
|
75
|
-
return __generator(this, function (_a) {
|
|
76
|
-
switch (_a.label) {
|
|
77
|
-
case 0:
|
|
78
|
-
logger = context.logger;
|
|
79
|
-
client = context.getTwilioClient();
|
|
80
|
-
return [4 /*yield*/, client.messaging.services(phonenumber).phoneNumbers.list()];
|
|
81
|
-
case 1:
|
|
82
|
-
phoneNumbers = (_a.sent()).map(function (p) { return p.phoneNumber; });
|
|
83
|
-
return [4 /*yield*/, client.messaging.services(phonenumber).shortCodes.list()];
|
|
84
|
-
case 2:
|
|
85
|
-
shortcodes = (_a.sent()).map(function (p) { return p.shortCode; });
|
|
86
|
-
phones = __spreadArray(__spreadArray([], phoneNumbers, true), shortcodes, true);
|
|
87
|
-
_a.label = 3;
|
|
88
|
-
case 3:
|
|
89
|
-
_a.trys.push([3, 5, , 6]);
|
|
90
|
-
return [4 /*yield*/, client.sync.v1.services(context.SERVICE_MISC).syncMaps(context.SERVICE_MSG).syncMapItems(phonenumber).fetch()];
|
|
91
|
-
case 4:
|
|
92
|
-
sessions = _a.sent();
|
|
93
|
-
return [3 /*break*/, 6];
|
|
94
|
-
case 5:
|
|
95
|
-
err_1 = _a.sent();
|
|
96
|
-
return [3 /*break*/, 6];
|
|
97
|
-
case 6:
|
|
98
|
-
if (!!sessions) return [3 /*break*/, 9];
|
|
99
|
-
logger.info("create a new map for message service");
|
|
100
|
-
return [4 /*yield*/, client.sync.v1.services(context.SERVICE_MISC).syncMaps.create({ uniqueName: "customer-".concat(phonenumber) })];
|
|
101
|
-
case 7:
|
|
102
|
-
map = _a.sent();
|
|
103
|
-
return [4 /*yield*/, client.sync.v1
|
|
104
|
-
.services(context.SERVICE_MISC)
|
|
105
|
-
.syncMaps(context.SERVICE_MSG)
|
|
106
|
-
.syncMapItems.create({ key: phonenumber, data: { map: map.sid } })];
|
|
107
|
-
case 8:
|
|
108
|
-
sessions = _a.sent();
|
|
109
|
-
_a.label = 9;
|
|
110
|
-
case 9:
|
|
111
|
-
mapSid = sessions.data.map;
|
|
112
|
-
_a.label = 10;
|
|
113
|
-
case 10:
|
|
114
|
-
_a.trys.push([10, 12, , 13]);
|
|
115
|
-
return [4 /*yield*/, client.sync.v1.services(context.SERVICE_MISC).syncMaps(mapSid).syncMapItems(to).fetch()];
|
|
116
|
-
case 11:
|
|
117
|
-
lastPhone = _a.sent();
|
|
118
|
-
return [3 /*break*/, 13];
|
|
119
|
-
case 12:
|
|
120
|
-
err_2 = _a.sent();
|
|
121
|
-
return [3 /*break*/, 13];
|
|
122
|
-
case 13:
|
|
123
|
-
if (!!lastPhone) return [3 /*break*/, 15];
|
|
124
|
-
rand = Math.floor(Math.random() * phones.length);
|
|
125
|
-
logger.info("new customer, create a item in map, random:", rand);
|
|
126
|
-
return [4 /*yield*/, client.sync.v1
|
|
127
|
-
.services(context.SERVICE_MISC)
|
|
128
|
-
.syncMaps(mapSid)
|
|
129
|
-
.syncMapItems.create({ key: to, data: { phonenumber: phones[rand] } })];
|
|
130
|
-
case 14:
|
|
131
|
-
lastPhone = _a.sent();
|
|
132
|
-
return [3 /*break*/, 17];
|
|
133
|
-
case 15:
|
|
134
|
-
if (!!phones.includes(lastPhone.data.phonenumber)) return [3 /*break*/, 17];
|
|
135
|
-
logger.info("phone not present in message service, get a new one");
|
|
136
|
-
rand = Math.floor(Math.random() * phones.length);
|
|
137
|
-
return [4 /*yield*/, client.sync.v1
|
|
138
|
-
.services(context.SERVICE_MISC)
|
|
139
|
-
.syncMaps(mapSid)
|
|
140
|
-
.syncMapItems(to)
|
|
141
|
-
.update({ data: { phonenumber: phones[rand] } })];
|
|
142
|
-
case 16:
|
|
143
|
-
lastPhone = _a.sent();
|
|
144
|
-
_a.label = 17;
|
|
145
|
-
case 17:
|
|
146
|
-
newPhone = lastPhone.data.phonenumber;
|
|
147
|
-
logger.info("phone retrieve in sync", newPhone);
|
|
148
|
-
return [2 /*return*/, newPhone];
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
}); };
|
|
152
84
|
exports.retrieveFrom = retrieveFrom;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
85
|
+
const formatPhone = (phone, type, context) => {
|
|
86
|
+
const { logger } = context;
|
|
87
|
+
let result = (phone || "").split(":").pop();
|
|
156
88
|
if (!result || result === "anonymous") {
|
|
157
89
|
return "anonymous";
|
|
158
90
|
}
|
|
159
91
|
if (phone && phone.startsWith("sip") && type == "voice") {
|
|
160
|
-
|
|
92
|
+
const match = /sip:(\+?\d*)@/.exec(phone);
|
|
161
93
|
if (match && match.length > 1) {
|
|
162
94
|
result = match[1];
|
|
163
95
|
}
|
|
164
|
-
logger.info(
|
|
96
|
+
logger.info(`sip format detected, result:${result}`);
|
|
165
97
|
}
|
|
166
98
|
if (type == "voice" && result && result[0] != "+") {
|
|
167
|
-
if (libphonenumber.isPossibleNumber(
|
|
168
|
-
result =
|
|
169
|
-
logger.info(
|
|
99
|
+
if (libphonenumber.isPossibleNumber(`+${result}`)) {
|
|
100
|
+
result = `+${result}`;
|
|
101
|
+
logger.info(`phone formatted:${result}`);
|
|
170
102
|
}
|
|
171
103
|
else {
|
|
172
|
-
|
|
104
|
+
const parsed = libphonenumber.parsePhoneNumber(result, context.COUNTRY);
|
|
173
105
|
result = parsed.number;
|
|
174
|
-
logger.info(
|
|
106
|
+
logger.info(`phone parse:${result}`, parsed);
|
|
175
107
|
}
|
|
176
108
|
}
|
|
177
109
|
return result;
|
|
178
110
|
};
|
|
179
111
|
exports.formatPhone = formatPhone;
|
|
180
|
-
|
|
112
|
+
const cleanWhatsAppNumber = (phone) => {
|
|
181
113
|
if (!phone) {
|
|
182
114
|
return phone;
|
|
183
115
|
}
|
|
@@ -192,7 +124,7 @@ var cleanWhatsAppNumber = function (phone) {
|
|
|
192
124
|
return phone;
|
|
193
125
|
};
|
|
194
126
|
exports.cleanWhatsAppNumber = cleanWhatsAppNumber;
|
|
195
|
-
|
|
127
|
+
const checkWhatsAppNumber = (phone) => {
|
|
196
128
|
if (!phone) {
|
|
197
129
|
return phone;
|
|
198
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phonenumber.js","sourceRoot":"","sources":["../../src/utils/phonenumber.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"phonenumber.js","sourceRoot":"","sources":["../../src/utils/phonenumber.ts"],"names":[],"mappings":"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"}
|