@vangbanlanhat/fca-unofficial 1.4.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/.gitattributes +2 -0
- package/.github/workflows/nodejs.yml +26 -0
- package/.github/workflows/npmpublish.yml +30 -0
- package/.travis.yml +6 -0
- package/CHANGELOG.md +2 -0
- package/DOCS.md +1932 -0
- package/LICENSE-MIT +21 -0
- package/README.md +198 -0
- package/jest.config.js +10 -0
- package/package.json +86 -0
- package/pnpm-workspace.yaml +3 -0
- package/src/actions/addExternalModule.js +34 -0
- package/src/actions/addUserToGroup.js +113 -0
- package/src/actions/changeAdminStatus.js +79 -0
- package/src/actions/changeArchivedStatus.js +55 -0
- package/src/actions/changeBio.js +77 -0
- package/src/actions/changeBlockedStatus.js +47 -0
- package/src/actions/changeGroupImage.js +129 -0
- package/src/actions/changeNickname.js +59 -0
- package/src/actions/changeThreadColor.js +71 -0
- package/src/actions/changeThreadEmoji.js +55 -0
- package/src/actions/createNewGroup.js +86 -0
- package/src/actions/createPoll.js +71 -0
- package/src/actions/deleteMessage.js +56 -0
- package/src/actions/deleteThread.js +56 -0
- package/src/actions/editMessage.js +81 -0
- package/src/actions/forwardAttachment.js +60 -0
- package/src/actions/getAvatarUser.js +77 -0
- package/src/actions/getCurrentUserID.js +11 -0
- package/src/actions/getEmojiUrl.js +37 -0
- package/src/actions/getFriendsList.js +84 -0
- package/src/actions/getMessage.js +833 -0
- package/src/actions/getRegion.js +11 -0
- package/src/actions/getThreadHistory.js +702 -0
- package/src/actions/getThreadHistoryDeprecated.js +93 -0
- package/src/actions/getThreadInfo.js +265 -0
- package/src/actions/getThreadInfoDeprecated.js +80 -0
- package/src/actions/getThreadList.js +274 -0
- package/src/actions/getThreadListDeprecated.js +91 -0
- package/src/actions/getThreadPictures.js +79 -0
- package/src/actions/getUserID.js +66 -0
- package/src/actions/getUserInfo.js +92 -0
- package/src/actions/handleFriendRequest.js +61 -0
- package/src/actions/handleMessageRequest.js +65 -0
- package/src/actions/httpGet.js +70 -0
- package/src/actions/httpPost.js +70 -0
- package/src/actions/index.js +69 -0
- package/src/actions/listenMqtt.js +818 -0
- package/src/actions/logout.js +136 -0
- package/src/actions/markAsDelivered.js +58 -0
- package/src/actions/markAsRead.js +92 -0
- package/src/actions/markAsReadAll.js +50 -0
- package/src/actions/markAsSeen.js +59 -0
- package/src/actions/muteThread.js +52 -0
- package/src/actions/pinMessage.js +86 -0
- package/src/actions/refreshFb_dtsg.js +89 -0
- package/src/actions/removeUserFromGroup.js +79 -0
- package/src/actions/resolvePhotoUrl.js +45 -0
- package/src/actions/searchForThread.js +53 -0
- package/src/actions/searchStickers.js +53 -0
- package/src/actions/sendMessage.js +490 -0
- package/src/actions/sendMessageMqtt.js +235 -0
- package/src/actions/sendTypingIndicator.js +59 -0
- package/src/actions/setMessageReaction.js +140 -0
- package/src/actions/setMessageReactionMqtt.js +72 -0
- package/src/actions/setPostReaction.js +76 -0
- package/src/actions/setTitle.js +86 -0
- package/src/actions/stopListenMqtt.js +63 -0
- package/src/actions/threadColors.js +57 -0
- package/src/actions/unfriend.js +52 -0
- package/src/actions/unsendMessage.js +61 -0
- package/src/index.js +659 -0
- package/src/service/uploadAttachment.js +318 -0
- package/src/utils/base-parts/auth.js +286 -0
- package/src/utils/base-parts/formatters.js +751 -0
- package/src/utils/base-parts/identity.js +169 -0
- package/src/utils/base-parts/network.js +159 -0
- package/src/utils/base-parts/parsing.js +53 -0
- package/src/utils/base-parts/type.js +9 -0
- package/src/utils/base.js +18 -0
- package/src/utils/defaults.js +10 -0
- package/src/utils/format-attachments.js +7 -0
- package/src/utils/format-core.js +8 -0
- package/src/utils/format-events.js +11 -0
- package/src/utils/format-messages.js +10 -0
- package/src/utils/format-presence.js +9 -0
- package/src/utils/format-threads.js +8 -0
- package/src/utils/formatters.js +18 -0
- package/src/utils/identity.js +12 -0
- package/src/utils/index.js +15 -0
- package/src/utils/network.js +12 -0
- package/src/utils/parsing.js +11 -0
- package/src/utils.js +3 -0
- package/test/config.env.example +30 -0
- package/test/data/shareAttach.js +146 -0
- package/test/data/something.mov +0 -0
- package/test/data/test.png +0 -0
- package/test/data/test.txt +7 -0
- package/test/example-appstate.txt +11 -0
- package/test/integration/actions.appstate.integration.test.js +233 -0
- package/test/integration/api.integration.test.js +387 -0
- package/test/integration/env-test-config.js +46 -0
- package/test/integration/login.appstate.integration.test.js +47 -0
- package/test/integration/page.integration.test.js +139 -0
- package/test/jest.setup.js +54 -0
- package/test/unit/actions/actions.basic.test.js +116 -0
- package/test/unit/actions/actions.registry.test.js +36 -0
- package/test/unit/index/index.test.js +109 -0
- package/test/unit/utils/base-parts/auth.test.js +92 -0
- package/test/unit/utils/base-parts/formatters.test.js +53 -0
- package/test/unit/utils/base-parts/identity.test.js +43 -0
- package/test/unit/utils/base-parts/parsing.test.js +38 -0
- package/test/unit/utils/base-parts/type.test.js +23 -0
- package/test/unit/utils/base.test.js +35 -0
- package/vangbanlanhat-fca-unofficial-1.4.2.tgz +0 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function padZeros(val, len) {
|
|
4
|
+
val = String(val);
|
|
5
|
+
len = len || 2;
|
|
6
|
+
while (val.length < len) val = "0" + val;
|
|
7
|
+
return val;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function generateThreadingID(clientID) {
|
|
11
|
+
var k = Date.now();
|
|
12
|
+
var l = Math.floor(Math.random() * 4294967295);
|
|
13
|
+
var m = clientID;
|
|
14
|
+
return "<" + k + ":" + l + "-" + m + "@mail.projektitan.com>";
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function binaryToDecimal(data) {
|
|
18
|
+
var ret = "";
|
|
19
|
+
while (data !== "0") {
|
|
20
|
+
var end = 0;
|
|
21
|
+
var fullName = "";
|
|
22
|
+
var i = 0;
|
|
23
|
+
for (; i < data.length; i++) {
|
|
24
|
+
end = 2 * end + parseInt(data[i], 10);
|
|
25
|
+
if (end >= 10) {
|
|
26
|
+
fullName += "1";
|
|
27
|
+
end -= 10;
|
|
28
|
+
} else {
|
|
29
|
+
fullName += "0";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
ret = end.toString() + ret;
|
|
33
|
+
data = fullName.slice(fullName.indexOf("1"));
|
|
34
|
+
}
|
|
35
|
+
return ret;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function generateOfflineThreadingID() {
|
|
39
|
+
var ret = Date.now();
|
|
40
|
+
var value = Math.floor(Math.random() * 4294967295);
|
|
41
|
+
var str = ("0000000000000000000000" + value.toString(2)).slice(-22);
|
|
42
|
+
var msgs = ret.toString(2) + str;
|
|
43
|
+
return binaryToDecimal(msgs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
var h;
|
|
47
|
+
var i = {};
|
|
48
|
+
var j = {
|
|
49
|
+
_: "%",
|
|
50
|
+
A: "%2",
|
|
51
|
+
B: "000",
|
|
52
|
+
C: "%7d",
|
|
53
|
+
D: "%7b%22",
|
|
54
|
+
E: "%2c%22",
|
|
55
|
+
F: "%22%3a",
|
|
56
|
+
G: "%2c%22ut%22%3a1",
|
|
57
|
+
H: "%2c%22bls%22%3a",
|
|
58
|
+
I: "%2c%22n%22%3a%22%",
|
|
59
|
+
J: "%22%3a%7b%22i%22%3a0%7d",
|
|
60
|
+
K: "%2c%22pt%22%3a0%2c%22vis%22%3a",
|
|
61
|
+
L: "%2c%22ch%22%3a%7b%22h%22%3a%22",
|
|
62
|
+
M: "%7b%22v%22%3a2%2c%22time%22%3a1",
|
|
63
|
+
N: ".channel%22%2c%22sub%22%3a%5b",
|
|
64
|
+
O: "%2c%22sb%22%3a1%2c%22t%22%3a%5b",
|
|
65
|
+
P: "%2c%22ud%22%3a100%2c%22lc%22%3a0",
|
|
66
|
+
Q: "%5d%2c%22f%22%3anull%2c%22uct%22%3a",
|
|
67
|
+
R: ".channel%22%2c%22sub%22%3a%5b1%5d",
|
|
68
|
+
S: "%22%2c%22m%22%3a0%7d%2c%7b%22i%22%3a",
|
|
69
|
+
T: "%2c%22blc%22%3a1%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
70
|
+
U: "%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
71
|
+
V: "%2c%22blc%22%3a0%2c%22snd%22%3a0%2c%22ct%22%3a",
|
|
72
|
+
W: "%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a",
|
|
73
|
+
X: "%2c%22ri%22%3a0%7d%2c%22state%22%3a%7b%22p%22%3a0%2c%22ut%22%3a1",
|
|
74
|
+
Y:
|
|
75
|
+
"%2c%22pt%22%3a0%2c%22vis%22%3a1%2c%22bls%22%3a0%2c%22blc%22%3a0%2c%22snd%22%3a1%2c%22ct%22%3a",
|
|
76
|
+
Z:
|
|
77
|
+
"%2c%22sb%22%3a1%2c%22t%22%3a%5b%5d%2c%22f%22%3anull%2c%22uct%22%3a0%2c%22s%22%3a0%2c%22blo%22%3a0%7d%2c%22bl%22%3a%7b%22ac%22%3a"
|
|
78
|
+
};
|
|
79
|
+
(function () {
|
|
80
|
+
var l = [];
|
|
81
|
+
for (var m in j) {
|
|
82
|
+
i[j[m]] = m;
|
|
83
|
+
l.push(j[m]);
|
|
84
|
+
}
|
|
85
|
+
l.reverse();
|
|
86
|
+
h = new RegExp(l.join("|"), "g");
|
|
87
|
+
})();
|
|
88
|
+
|
|
89
|
+
function presenceEncode(str) {
|
|
90
|
+
return encodeURIComponent(str)
|
|
91
|
+
.replace(/([_A-Z])|%../g, function (m, n) {
|
|
92
|
+
return n ? "%" + n.charCodeAt(0).toString(16) : m;
|
|
93
|
+
})
|
|
94
|
+
.toLowerCase()
|
|
95
|
+
.replace(h, function (m) {
|
|
96
|
+
return i[m];
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function generatePresence(userID) {
|
|
101
|
+
var time = Date.now();
|
|
102
|
+
return (
|
|
103
|
+
"E" +
|
|
104
|
+
presenceEncode(
|
|
105
|
+
JSON.stringify({
|
|
106
|
+
v: 3,
|
|
107
|
+
time: parseInt(time / 1000, 10),
|
|
108
|
+
user: userID,
|
|
109
|
+
state: {
|
|
110
|
+
ut: 0,
|
|
111
|
+
t2: [],
|
|
112
|
+
lm2: null,
|
|
113
|
+
uct2: time,
|
|
114
|
+
tr: null,
|
|
115
|
+
tw: Math.floor(Math.random() * 4294967295) + 1,
|
|
116
|
+
at: time
|
|
117
|
+
},
|
|
118
|
+
ch: {
|
|
119
|
+
["p_" + userID]: 0
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function generateAccessiblityCookie() {
|
|
127
|
+
var time = Date.now();
|
|
128
|
+
return encodeURIComponent(
|
|
129
|
+
JSON.stringify({
|
|
130
|
+
sr: 0,
|
|
131
|
+
"sr-ts": time,
|
|
132
|
+
jk: 0,
|
|
133
|
+
"jk-ts": time,
|
|
134
|
+
kb: 0,
|
|
135
|
+
"kb-ts": time,
|
|
136
|
+
hcm: 0,
|
|
137
|
+
"hcm-ts": time
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function getGUID() {
|
|
143
|
+
var sectionLength = Date.now();
|
|
144
|
+
var id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
|
|
145
|
+
var r = Math.floor((sectionLength + Math.random() * 16) % 16);
|
|
146
|
+
sectionLength = Math.floor(sectionLength / 16);
|
|
147
|
+
return (c == "x" ? r : (r & 7) | 8).toString(16);
|
|
148
|
+
});
|
|
149
|
+
return id;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function getSignatureID() {
|
|
153
|
+
return Math.floor(Math.random() * 2147483648).toString(16);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function generateTimestampRelative() {
|
|
157
|
+
var d = new Date();
|
|
158
|
+
return d.getHours() + ":" + padZeros(d.getMinutes());
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
module.exports = {
|
|
162
|
+
generateThreadingID,
|
|
163
|
+
generateOfflineThreadingID,
|
|
164
|
+
generatePresence,
|
|
165
|
+
generateAccessiblityCookie,
|
|
166
|
+
getGUID,
|
|
167
|
+
getSignatureID,
|
|
168
|
+
generateTimestampRelative
|
|
169
|
+
};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var bluebird = require("bluebird");
|
|
4
|
+
var request = bluebird.promisify(require("request").defaults({ jar: true }));
|
|
5
|
+
var stream = require("stream");
|
|
6
|
+
var getType = require("./type").getType;
|
|
7
|
+
|
|
8
|
+
function setProxy(url) {
|
|
9
|
+
if (typeof url == undefined) {
|
|
10
|
+
return request = bluebird.promisify(require("request").defaults({ jar: true }));
|
|
11
|
+
}
|
|
12
|
+
return request = bluebird.promisify(require("request").defaults({
|
|
13
|
+
jar: true,
|
|
14
|
+
proxy: url
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function getHeaders(url, options, ctx, customHeader) {
|
|
19
|
+
var host;
|
|
20
|
+
try {
|
|
21
|
+
host = new URL(url).hostname;
|
|
22
|
+
} catch (_) {
|
|
23
|
+
host = url.replace("https://", "").split("/")[0];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var userAgent = customHeader && customHeader.customUserAgent
|
|
27
|
+
? customHeader.customUserAgent
|
|
28
|
+
: options.userAgent;
|
|
29
|
+
|
|
30
|
+
var headers = {
|
|
31
|
+
host: host,
|
|
32
|
+
accept: "*/*",
|
|
33
|
+
"accept-language": "vi",
|
|
34
|
+
referer: "https://www.facebook.com/",
|
|
35
|
+
origin: "https://www.facebook.com",
|
|
36
|
+
connection: "keep-alive",
|
|
37
|
+
"Sec-Fetch-Site": "same-origin",
|
|
38
|
+
"Sec-Fetch-Mode": "cors",
|
|
39
|
+
"Sec-Fetch-Dest": "empty",
|
|
40
|
+
"Sec-Fetch-User": "?1",
|
|
41
|
+
"User-Agent": userAgent
|
|
42
|
+
};
|
|
43
|
+
if (customHeader) {
|
|
44
|
+
Object.assign(headers, customHeader);
|
|
45
|
+
if (customHeader.noRef) {
|
|
46
|
+
delete headers.referer;
|
|
47
|
+
}
|
|
48
|
+
delete headers.customUserAgent;
|
|
49
|
+
delete headers.noRef;
|
|
50
|
+
}
|
|
51
|
+
if (ctx && ctx.region) {
|
|
52
|
+
headers["X-MSGR-Region"] = ctx.region;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
headers["x-asbd-id"] = (ctx && ctx.globalOptions && ctx.globalOptions.asbdID)
|
|
56
|
+
? String(ctx.globalOptions.asbdID)
|
|
57
|
+
: "359341";
|
|
58
|
+
|
|
59
|
+
if (ctx && ctx.lsd) {
|
|
60
|
+
headers["x-fb-lsd"] = ctx.lsd;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return headers;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function isReadableStream(obj) {
|
|
67
|
+
return (
|
|
68
|
+
obj instanceof stream.Stream &&
|
|
69
|
+
(getType(obj._read) === "Function" ||
|
|
70
|
+
getType(obj._read) === "AsyncFunction") &&
|
|
71
|
+
getType(obj._readableState) === "Object"
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function get(url, jar, qs, options, ctx, customHeader) {
|
|
76
|
+
if (getType(qs) === "Object") {
|
|
77
|
+
for (var prop in qs) {
|
|
78
|
+
if (Object.prototype.hasOwnProperty.call(qs, prop) && getType(qs[prop]) === "Object") {
|
|
79
|
+
qs[prop] = JSON.stringify(qs[prop]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
var op = {
|
|
84
|
+
headers: getHeaders(url, options, ctx, customHeader),
|
|
85
|
+
timeout: 60000,
|
|
86
|
+
qs: qs,
|
|
87
|
+
url: url,
|
|
88
|
+
method: "GET",
|
|
89
|
+
jar: jar,
|
|
90
|
+
gzip: true
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
return request(op).then(function (res) {
|
|
94
|
+
return res[0];
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function post(url, jar, form, options, ctx, customHeader) {
|
|
99
|
+
var headers = getHeaders(url, options, ctx, customHeader);
|
|
100
|
+
if (!headers["content-type"] && !headers["Content-Type"]) {
|
|
101
|
+
headers["content-type"] = "application/x-www-form-urlencoded";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
var op = {
|
|
105
|
+
headers: headers,
|
|
106
|
+
timeout: 60000,
|
|
107
|
+
url: url,
|
|
108
|
+
method: "POST",
|
|
109
|
+
form: form,
|
|
110
|
+
jar: jar,
|
|
111
|
+
gzip: true
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
return request(op).then(function (res) {
|
|
115
|
+
return res[0];
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
function postFormData(url, jar, form, qs, options, ctx) {
|
|
120
|
+
var headers = getHeaders(url, options, ctx);
|
|
121
|
+
var timeout = 60000;
|
|
122
|
+
|
|
123
|
+
if (typeof url === "string" && url.indexOf("/ajax/mercury/upload.php") !== -1) {
|
|
124
|
+
var customUploadTimeout = ctx && ctx.globalOptions
|
|
125
|
+
? Number(ctx.globalOptions.uploadAttachmentTimeout)
|
|
126
|
+
: NaN;
|
|
127
|
+
|
|
128
|
+
if (!isNaN(customUploadTimeout) && customUploadTimeout > 0) {
|
|
129
|
+
timeout = customUploadTimeout;
|
|
130
|
+
} else {
|
|
131
|
+
timeout = 180000;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
var op = {
|
|
136
|
+
headers: headers,
|
|
137
|
+
timeout: timeout,
|
|
138
|
+
url: url,
|
|
139
|
+
method: "POST",
|
|
140
|
+
formData: form,
|
|
141
|
+
qs: qs,
|
|
142
|
+
jar: jar,
|
|
143
|
+
gzip: true
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
return request(op).then(function (res) {
|
|
147
|
+
return res[0];
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
module.exports = {
|
|
152
|
+
setProxy,
|
|
153
|
+
getHeaders,
|
|
154
|
+
isReadableStream,
|
|
155
|
+
get,
|
|
156
|
+
post,
|
|
157
|
+
postFormData,
|
|
158
|
+
getJar: request.jar
|
|
159
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function getFrom(str, startToken, endToken) {
|
|
4
|
+
var start = str.indexOf(startToken) + startToken.length;
|
|
5
|
+
if (start < startToken.length) return "";
|
|
6
|
+
|
|
7
|
+
var lastHalf = str.substring(start);
|
|
8
|
+
var end = lastHalf.indexOf(endToken);
|
|
9
|
+
if (end === -1) {
|
|
10
|
+
throw Error(
|
|
11
|
+
"Could not find endTime `" + endToken + "` in the given string."
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
return lastHalf.substring(0, end);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function makeParsable(html) {
|
|
18
|
+
var withoutForLoop = html.replace(/for\s*\(\s*;\s*;\s*\)\s*;\s*/, "");
|
|
19
|
+
var maybeMultipleObjects = withoutForLoop.split(/\}\r\n *\{/);
|
|
20
|
+
if (maybeMultipleObjects.length === 1) return maybeMultipleObjects;
|
|
21
|
+
|
|
22
|
+
return "[" + maybeMultipleObjects.join("},{") + "]";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function arrayToObject(arr, getKey, getValue) {
|
|
26
|
+
return arr.reduce(function (acc, val) {
|
|
27
|
+
acc[getKey(val)] = getValue(val);
|
|
28
|
+
return acc;
|
|
29
|
+
}, {});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function arrToForm(form) {
|
|
33
|
+
return arrayToObject(
|
|
34
|
+
form,
|
|
35
|
+
function (v) {
|
|
36
|
+
return v.name;
|
|
37
|
+
},
|
|
38
|
+
function (v) {
|
|
39
|
+
return v.val;
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function decodeClientPayload(payload) {
|
|
45
|
+
return JSON.parse(String.fromCharCode.apply(null, payload));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = {
|
|
49
|
+
getFrom,
|
|
50
|
+
makeParsable,
|
|
51
|
+
arrToForm,
|
|
52
|
+
decodeClientPayload
|
|
53
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var type = require("./base-parts/type");
|
|
4
|
+
var network = require("./base-parts/network");
|
|
5
|
+
var parsing = require("./base-parts/parsing");
|
|
6
|
+
var identity = require("./base-parts/identity");
|
|
7
|
+
var formatters = require("./base-parts/formatters");
|
|
8
|
+
var auth = require("./base-parts/auth");
|
|
9
|
+
|
|
10
|
+
module.exports = Object.assign(
|
|
11
|
+
{},
|
|
12
|
+
network,
|
|
13
|
+
identity,
|
|
14
|
+
parsing,
|
|
15
|
+
auth,
|
|
16
|
+
formatters,
|
|
17
|
+
type
|
|
18
|
+
);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var base = require("./base");
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
formatDeltaEvent: base.formatDeltaEvent,
|
|
7
|
+
formatDeltaMessage: base.formatDeltaMessage,
|
|
8
|
+
formatDeltaReadReceipt: base.formatDeltaReadReceipt,
|
|
9
|
+
formatReadReceipt: base.formatReadReceipt,
|
|
10
|
+
formatRead: base.formatRead
|
|
11
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var attachments = require("./format-attachments");
|
|
4
|
+
var messages = require("./format-messages");
|
|
5
|
+
var events = require("./format-events");
|
|
6
|
+
var threads = require("./format-threads");
|
|
7
|
+
var presence = require("./format-presence");
|
|
8
|
+
var core = require("./format-core");
|
|
9
|
+
|
|
10
|
+
module.exports = Object.assign(
|
|
11
|
+
{},
|
|
12
|
+
attachments,
|
|
13
|
+
messages,
|
|
14
|
+
events,
|
|
15
|
+
threads,
|
|
16
|
+
presence,
|
|
17
|
+
core
|
|
18
|
+
);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var base = require("./base");
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
generateThreadingID: base.generateThreadingID,
|
|
7
|
+
generateOfflineThreadingID: base.generateOfflineThreadingID,
|
|
8
|
+
getGUID: base.getGUID,
|
|
9
|
+
getSignatureID: base.getSignatureID,
|
|
10
|
+
generateTimestampRelative: base.generateTimestampRelative,
|
|
11
|
+
generatePresence: base.generatePresence
|
|
12
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var fs = require("fs");
|
|
4
|
+
var path = require("path");
|
|
5
|
+
|
|
6
|
+
var moduleFiles = fs
|
|
7
|
+
.readdirSync(__dirname)
|
|
8
|
+
.filter(function (name) {
|
|
9
|
+
return name.endsWith(".js") && name !== "index.js";
|
|
10
|
+
})
|
|
11
|
+
.sort();
|
|
12
|
+
|
|
13
|
+
module.exports = moduleFiles.reduce(function (acc, fileName) {
|
|
14
|
+
return Object.assign(acc, require(path.join(__dirname, fileName)));
|
|
15
|
+
}, {});
|
package/src/utils.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Copy this file to test/config.env and fill in real values.
|
|
2
|
+
# Integration tests auto-load test/config.env via dotenv.
|
|
3
|
+
# Shell env vars still take precedence if you need overrides.
|
|
4
|
+
|
|
5
|
+
# Login email for credential-based integration tests.
|
|
6
|
+
FCA_TEST_EMAIL=example@test.com
|
|
7
|
+
|
|
8
|
+
# Login password for credential-based integration tests.
|
|
9
|
+
FCA_TEST_PASSWORD=qwerty
|
|
10
|
+
|
|
11
|
+
# Expected current account ID after login (used for identity assertions).
|
|
12
|
+
FCA_TEST_USER_ID=00000000000000
|
|
13
|
+
|
|
14
|
+
# Comma-separated user thread IDs for direct-message send tests.
|
|
15
|
+
# The test will try these IDs in order.
|
|
16
|
+
FCA_TEST_USER_IDS=11111111111111,22222222222222
|
|
17
|
+
|
|
18
|
+
# Group thread ID used by group send-message tests.
|
|
19
|
+
FCA_TEST_GROUP_ID=3333333333333333
|
|
20
|
+
|
|
21
|
+
# E2EE direct chat target (numeric ID or full chat JID).
|
|
22
|
+
# If numeric, integration tests convert to <id>@msgr.
|
|
23
|
+
E2EE_TEST_USER_ID=1111111111111111
|
|
24
|
+
|
|
25
|
+
# E2EE group chat target (numeric ID or full chat JID).
|
|
26
|
+
# If numeric, integration tests convert to <id>@g.us.
|
|
27
|
+
E2EE_TEST_GROUP_ID=2222222222222222
|
|
28
|
+
|
|
29
|
+
# E2EE send tests require inbound activity from E2EE_TEST_USER_ID before sending.
|
|
30
|
+
# Send a message from this user to bot first to warm up session.
|