lansenger-sdk-ts 1.0.0
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/LICENSE +21 -0
- package/README.fr.md +501 -0
- package/README.md +504 -0
- package/README.zhHans.md +501 -0
- package/README.zhHant.md +501 -0
- package/README.zhHantHK.md +501 -0
- package/dist/accountMessages.d.ts +12 -0
- package/dist/accountMessages.js +41 -0
- package/dist/auth.d.ts +13 -0
- package/dist/auth.js +70 -0
- package/dist/calendars.d.ts +84 -0
- package/dist/calendars.js +278 -0
- package/dist/callbacks.d.ts +384 -0
- package/dist/callbacks.js +712 -0
- package/dist/chats.d.ts +22 -0
- package/dist/chats.js +88 -0
- package/dist/client.d.ts +439 -0
- package/dist/client.js +712 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.js +42 -0
- package/dist/constants.d.ts +30 -0
- package/dist/constants.js +187 -0
- package/dist/contacts.d.ts +38 -0
- package/dist/contacts.js +161 -0
- package/dist/departments.d.ts +18 -0
- package/dist/departments.js +69 -0
- package/dist/exceptions.d.ts +20 -0
- package/dist/exceptions.js +42 -0
- package/dist/groupMessages.d.ts +11 -0
- package/dist/groupMessages.js +39 -0
- package/dist/groups.d.ts +66 -0
- package/dist/groups.js +218 -0
- package/dist/http.d.ts +7 -0
- package/dist/http.js +67 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +189 -0
- package/dist/media.d.ts +16 -0
- package/dist/media.js +178 -0
- package/dist/models.d.ts +925 -0
- package/dist/models.js +991 -0
- package/dist/oauth.d.ts +17 -0
- package/dist/oauth.js +107 -0
- package/dist/persistence.d.ts +26 -0
- package/dist/persistence.js +210 -0
- package/dist/reminders.d.ts +10 -0
- package/dist/reminders.js +31 -0
- package/dist/streaming.d.ts +9 -0
- package/dist/streaming.js +40 -0
- package/dist/todos.d.ts +75 -0
- package/dist/todos.js +282 -0
- package/dist/urlHelpers.d.ts +7 -0
- package/dist/urlHelpers.js +22 -0
- package/dist/userMessages.d.ts +8 -0
- package/dist/userMessages.js +34 -0
- package/dist/users.d.ts +6 -0
- package/dist/users.js +32 -0
- package/package.json +33 -0
package/dist/media.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LansengerConfig } from "./config";
|
|
2
|
+
import { FetchFn } from "./http";
|
|
3
|
+
import { TokenManager } from "./auth";
|
|
4
|
+
import { UploadMediaResult, DownloadMediaResult, MediaPathResult } from "./models";
|
|
5
|
+
export declare function uploadMedia(config: LansengerConfig, tokenManager: TokenManager, fetchFn: FetchFn, filePath: string, mediaType?: number, userToken?: string): Promise<UploadMediaResult>;
|
|
6
|
+
export declare function uploadAppMedia(config: LansengerConfig, tokenManager: TokenManager, fetchFn: FetchFn, filePath: string, mediaType?: string, opts?: {
|
|
7
|
+
width?: number;
|
|
8
|
+
height?: number;
|
|
9
|
+
duration?: number;
|
|
10
|
+
}): Promise<UploadMediaResult>;
|
|
11
|
+
export declare function downloadMedia(config: LansengerConfig, tokenManager: TokenManager, fetchFn: FetchFn, mediaId: string): Promise<DownloadMediaResult>;
|
|
12
|
+
export declare function downloadMediaToFile(config: LansengerConfig, tokenManager: TokenManager, fetchFn: FetchFn, mediaId: string, targetPath?: string, mediaType?: string): Promise<string>;
|
|
13
|
+
export declare function fetchMediaPath(config: LansengerConfig, appToken: string, mediaId: string, opts?: {
|
|
14
|
+
user_token?: string;
|
|
15
|
+
fetchFn?: FetchFn;
|
|
16
|
+
}): Promise<MediaPathResult>;
|
package/dist/media.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.uploadMedia = uploadMedia;
|
|
37
|
+
exports.uploadAppMedia = uploadAppMedia;
|
|
38
|
+
exports.downloadMedia = downloadMedia;
|
|
39
|
+
exports.downloadMediaToFile = downloadMediaToFile;
|
|
40
|
+
exports.fetchMediaPath = fetchMediaPath;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const urlHelpers_1 = require("./urlHelpers");
|
|
45
|
+
const http_1 = require("./http");
|
|
46
|
+
const constants_1 = require("./constants");
|
|
47
|
+
const models_1 = require("./models");
|
|
48
|
+
const exceptions_1 = require("./exceptions");
|
|
49
|
+
async function uploadMedia(config, tokenManager, fetchFn, filePath, mediaType = constants_1.MEDIA_TYPE_FILE, userToken = "") {
|
|
50
|
+
if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile())
|
|
51
|
+
return new models_1.UploadMediaResult({ success: false, error: `File not found: ${filePath}` });
|
|
52
|
+
let token;
|
|
53
|
+
try {
|
|
54
|
+
token = await tokenManager.getToken();
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
return new models_1.UploadMediaResult({ success: false, error: `Auth failed: ${e instanceof Error ? e.message : String(e)}` });
|
|
58
|
+
}
|
|
59
|
+
const url = (0, urlHelpers_1.buildApiUrl)(config, "media", "create", token, { userToken }) + `&type=${mediaType}`;
|
|
60
|
+
try {
|
|
61
|
+
const fileContent = fs.readFileSync(filePath);
|
|
62
|
+
const formData = new FormData();
|
|
63
|
+
formData.append("media", new Blob([fileContent]), path.basename(filePath));
|
|
64
|
+
const [data, httpErr] = await (0, http_1.doPostMultipart)(url, formData, fetchFn);
|
|
65
|
+
if (httpErr)
|
|
66
|
+
return new models_1.UploadMediaResult({ success: false, error: httpErr });
|
|
67
|
+
const errCode = data.errCode ?? -1;
|
|
68
|
+
if (errCode !== 0) {
|
|
69
|
+
const msg = data.errMsg || "Unknown upload error";
|
|
70
|
+
return new models_1.UploadMediaResult({ success: false, error: `Upload API error (errCode=${errCode}): ${msg}` });
|
|
71
|
+
}
|
|
72
|
+
const d = data.data || {};
|
|
73
|
+
if (!d.mediaId)
|
|
74
|
+
return new models_1.UploadMediaResult({ success: false, error: "Upload response missing mediaId" });
|
|
75
|
+
return new models_1.UploadMediaResult({ success: true, media_id: d.mediaId, created_time: d.createdTime });
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
return new models_1.UploadMediaResult({ success: false, error: `File read error: ${e instanceof Error ? e.message : String(e)}` });
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function uploadAppMedia(config, tokenManager, fetchFn, filePath, mediaType = constants_1.APP_MEDIA_TYPE_FILE, opts) {
|
|
82
|
+
if (!fs.existsSync(filePath) || !fs.statSync(filePath).isFile())
|
|
83
|
+
return new models_1.UploadMediaResult({ success: false, error: `File not found: ${filePath}` });
|
|
84
|
+
let token;
|
|
85
|
+
try {
|
|
86
|
+
token = await tokenManager.getToken();
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return new models_1.UploadMediaResult({ success: false, error: `Auth failed: ${e instanceof Error ? e.message : String(e)}` });
|
|
90
|
+
}
|
|
91
|
+
let url = (0, urlHelpers_1.buildApiUrl)(config, "media", "app_create", token) + `&type=${mediaType}`;
|
|
92
|
+
if (opts?.width != null)
|
|
93
|
+
url += `&width=${opts.width}`;
|
|
94
|
+
if (opts?.height != null)
|
|
95
|
+
url += `&height=${opts.height}`;
|
|
96
|
+
if (opts?.duration != null)
|
|
97
|
+
url += `&duration=${opts.duration}`;
|
|
98
|
+
try {
|
|
99
|
+
const fileContent = fs.readFileSync(filePath);
|
|
100
|
+
const formData = new FormData();
|
|
101
|
+
formData.append("media", new Blob([fileContent]), path.basename(filePath));
|
|
102
|
+
const [data, httpErr] = await (0, http_1.doPostMultipart)(url, formData, fetchFn);
|
|
103
|
+
if (httpErr)
|
|
104
|
+
return new models_1.UploadMediaResult({ success: false, error: httpErr });
|
|
105
|
+
const errCode = data.errCode ?? -1;
|
|
106
|
+
if (errCode !== 0) {
|
|
107
|
+
const msg = data.errMsg || "Unknown upload error";
|
|
108
|
+
return new models_1.UploadMediaResult({ success: false, error: `Upload API error (errCode=${errCode}): ${msg}` });
|
|
109
|
+
}
|
|
110
|
+
const d = data.data || {};
|
|
111
|
+
if (!d.mediaId)
|
|
112
|
+
return new models_1.UploadMediaResult({ success: false, error: "Upload response missing mediaId" });
|
|
113
|
+
return new models_1.UploadMediaResult({ success: true, media_id: d.mediaId });
|
|
114
|
+
}
|
|
115
|
+
catch (e) {
|
|
116
|
+
return new models_1.UploadMediaResult({ success: false, error: `File read error: ${e instanceof Error ? e.message : String(e)}` });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
async function downloadMedia(config, tokenManager, fetchFn, mediaId) {
|
|
120
|
+
let token;
|
|
121
|
+
try {
|
|
122
|
+
token = await tokenManager.getToken();
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
return new models_1.DownloadMediaResult({ success: false, error: `Auth failed: ${e instanceof Error ? e.message : String(e)}` });
|
|
126
|
+
}
|
|
127
|
+
const url = (0, urlHelpers_1.buildApiUrl)(config, "media", "fetch", token, { pathVars: { media_id: mediaId } });
|
|
128
|
+
try {
|
|
129
|
+
const response = await fetchFn(url);
|
|
130
|
+
if (!response.ok)
|
|
131
|
+
return new models_1.DownloadMediaResult({ success: false, error: `Download HTTP error: ${response.status}` });
|
|
132
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
133
|
+
return new models_1.DownloadMediaResult({ success: true, data: Buffer.from(arrayBuffer) });
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
return new models_1.DownloadMediaResult({ success: false, error: `Download HTTP error: ${e instanceof Error ? e.message : String(e)}` });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async function downloadMediaToFile(config, tokenManager, fetchFn, mediaId, targetPath, mediaType = "file") {
|
|
140
|
+
const result = await downloadMedia(config, tokenManager, fetchFn, mediaId);
|
|
141
|
+
if (!result.success || !result.data)
|
|
142
|
+
throw new exceptions_1.LansengerFileError(`Download failed: ${result.error}`);
|
|
143
|
+
const extMap = { image: ".jpg", video: ".mp4", file: ".dat", voice: ".amr" };
|
|
144
|
+
let ext = extMap[mediaType] || ".dat";
|
|
145
|
+
const mediaBytes = result.data;
|
|
146
|
+
if (mediaType === "image" && mediaBytes.length >= 8) {
|
|
147
|
+
if (mediaBytes[0] === 0xff && mediaBytes[1] === 0xd8)
|
|
148
|
+
ext = ".jpg";
|
|
149
|
+
else if (mediaBytes.slice(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])))
|
|
150
|
+
ext = ".png";
|
|
151
|
+
}
|
|
152
|
+
if (!targetPath) {
|
|
153
|
+
const tmpDir = os.tmpdir();
|
|
154
|
+
targetPath = path.join(tmpDir, `lansenger_${mediaType}_${mediaId}${ext}`);
|
|
155
|
+
}
|
|
156
|
+
fs.writeFileSync(targetPath, mediaBytes);
|
|
157
|
+
return targetPath;
|
|
158
|
+
}
|
|
159
|
+
async function fetchMediaPath(config, appToken, mediaId, opts) {
|
|
160
|
+
if (!mediaId)
|
|
161
|
+
return new models_1.MediaPathResult({ success: false, error: "media_id is required" });
|
|
162
|
+
const userToken = opts?.user_token || "";
|
|
163
|
+
const url = (0, urlHelpers_1.buildApiUrl)(config, "media", "path_fetch", appToken, { userToken, pathVars: { media_id: mediaId } });
|
|
164
|
+
const [data, httpErr] = await (0, http_1.doGet)(url, opts?.fetchFn);
|
|
165
|
+
if (httpErr)
|
|
166
|
+
return new models_1.MediaPathResult({ success: false, error: httpErr });
|
|
167
|
+
const errCode = data.errCode ?? -1;
|
|
168
|
+
if (errCode !== 0) {
|
|
169
|
+
const msg = data.errMsg || "Unknown error";
|
|
170
|
+
return new models_1.MediaPathResult({ success: false, error: `API error (errCode=${errCode}): ${msg}` });
|
|
171
|
+
}
|
|
172
|
+
const d = data.data || {};
|
|
173
|
+
return new models_1.MediaPathResult({
|
|
174
|
+
success: true, media_path: d.mediaPath, name: d.name,
|
|
175
|
+
type: d.type, size: d.size, raw_response: data,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=media.js.map
|