@cored-im/openapi-sdk 0.28.102
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 +201 -0
- package/README.md +114 -0
- package/dist/index.cjs +1493 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +387 -0
- package/dist/index.d.ts +387 -0
- package/dist/index.js +1463 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
- package/src/client.ts +85 -0
- package/src/core/api_client.ts +344 -0
- package/src/core/config.ts +25 -0
- package/src/core/consts.ts +8 -0
- package/src/core/crypto.ts +212 -0
- package/src/core/http_client.ts +25 -0
- package/src/core/logger.ts +37 -0
- package/src/core/time_manager.ts +28 -0
- package/src/core/types.ts +72 -0
- package/src/core/version.ts +5 -0
- package/src/core/ws_client.ts +423 -0
- package/src/index.ts +19 -0
- package/src/internal/transport.ts +507 -0
- package/src/service/im/index.ts +11 -0
- package/src/service/im/v1/chat.ts +41 -0
- package/src/service/im/v1/chat_model.ts +19 -0
- package/src/service/im/v1/index.ts +9 -0
- package/src/service/im/v1/message.ts +59 -0
- package/src/service/im/v1/message_enum.ts +20 -0
- package/src/service/im/v1/message_event.ts +40 -0
- package/src/service/im/v1/message_model.ts +259 -0
- package/src/service/im/v1/v1.ts +14 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
// Copyright (c) 2026 Cored Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// Self-contained protobuf encode/decode for transport.proto.
|
|
5
|
+
// Implements minimal protobuf wire format (varint + length-delimited) with zero dependencies.
|
|
6
|
+
|
|
7
|
+
// ---- Minimal Protobuf Writer ----
|
|
8
|
+
|
|
9
|
+
class ProtoWriter {
|
|
10
|
+
private buf: Uint8Array;
|
|
11
|
+
private pos = 0;
|
|
12
|
+
private forkStack: number[] = [];
|
|
13
|
+
|
|
14
|
+
constructor() {
|
|
15
|
+
this.buf = new Uint8Array(256);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
private grow(need: number): void {
|
|
19
|
+
if (this.pos + need <= this.buf.length) return;
|
|
20
|
+
let newLen = this.buf.length * 2;
|
|
21
|
+
while (newLen < this.pos + need) newLen *= 2;
|
|
22
|
+
const next = new Uint8Array(newLen);
|
|
23
|
+
next.set(this.buf);
|
|
24
|
+
this.buf = next;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
uint32(value: number): this {
|
|
28
|
+
this.grow(5);
|
|
29
|
+
value >>>= 0;
|
|
30
|
+
while (value > 127) {
|
|
31
|
+
this.buf[this.pos++] = (value & 0x7f) | 0x80;
|
|
32
|
+
value >>>= 7;
|
|
33
|
+
}
|
|
34
|
+
this.buf[this.pos++] = value;
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
uint64(value: number): this {
|
|
39
|
+
// Handle numbers up to 2^53 (safe integer range)
|
|
40
|
+
this.grow(10);
|
|
41
|
+
let lo = value >>> 0;
|
|
42
|
+
let hi = ((value - lo) / 0x100000000) >>> 0;
|
|
43
|
+
while (hi > 0) {
|
|
44
|
+
this.buf[this.pos++] = (lo & 0x7f) | 0x80;
|
|
45
|
+
lo = ((lo >>> 7) | (hi << 25)) >>> 0;
|
|
46
|
+
hi >>>= 7;
|
|
47
|
+
}
|
|
48
|
+
while (lo > 127) {
|
|
49
|
+
this.buf[this.pos++] = (lo & 0x7f) | 0x80;
|
|
50
|
+
lo >>>= 7;
|
|
51
|
+
}
|
|
52
|
+
this.buf[this.pos++] = lo;
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
int32(value: number): this {
|
|
57
|
+
if (value >= 0) return this.uint32(value);
|
|
58
|
+
// Negative int32 is encoded as 10-byte varint (sign-extended to 64 bits)
|
|
59
|
+
this.grow(10);
|
|
60
|
+
for (let i = 0; i < 9; i++) {
|
|
61
|
+
this.buf[this.pos++] = (value & 0x7f) | 0x80;
|
|
62
|
+
value >>= 7;
|
|
63
|
+
}
|
|
64
|
+
this.buf[this.pos++] = 1; // sign bit
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
bytes(value: Uint8Array): this {
|
|
69
|
+
this.uint32(value.length);
|
|
70
|
+
this.grow(value.length);
|
|
71
|
+
this.buf.set(value, this.pos);
|
|
72
|
+
this.pos += value.length;
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
string(value: string): this {
|
|
77
|
+
const encoded = textEncoder.encode(value);
|
|
78
|
+
return this.bytes(encoded);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Start a nested sub-message. Call ldelim() to close it. */
|
|
82
|
+
fork(): this {
|
|
83
|
+
this.forkStack.push(this.pos);
|
|
84
|
+
// Reserve space — we'll patch the length in ldelim()
|
|
85
|
+
this.grow(5);
|
|
86
|
+
this.pos += 5; // max varint32 length
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Close a fork: writes the sub-message length prefix. */
|
|
91
|
+
ldelim(): this {
|
|
92
|
+
const startPos = this.forkStack.pop()!;
|
|
93
|
+
const contentStart = startPos + 5; // content was written after the 5-byte reservation
|
|
94
|
+
const contentLen = this.pos - contentStart;
|
|
95
|
+
// Encode the length as varint
|
|
96
|
+
const lenBytes: number[] = [];
|
|
97
|
+
let v = contentLen;
|
|
98
|
+
while (v > 127) {
|
|
99
|
+
lenBytes.push((v & 0x7f) | 0x80);
|
|
100
|
+
v >>>= 7;
|
|
101
|
+
}
|
|
102
|
+
lenBytes.push(v);
|
|
103
|
+
// Move content to sit right after the length varint
|
|
104
|
+
const newContentStart = startPos + lenBytes.length;
|
|
105
|
+
this.buf.copyWithin(newContentStart, contentStart, this.pos);
|
|
106
|
+
// Write length varint at startPos
|
|
107
|
+
for (let i = 0; i < lenBytes.length; i++) {
|
|
108
|
+
this.buf[startPos + i] = lenBytes[i];
|
|
109
|
+
}
|
|
110
|
+
this.pos = newContentStart + contentLen;
|
|
111
|
+
return this;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
finish(): Uint8Array {
|
|
115
|
+
return this.buf.slice(0, this.pos);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// ---- Minimal Protobuf Reader ----
|
|
120
|
+
|
|
121
|
+
class ProtoReader {
|
|
122
|
+
private buf: Uint8Array;
|
|
123
|
+
pos: number;
|
|
124
|
+
len: number;
|
|
125
|
+
|
|
126
|
+
constructor(data: Uint8Array) {
|
|
127
|
+
this.buf = data;
|
|
128
|
+
this.pos = 0;
|
|
129
|
+
this.len = data.length;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
uint32(): number {
|
|
133
|
+
let value = 0;
|
|
134
|
+
let shift = 0;
|
|
135
|
+
let b: number;
|
|
136
|
+
do {
|
|
137
|
+
b = this.buf[this.pos++];
|
|
138
|
+
value |= (b & 0x7f) << shift;
|
|
139
|
+
shift += 7;
|
|
140
|
+
} while (b & 0x80);
|
|
141
|
+
return value >>> 0;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
uint64(): number {
|
|
145
|
+
// Read varint as a JS number (safe up to 2^53)
|
|
146
|
+
let lo = 0;
|
|
147
|
+
let hi = 0;
|
|
148
|
+
let shift = 0;
|
|
149
|
+
let b: number;
|
|
150
|
+
// Read low 28 bits
|
|
151
|
+
for (let i = 0; i < 4; i++) {
|
|
152
|
+
b = this.buf[this.pos++];
|
|
153
|
+
lo |= (b & 0x7f) << shift;
|
|
154
|
+
shift += 7;
|
|
155
|
+
if (!(b & 0x80)) return lo >>> 0;
|
|
156
|
+
}
|
|
157
|
+
// 5th byte spans lo/hi
|
|
158
|
+
b = this.buf[this.pos++];
|
|
159
|
+
lo |= (b & 0x7f) << 28;
|
|
160
|
+
hi = (b & 0x7f) >> 4;
|
|
161
|
+
if (!(b & 0x80)) return (hi * 0x100000000 + (lo >>> 0));
|
|
162
|
+
shift = 3;
|
|
163
|
+
// Read remaining high bits
|
|
164
|
+
do {
|
|
165
|
+
b = this.buf[this.pos++];
|
|
166
|
+
hi |= (b & 0x7f) << shift;
|
|
167
|
+
shift += 7;
|
|
168
|
+
} while (b & 0x80);
|
|
169
|
+
return (hi >>> 0) * 0x100000000 + (lo >>> 0);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
int32(): number {
|
|
173
|
+
return this.uint32() | 0;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
bytes(): Uint8Array {
|
|
177
|
+
const len = this.uint32();
|
|
178
|
+
const value = this.buf.slice(this.pos, this.pos + len);
|
|
179
|
+
this.pos += len;
|
|
180
|
+
return value;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
string(): string {
|
|
184
|
+
const bytes = this.bytes();
|
|
185
|
+
return textDecoder.decode(bytes);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
skipType(wireType: number): void {
|
|
189
|
+
switch (wireType) {
|
|
190
|
+
case 0: // varint
|
|
191
|
+
while (this.buf[this.pos++] & 0x80) { /* skip */ }
|
|
192
|
+
break;
|
|
193
|
+
case 1: // 64-bit
|
|
194
|
+
this.pos += 8;
|
|
195
|
+
break;
|
|
196
|
+
case 2: // length-delimited
|
|
197
|
+
this.pos += this.uint32();
|
|
198
|
+
break;
|
|
199
|
+
case 5: // 32-bit
|
|
200
|
+
this.pos += 4;
|
|
201
|
+
break;
|
|
202
|
+
default:
|
|
203
|
+
throw new Error(`unknown wire type: ${wireType}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const textEncoder = new TextEncoder();
|
|
209
|
+
const textDecoder = new TextDecoder();
|
|
210
|
+
|
|
211
|
+
// ---- SecureMessage ----
|
|
212
|
+
|
|
213
|
+
export interface SecureMessage {
|
|
214
|
+
version: string;
|
|
215
|
+
timestamp: number;
|
|
216
|
+
nonce: string;
|
|
217
|
+
encryptedKey: Uint8Array;
|
|
218
|
+
encryptedData: Uint8Array;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function encodeSecureMessage(msg: SecureMessage): Uint8Array {
|
|
222
|
+
const w = new ProtoWriter();
|
|
223
|
+
if (msg.version) w.uint32(10).string(msg.version);
|
|
224
|
+
if (msg.timestamp) w.uint32(16).uint64(msg.timestamp);
|
|
225
|
+
if (msg.nonce) w.uint32(26).string(msg.nonce);
|
|
226
|
+
if (msg.encryptedKey?.length) w.uint32(34).bytes(msg.encryptedKey);
|
|
227
|
+
if (msg.encryptedData?.length) w.uint32(42).bytes(msg.encryptedData);
|
|
228
|
+
return w.finish();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function decodeSecureMessage(data: Uint8Array): SecureMessage {
|
|
232
|
+
const r = new ProtoReader(data);
|
|
233
|
+
const msg: SecureMessage = { version: '', timestamp: 0, nonce: '', encryptedKey: new Uint8Array(0), encryptedData: new Uint8Array(0) };
|
|
234
|
+
while (r.pos < r.len) {
|
|
235
|
+
const tag = r.uint32();
|
|
236
|
+
switch (tag >>> 3) {
|
|
237
|
+
case 1: msg.version = r.string(); break;
|
|
238
|
+
case 2: msg.timestamp = r.uint64(); break;
|
|
239
|
+
case 3: msg.nonce = r.string(); break;
|
|
240
|
+
case 4: msg.encryptedKey = r.bytes(); break;
|
|
241
|
+
case 5: msg.encryptedData = r.bytes(); break;
|
|
242
|
+
default: r.skipType(tag & 7); break;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return msg;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ---- HttpRequest ----
|
|
249
|
+
|
|
250
|
+
export interface HttpRequest {
|
|
251
|
+
method: string;
|
|
252
|
+
path: string;
|
|
253
|
+
headers: Record<string, string>;
|
|
254
|
+
body: Uint8Array;
|
|
255
|
+
reqId: string;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export function encodeHttpRequest(msg: HttpRequest): Uint8Array {
|
|
259
|
+
const w = new ProtoWriter();
|
|
260
|
+
if (msg.method) w.uint32(10).string(msg.method);
|
|
261
|
+
if (msg.path) w.uint32(18).string(msg.path);
|
|
262
|
+
if (msg.headers) {
|
|
263
|
+
for (const [k, v] of Object.entries(msg.headers)) {
|
|
264
|
+
w.uint32(26).fork().uint32(10).string(k).uint32(18).string(v).ldelim();
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (msg.body?.length) w.uint32(34).bytes(msg.body);
|
|
268
|
+
if (msg.reqId) w.uint32(42).string(msg.reqId);
|
|
269
|
+
return w.finish();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
export function decodeHttpRequest(data: Uint8Array): HttpRequest {
|
|
273
|
+
const r = new ProtoReader(data);
|
|
274
|
+
const msg: HttpRequest = { method: '', path: '', headers: {}, body: new Uint8Array(0), reqId: '' };
|
|
275
|
+
while (r.pos < r.len) {
|
|
276
|
+
const tag = r.uint32();
|
|
277
|
+
switch (tag >>> 3) {
|
|
278
|
+
case 1: msg.method = r.string(); break;
|
|
279
|
+
case 2: msg.path = r.string(); break;
|
|
280
|
+
case 3: {
|
|
281
|
+
const entryEnd = r.uint32() + r.pos;
|
|
282
|
+
let key = '', value = '';
|
|
283
|
+
while (r.pos < entryEnd) {
|
|
284
|
+
const entryTag = r.uint32();
|
|
285
|
+
switch (entryTag >>> 3) {
|
|
286
|
+
case 1: key = r.string(); break;
|
|
287
|
+
case 2: value = r.string(); break;
|
|
288
|
+
default: r.skipType(entryTag & 7); break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
msg.headers[key] = value;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case 4: msg.body = r.bytes(); break;
|
|
295
|
+
case 5: msg.reqId = r.string(); break;
|
|
296
|
+
default: r.skipType(tag & 7); break;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return msg;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// ---- HttpResponse ----
|
|
303
|
+
|
|
304
|
+
export interface HttpResponse {
|
|
305
|
+
statusCode: number;
|
|
306
|
+
statusText: string;
|
|
307
|
+
headers: Record<string, string>;
|
|
308
|
+
body: Uint8Array;
|
|
309
|
+
reqId: string;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export function decodeHttpResponse(data: Uint8Array): HttpResponse {
|
|
313
|
+
const r = new ProtoReader(data);
|
|
314
|
+
const msg: HttpResponse = { statusCode: 0, statusText: '', headers: {}, body: new Uint8Array(0), reqId: '' };
|
|
315
|
+
while (r.pos < r.len) {
|
|
316
|
+
const tag = r.uint32();
|
|
317
|
+
switch (tag >>> 3) {
|
|
318
|
+
case 1: msg.statusCode = r.int32(); break;
|
|
319
|
+
case 2: msg.statusText = r.string(); break;
|
|
320
|
+
case 3: {
|
|
321
|
+
const entryEnd = r.uint32() + r.pos;
|
|
322
|
+
let key = '', value = '';
|
|
323
|
+
while (r.pos < entryEnd) {
|
|
324
|
+
const entryTag = r.uint32();
|
|
325
|
+
switch (entryTag >>> 3) {
|
|
326
|
+
case 1: key = r.string(); break;
|
|
327
|
+
case 2: value = r.string(); break;
|
|
328
|
+
default: r.skipType(entryTag & 7); break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
msg.headers[key] = value;
|
|
332
|
+
break;
|
|
333
|
+
}
|
|
334
|
+
case 4: msg.body = r.bytes(); break;
|
|
335
|
+
case 5: msg.reqId = r.string(); break;
|
|
336
|
+
default: r.skipType(tag & 7); break;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return msg;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// ---- WebSocketMessage ----
|
|
343
|
+
|
|
344
|
+
export interface EventHeader {
|
|
345
|
+
eventId: string;
|
|
346
|
+
eventType: string;
|
|
347
|
+
eventCreatedAt: number;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export interface WsEvent {
|
|
351
|
+
eventHeader?: EventHeader;
|
|
352
|
+
eventBody: Uint8Array;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
export interface WebSocketMessage {
|
|
356
|
+
ping?: { timestamp: number };
|
|
357
|
+
pong?: { timestamp: number };
|
|
358
|
+
initRequest?: { userAgent: string };
|
|
359
|
+
initResponse?: Record<string, never>;
|
|
360
|
+
event?: WsEvent;
|
|
361
|
+
eventAck?: { eventId: string };
|
|
362
|
+
httpRequest?: HttpRequest;
|
|
363
|
+
httpResponse?: HttpResponse;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
export function encodeWebSocketMessage(msg: WebSocketMessage): Uint8Array {
|
|
367
|
+
const w = new ProtoWriter();
|
|
368
|
+
if (msg.ping) {
|
|
369
|
+
w.uint32(10).fork();
|
|
370
|
+
if (msg.ping.timestamp) w.uint32(8).uint64(msg.ping.timestamp);
|
|
371
|
+
w.ldelim();
|
|
372
|
+
}
|
|
373
|
+
if (msg.pong) {
|
|
374
|
+
w.uint32(18).fork();
|
|
375
|
+
if (msg.pong.timestamp) w.uint32(8).uint64(msg.pong.timestamp);
|
|
376
|
+
w.ldelim();
|
|
377
|
+
}
|
|
378
|
+
if (msg.initRequest) {
|
|
379
|
+
w.uint32(26).fork();
|
|
380
|
+
if (msg.initRequest.userAgent) w.uint32(10).string(msg.initRequest.userAgent);
|
|
381
|
+
w.ldelim();
|
|
382
|
+
}
|
|
383
|
+
if (msg.initResponse) {
|
|
384
|
+
w.uint32(34).fork().ldelim();
|
|
385
|
+
}
|
|
386
|
+
if (msg.event) {
|
|
387
|
+
w.uint32(42).fork();
|
|
388
|
+
if (msg.event.eventHeader) {
|
|
389
|
+
w.uint32(10).fork();
|
|
390
|
+
if (msg.event.eventHeader.eventId) w.uint32(10).string(msg.event.eventHeader.eventId);
|
|
391
|
+
if (msg.event.eventHeader.eventType) w.uint32(18).string(msg.event.eventHeader.eventType);
|
|
392
|
+
if (msg.event.eventHeader.eventCreatedAt) w.uint32(24).uint64(msg.event.eventHeader.eventCreatedAt);
|
|
393
|
+
w.ldelim();
|
|
394
|
+
}
|
|
395
|
+
if (msg.event.eventBody?.length) w.uint32(18).bytes(msg.event.eventBody);
|
|
396
|
+
w.ldelim();
|
|
397
|
+
}
|
|
398
|
+
if (msg.eventAck) {
|
|
399
|
+
w.uint32(50).fork();
|
|
400
|
+
if (msg.eventAck.eventId) w.uint32(10).string(msg.eventAck.eventId);
|
|
401
|
+
w.ldelim();
|
|
402
|
+
}
|
|
403
|
+
if (msg.httpRequest) {
|
|
404
|
+
w.uint32(58).bytes(encodeHttpRequest(msg.httpRequest));
|
|
405
|
+
}
|
|
406
|
+
return w.finish();
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export function decodeWebSocketMessage(data: Uint8Array): WebSocketMessage {
|
|
410
|
+
const r = new ProtoReader(data);
|
|
411
|
+
const msg: WebSocketMessage = {};
|
|
412
|
+
while (r.pos < r.len) {
|
|
413
|
+
const tag = r.uint32();
|
|
414
|
+
switch (tag >>> 3) {
|
|
415
|
+
case 1: { // ping
|
|
416
|
+
const subEnd = r.uint32() + r.pos;
|
|
417
|
+
const ping = { timestamp: 0 };
|
|
418
|
+
while (r.pos < subEnd) {
|
|
419
|
+
const subTag = r.uint32();
|
|
420
|
+
if ((subTag >>> 3) === 1) ping.timestamp = r.uint64();
|
|
421
|
+
else r.skipType(subTag & 7);
|
|
422
|
+
}
|
|
423
|
+
msg.ping = ping;
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
case 2: { // pong
|
|
427
|
+
const subEnd = r.uint32() + r.pos;
|
|
428
|
+
const pong = { timestamp: 0 };
|
|
429
|
+
while (r.pos < subEnd) {
|
|
430
|
+
const subTag = r.uint32();
|
|
431
|
+
if ((subTag >>> 3) === 1) pong.timestamp = r.uint64();
|
|
432
|
+
else r.skipType(subTag & 7);
|
|
433
|
+
}
|
|
434
|
+
msg.pong = pong;
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
case 3: { // initRequest
|
|
438
|
+
const subEnd = r.uint32() + r.pos;
|
|
439
|
+
const initReq = { userAgent: '' };
|
|
440
|
+
while (r.pos < subEnd) {
|
|
441
|
+
const subTag = r.uint32();
|
|
442
|
+
if ((subTag >>> 3) === 1) initReq.userAgent = r.string();
|
|
443
|
+
else r.skipType(subTag & 7);
|
|
444
|
+
}
|
|
445
|
+
msg.initRequest = initReq;
|
|
446
|
+
break;
|
|
447
|
+
}
|
|
448
|
+
case 4: { // initResponse
|
|
449
|
+
const subEnd = r.uint32() + r.pos;
|
|
450
|
+
r.pos = subEnd;
|
|
451
|
+
msg.initResponse = {};
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
case 5: { // event
|
|
455
|
+
const subEnd = r.uint32() + r.pos;
|
|
456
|
+
const event: WsEvent = { eventBody: new Uint8Array(0) };
|
|
457
|
+
while (r.pos < subEnd) {
|
|
458
|
+
const subTag = r.uint32();
|
|
459
|
+
switch (subTag >>> 3) {
|
|
460
|
+
case 1: {
|
|
461
|
+
const headerEnd = r.uint32() + r.pos;
|
|
462
|
+
const header: EventHeader = { eventId: '', eventType: '', eventCreatedAt: 0 };
|
|
463
|
+
while (r.pos < headerEnd) {
|
|
464
|
+
const hTag = r.uint32();
|
|
465
|
+
switch (hTag >>> 3) {
|
|
466
|
+
case 1: header.eventId = r.string(); break;
|
|
467
|
+
case 2: header.eventType = r.string(); break;
|
|
468
|
+
case 3: header.eventCreatedAt = r.uint64(); break;
|
|
469
|
+
default: r.skipType(hTag & 7); break;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
event.eventHeader = header;
|
|
473
|
+
break;
|
|
474
|
+
}
|
|
475
|
+
case 2: event.eventBody = r.bytes(); break;
|
|
476
|
+
default: r.skipType(subTag & 7); break;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
msg.event = event;
|
|
480
|
+
break;
|
|
481
|
+
}
|
|
482
|
+
case 6: { // eventAck
|
|
483
|
+
const subEnd = r.uint32() + r.pos;
|
|
484
|
+
const ack = { eventId: '' };
|
|
485
|
+
while (r.pos < subEnd) {
|
|
486
|
+
const subTag = r.uint32();
|
|
487
|
+
if ((subTag >>> 3) === 1) ack.eventId = r.string();
|
|
488
|
+
else r.skipType(subTag & 7);
|
|
489
|
+
}
|
|
490
|
+
msg.eventAck = ack;
|
|
491
|
+
break;
|
|
492
|
+
}
|
|
493
|
+
case 7: {
|
|
494
|
+
const bytes = r.bytes();
|
|
495
|
+
msg.httpRequest = decodeHttpRequest(bytes);
|
|
496
|
+
break;
|
|
497
|
+
}
|
|
498
|
+
case 8: {
|
|
499
|
+
const bytes = r.bytes();
|
|
500
|
+
msg.httpResponse = decodeHttpResponse(bytes);
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
default: r.skipType(tag & 7); break;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return msg;
|
|
507
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
import type { Config } from '@/core/config';
|
|
3
|
+
import { V1 } from './v1/index';
|
|
4
|
+
|
|
5
|
+
export class Service {
|
|
6
|
+
public readonly v1: V1;
|
|
7
|
+
|
|
8
|
+
constructor(config: Config) {
|
|
9
|
+
this.v1 = new V1(config);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
import type { Config } from '@/core/config';
|
|
3
|
+
import type { CreateTypingReq, CreateTypingResp, DeleteTypingReq, DeleteTypingResp } from './chat_model';
|
|
4
|
+
|
|
5
|
+
export class Chat {
|
|
6
|
+
private readonly config: Config;
|
|
7
|
+
|
|
8
|
+
constructor(config: Config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Set typing status
|
|
14
|
+
*
|
|
15
|
+
* Set the typing status, lasts only 5 seconds, direct messages only
|
|
16
|
+
*/
|
|
17
|
+
async createTyping(req: CreateTypingReq): Promise<CreateTypingResp> {
|
|
18
|
+
const resp = await this.config.apiClient.request({
|
|
19
|
+
method: 'POST',
|
|
20
|
+
path: `/oapi/im/v1/chats/${req.chat_id ?? ''}/typing`,
|
|
21
|
+
body: req,
|
|
22
|
+
withAppAccessToken: true,
|
|
23
|
+
});
|
|
24
|
+
return await resp.json() as CreateTypingResp;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Clear typing status
|
|
29
|
+
*
|
|
30
|
+
* Direct messages only
|
|
31
|
+
*/
|
|
32
|
+
async deleteTyping(req: DeleteTypingReq): Promise<DeleteTypingResp> {
|
|
33
|
+
const resp = await this.config.apiClient.request({
|
|
34
|
+
method: 'DELETE',
|
|
35
|
+
path: `/oapi/im/v1/chats/${req.chat_id ?? ''}/typing`,
|
|
36
|
+
body: req,
|
|
37
|
+
withAppAccessToken: true,
|
|
38
|
+
});
|
|
39
|
+
return await resp.json() as DeleteTypingResp;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
|
|
3
|
+
/** Set typing status (Request) */
|
|
4
|
+
export interface CreateTypingReq {
|
|
5
|
+
chat_id?: string; // Chat ID
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/** Set typing status (Response) */
|
|
9
|
+
export interface CreateTypingResp {
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Clear typing status (Request) */
|
|
13
|
+
export interface DeleteTypingReq {
|
|
14
|
+
chat_id?: string; // Chat ID
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Clear typing status (Response) */
|
|
18
|
+
export interface DeleteTypingResp {
|
|
19
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
export { V1 } from './v1';
|
|
3
|
+
export { Chat } from './chat';
|
|
4
|
+
export * from './chat_model';
|
|
5
|
+
export { Message } from './message';
|
|
6
|
+
export * from './message_model';
|
|
7
|
+
export { MessageEvent } from './message_event';
|
|
8
|
+
export type * from './message_event';
|
|
9
|
+
export * from './message_enum';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
import type { Config } from '@/core/config';
|
|
3
|
+
import { MessageEvent } from './message_event';
|
|
4
|
+
import type { GetMessageReq, GetMessageResp, ReadMessageReq, ReadMessageResp, RecallMessageReq, RecallMessageResp, SendMessageReq, SendMessageResp } from './message_model';
|
|
5
|
+
|
|
6
|
+
export class Message {
|
|
7
|
+
private readonly config: Config;
|
|
8
|
+
public readonly Event: MessageEvent;
|
|
9
|
+
|
|
10
|
+
constructor(config: Config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this.Event = new MessageEvent(config);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Send a message */
|
|
16
|
+
async sendMessage(req: SendMessageReq): Promise<SendMessageResp> {
|
|
17
|
+
const resp = await this.config.apiClient.request({
|
|
18
|
+
method: 'POST',
|
|
19
|
+
path: '/oapi/im/v1/messages',
|
|
20
|
+
body: req,
|
|
21
|
+
withAppAccessToken: true,
|
|
22
|
+
withWebSocket: true,
|
|
23
|
+
});
|
|
24
|
+
return await resp.json() as SendMessageResp;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Get a message */
|
|
28
|
+
async getMessage(req: GetMessageReq): Promise<GetMessageResp> {
|
|
29
|
+
const resp = await this.config.apiClient.request({
|
|
30
|
+
method: 'GET',
|
|
31
|
+
path: `/oapi/im/v1/messages/${req.message_id ?? ''}`,
|
|
32
|
+
body: req,
|
|
33
|
+
withAppAccessToken: true,
|
|
34
|
+
});
|
|
35
|
+
return await resp.json() as GetMessageResp;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Recall a message */
|
|
39
|
+
async recallMessage(req: RecallMessageReq): Promise<RecallMessageResp> {
|
|
40
|
+
const resp = await this.config.apiClient.request({
|
|
41
|
+
method: 'POST',
|
|
42
|
+
path: `/oapi/im/v1/messages/${req.message_id ?? ''}/recall`,
|
|
43
|
+
body: req,
|
|
44
|
+
withAppAccessToken: true,
|
|
45
|
+
});
|
|
46
|
+
return await resp.json() as RecallMessageResp;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Mark message as read */
|
|
50
|
+
async readMessage(req: ReadMessageReq): Promise<ReadMessageResp> {
|
|
51
|
+
const resp = await this.config.apiClient.request({
|
|
52
|
+
method: 'POST',
|
|
53
|
+
path: `/oapi/im/v1/messages/${req.message_id ?? ''}/read`,
|
|
54
|
+
body: req,
|
|
55
|
+
withAppAccessToken: true,
|
|
56
|
+
});
|
|
57
|
+
return await resp.json() as ReadMessageResp;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Code generated by Cored SDK Generator. DO NOT EDIT.
|
|
2
|
+
|
|
3
|
+
/** Message type */
|
|
4
|
+
export const MessageType_TEXT = 'text'; // Text
|
|
5
|
+
export const MessageType_IMAGE = 'image'; // Image
|
|
6
|
+
export const MessageType_STICKER = 'sticker'; // Sticker
|
|
7
|
+
export const MessageType_VIDEO = 'video'; // Video
|
|
8
|
+
export const MessageType_AUDIO = 'audio'; // Audio
|
|
9
|
+
export const MessageType_FILE = 'file'; // File
|
|
10
|
+
export const MessageType_USER_CARD = 'user_card'; // User card
|
|
11
|
+
export const MessageType_GROUP_CARD = 'group_card'; // Group card
|
|
12
|
+
export const MessageType_GROUP_ANNOUNCEMENT = 'group_announcement'; // Group announcement
|
|
13
|
+
export const MessageType_CARD = 'card'; // Card
|
|
14
|
+
|
|
15
|
+
/** Attachment type */
|
|
16
|
+
export const MessageTextAttachmentType_IMAGE = 'image'; // Image
|
|
17
|
+
|
|
18
|
+
/** Message status */
|
|
19
|
+
export const MessageStatus_VISIBLE = 'visible'; // Visible
|
|
20
|
+
export const MessageStatus_RECALLED = 'recalled'; // Recalled
|