@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/types.ts","../src/core/version.ts","../src/core/consts.ts","../src/core/crypto.ts","../src/internal/transport.ts","../src/core/ws_client.ts","../src/core/api_client.ts","../src/core/http_client.ts","../src/core/logger.ts","../src/core/time_manager.ts","../src/service/im/v1/chat.ts","../src/service/im/v1/message_event.ts","../src/service/im/v1/message.ts","../src/service/im/v1/v1.ts","../src/service/im/index.ts","../src/client.ts"],"sourcesContent":["// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\n/** 64-bit integer represented as string to avoid precision loss */\nexport type Int64 = string;\n\nexport interface ApiRequest {\n method: string;\n path: string;\n pathParams?: Record<string, string>;\n queryParams?: Record<string, string>;\n headerParams?: Record<string, string>;\n body?: unknown;\n stream?: ReadableStream<Uint8Array> | null;\n withAppAccessToken?: boolean;\n withWebSocket?: boolean;\n}\n\nexport interface ApiResponse {\n json(): Promise<unknown>;\n body(): Promise<Uint8Array>;\n}\n\nexport interface ApiError {\n code: number;\n msg: string;\n log_id: string;\n data?: unknown;\n}\n\nexport interface ApiClient {\n preheat(): Promise<void>;\n request(req: ApiRequest): Promise<ApiResponse>;\n onEvent(eventType: string, handler: WrappedEventHandler): void;\n offEvent(eventType: string, handler: WrappedEventHandler): void;\n close(): Promise<void>;\n}\n\nexport interface EventHeader {\n event_id: string;\n event_type: string;\n event_created_at: Int64;\n}\n\nexport type WrappedEventHandler = (header: EventHeader, body: Uint8Array | string) => void;\n\nexport type Marshaller = (v: unknown) => string;\nexport type Unmarshaller = (data: string) => unknown;\n\nexport interface HttpClient {\n fetch(url: string, init: RequestInit): Promise<Response>;\n}\n\nexport interface Logger {\n debug(msg: string, ...args: unknown[]): void;\n info(msg: string, ...args: unknown[]): void;\n warn(msg: string, ...args: unknown[]): void;\n error(msg: string, ...args: unknown[]): void;\n}\n\nexport enum LoggerLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n}\n\nexport interface TimeManager {\n getSystemTimestamp(): number;\n getServerTimestamp(): number;\n syncServerTimestamp(timestamp: number): void;\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nexport const VERSION = '0.28.102';\nexport const USER_AGENT = 'cored-openapi-sdk-js/0.28.102';\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nexport const DEFAULT_PING_PATH = '/oapi/stat/v1/ping';\nexport const DEFAULT_TOKEN_PATH = '/oapi/auth/v1/app/token';\nexport const DEFAULT_GATEWAY_PATH = '/oapi/transport/v1/gateway';\nexport const DEFAULT_WS_PATH = '/oapi/transport/v1/ws';\nexport const DEFAULT_SECURE_VERSION = '1.0';\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from './config';\nimport type { SecureMessage } from '@/internal/transport';\nimport { DEFAULT_SECURE_VERSION } from './consts';\n\nconst ALPHANUMERIC = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport class CryptoManager {\n private config: Config;\n private prefix: string;\n private counter: number[] = [0, 0, 0, 0, 0];\n\n constructor(config: Config) {\n this.config = config;\n this.prefix = randomAlphanumeric(6);\n }\n\n async encryptMessage(secret: string, data: Uint8Array): Promise<SecureMessage> {\n const timestamp = this.config.timeManager.getServerTimestamp();\n const nonce = this.getNonce();\n\n // Derive initKey = SHA256(timestamp:secret:nonce)\n const initKey = await sha256Bytes(`${timestamp}:${secret}:${nonce}`);\n\n // Generate random AES key\n const aesKey = randomBytes(32);\n\n // Compress data with gzip\n const compressed = await compressGzip(data);\n\n // Encrypt AES key with initKey\n const encryptedKey = await encryptAES256CBC(aesKey, initKey);\n\n // Encrypt compressed data with AES key\n const encryptedData = await encryptAES256CBC(compressed, aesKey);\n\n return {\n version: DEFAULT_SECURE_VERSION,\n timestamp,\n nonce,\n encryptedKey,\n encryptedData,\n };\n }\n\n async decryptMessage(secret: string, message: SecureMessage): Promise<Uint8Array> {\n if (message.version !== DEFAULT_SECURE_VERSION) {\n throw new Error(`unsupported secure message version: ${message.version}`);\n }\n\n // Derive initKey\n const initKey = await sha256Bytes(`${message.timestamp}:${secret}:${message.nonce}`);\n\n // Decrypt AES key\n const aesKey = await decryptAES256CBC(message.encryptedKey, initKey);\n\n // Decrypt data\n const compressed = await decryptAES256CBC(message.encryptedData, aesKey);\n\n // Decompress\n return await decompressGzip(compressed);\n }\n\n private getNonce(): string {\n const random = randomAlphanumeric(5);\n const counter = this.formatCounter();\n this.addCounter();\n return this.prefix + random + counter;\n }\n\n private formatCounter(): string {\n let result = '';\n for (let i = 0; i < 5; i++) {\n result += ALPHANUMERIC[this.counter[i]];\n }\n return result;\n }\n\n private addCounter(): void {\n for (let i = 4; i >= 0; i--) {\n this.counter[i]++;\n if (this.counter[i] < 62) {\n break;\n }\n this.counter[i] = 0;\n }\n }\n}\n\n// --- Crypto helpers using Web Crypto API ---\n\nasync function sha256Bytes(input: string): Promise<Uint8Array> {\n const data = new TextEncoder().encode(input);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return new Uint8Array(hash);\n}\n\nexport async function sha256Hex(input: string): Promise<string> {\n const bytes = await sha256Bytes(input);\n return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');\n}\n\nasync function encryptAES256CBC(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n const padded = pkcs7Pad(data);\n const iv = randomBytes(16);\n const cryptoKey = await crypto.subtle.importKey('raw', toBuffer(key), { name: 'AES-CBC' }, false, ['encrypt']);\n const encrypted = await crypto.subtle.encrypt({ name: 'AES-CBC', iv: toBuffer(iv) }, cryptoKey, toBuffer(padded));\n // Return IV + ciphertext\n const result = new Uint8Array(iv.length + encrypted.byteLength);\n result.set(iv, 0);\n result.set(new Uint8Array(encrypted), iv.length);\n return result;\n}\n\nasync function decryptAES256CBC(data: Uint8Array, key: Uint8Array): Promise<Uint8Array> {\n if (data.length < 16 || data.length % 16 !== 0) {\n throw new Error('invalid encrypted data length');\n }\n const iv = data.slice(0, 16);\n const ciphertext = data.slice(16);\n const cryptoKey = await crypto.subtle.importKey('raw', toBuffer(key), { name: 'AES-CBC' }, false, ['decrypt']);\n // Web Crypto API handles PKCS7 unpadding automatically for AES-CBC\n const decrypted = await crypto.subtle.decrypt({ name: 'AES-CBC', iv: toBuffer(iv) }, cryptoKey, toBuffer(ciphertext));\n return new Uint8Array(decrypted);\n}\n\nfunction pkcs7Pad(data: Uint8Array): Uint8Array {\n const blockSize = 16;\n const padding = blockSize - (data.length % blockSize);\n const padded = new Uint8Array(data.length + padding);\n padded.set(data);\n padded.fill(padding, data.length);\n return padded;\n}\n\n// --- Compression ---\n\nasync function compressGzip(data: Uint8Array): Promise<Uint8Array> {\n if (typeof CompressionStream !== 'undefined') {\n const stream = new CompressionStream('gzip');\n const writer = stream.writable.getWriter();\n void writer.write(toBuffer(data));\n void writer.close();\n const chunks: Uint8Array[] = [];\n const reader = stream.readable.getReader();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n throw new Error('CompressionStream not available. Please use a modern browser or Node.js 18+.');\n}\n\nasync function decompressGzip(data: Uint8Array): Promise<Uint8Array> {\n if (typeof DecompressionStream !== 'undefined') {\n const stream = new DecompressionStream('gzip');\n const writer = stream.writable.getWriter();\n void writer.write(toBuffer(data));\n void writer.close();\n const chunks: Uint8Array[] = [];\n const reader = stream.readable.getReader();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n return result;\n }\n throw new Error('DecompressionStream not available. Please use a modern browser or Node.js 18+.');\n}\n\n// --- Buffer helpers ---\n\n/** Convert Uint8Array to ArrayBuffer (fixes TS 5.5+ BufferSource strictness). */\nfunction toBuffer(data: Uint8Array): ArrayBuffer {\n return (data.buffer as ArrayBuffer).slice(data.byteOffset, data.byteOffset + data.byteLength);\n}\n\n// --- Random helpers ---\n\nfunction randomBytes(size: number): Uint8Array {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n return bytes;\n}\n\nfunction randomAlphanumeric(size: number): string {\n const bytes = randomBytes(size);\n let result = '';\n for (let i = 0; i < size; i++) {\n result += ALPHANUMERIC[bytes[i] % 62];\n }\n return result;\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\n// Self-contained protobuf encode/decode for transport.proto.\n// Implements minimal protobuf wire format (varint + length-delimited) with zero dependencies.\n\n// ---- Minimal Protobuf Writer ----\n\nclass ProtoWriter {\n private buf: Uint8Array;\n private pos = 0;\n private forkStack: number[] = [];\n\n constructor() {\n this.buf = new Uint8Array(256);\n }\n\n private grow(need: number): void {\n if (this.pos + need <= this.buf.length) return;\n let newLen = this.buf.length * 2;\n while (newLen < this.pos + need) newLen *= 2;\n const next = new Uint8Array(newLen);\n next.set(this.buf);\n this.buf = next;\n }\n\n uint32(value: number): this {\n this.grow(5);\n value >>>= 0;\n while (value > 127) {\n this.buf[this.pos++] = (value & 0x7f) | 0x80;\n value >>>= 7;\n }\n this.buf[this.pos++] = value;\n return this;\n }\n\n uint64(value: number): this {\n // Handle numbers up to 2^53 (safe integer range)\n this.grow(10);\n let lo = value >>> 0;\n let hi = ((value - lo) / 0x100000000) >>> 0;\n while (hi > 0) {\n this.buf[this.pos++] = (lo & 0x7f) | 0x80;\n lo = ((lo >>> 7) | (hi << 25)) >>> 0;\n hi >>>= 7;\n }\n while (lo > 127) {\n this.buf[this.pos++] = (lo & 0x7f) | 0x80;\n lo >>>= 7;\n }\n this.buf[this.pos++] = lo;\n return this;\n }\n\n int32(value: number): this {\n if (value >= 0) return this.uint32(value);\n // Negative int32 is encoded as 10-byte varint (sign-extended to 64 bits)\n this.grow(10);\n for (let i = 0; i < 9; i++) {\n this.buf[this.pos++] = (value & 0x7f) | 0x80;\n value >>= 7;\n }\n this.buf[this.pos++] = 1; // sign bit\n return this;\n }\n\n bytes(value: Uint8Array): this {\n this.uint32(value.length);\n this.grow(value.length);\n this.buf.set(value, this.pos);\n this.pos += value.length;\n return this;\n }\n\n string(value: string): this {\n const encoded = textEncoder.encode(value);\n return this.bytes(encoded);\n }\n\n /** Start a nested sub-message. Call ldelim() to close it. */\n fork(): this {\n this.forkStack.push(this.pos);\n // Reserve space — we'll patch the length in ldelim()\n this.grow(5);\n this.pos += 5; // max varint32 length\n return this;\n }\n\n /** Close a fork: writes the sub-message length prefix. */\n ldelim(): this {\n const startPos = this.forkStack.pop()!;\n const contentStart = startPos + 5; // content was written after the 5-byte reservation\n const contentLen = this.pos - contentStart;\n // Encode the length as varint\n const lenBytes: number[] = [];\n let v = contentLen;\n while (v > 127) {\n lenBytes.push((v & 0x7f) | 0x80);\n v >>>= 7;\n }\n lenBytes.push(v);\n // Move content to sit right after the length varint\n const newContentStart = startPos + lenBytes.length;\n this.buf.copyWithin(newContentStart, contentStart, this.pos);\n // Write length varint at startPos\n for (let i = 0; i < lenBytes.length; i++) {\n this.buf[startPos + i] = lenBytes[i];\n }\n this.pos = newContentStart + contentLen;\n return this;\n }\n\n finish(): Uint8Array {\n return this.buf.slice(0, this.pos);\n }\n}\n\n// ---- Minimal Protobuf Reader ----\n\nclass ProtoReader {\n private buf: Uint8Array;\n pos: number;\n len: number;\n\n constructor(data: Uint8Array) {\n this.buf = data;\n this.pos = 0;\n this.len = data.length;\n }\n\n uint32(): number {\n let value = 0;\n let shift = 0;\n let b: number;\n do {\n b = this.buf[this.pos++];\n value |= (b & 0x7f) << shift;\n shift += 7;\n } while (b & 0x80);\n return value >>> 0;\n }\n\n uint64(): number {\n // Read varint as a JS number (safe up to 2^53)\n let lo = 0;\n let hi = 0;\n let shift = 0;\n let b: number;\n // Read low 28 bits\n for (let i = 0; i < 4; i++) {\n b = this.buf[this.pos++];\n lo |= (b & 0x7f) << shift;\n shift += 7;\n if (!(b & 0x80)) return lo >>> 0;\n }\n // 5th byte spans lo/hi\n b = this.buf[this.pos++];\n lo |= (b & 0x7f) << 28;\n hi = (b & 0x7f) >> 4;\n if (!(b & 0x80)) return (hi * 0x100000000 + (lo >>> 0));\n shift = 3;\n // Read remaining high bits\n do {\n b = this.buf[this.pos++];\n hi |= (b & 0x7f) << shift;\n shift += 7;\n } while (b & 0x80);\n return (hi >>> 0) * 0x100000000 + (lo >>> 0);\n }\n\n int32(): number {\n return this.uint32() | 0;\n }\n\n bytes(): Uint8Array {\n const len = this.uint32();\n const value = this.buf.slice(this.pos, this.pos + len);\n this.pos += len;\n return value;\n }\n\n string(): string {\n const bytes = this.bytes();\n return textDecoder.decode(bytes);\n }\n\n skipType(wireType: number): void {\n switch (wireType) {\n case 0: // varint\n while (this.buf[this.pos++] & 0x80) { /* skip */ }\n break;\n case 1: // 64-bit\n this.pos += 8;\n break;\n case 2: // length-delimited\n this.pos += this.uint32();\n break;\n case 5: // 32-bit\n this.pos += 4;\n break;\n default:\n throw new Error(`unknown wire type: ${wireType}`);\n }\n }\n}\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\n// ---- SecureMessage ----\n\nexport interface SecureMessage {\n version: string;\n timestamp: number;\n nonce: string;\n encryptedKey: Uint8Array;\n encryptedData: Uint8Array;\n}\n\nexport function encodeSecureMessage(msg: SecureMessage): Uint8Array {\n const w = new ProtoWriter();\n if (msg.version) w.uint32(10).string(msg.version);\n if (msg.timestamp) w.uint32(16).uint64(msg.timestamp);\n if (msg.nonce) w.uint32(26).string(msg.nonce);\n if (msg.encryptedKey?.length) w.uint32(34).bytes(msg.encryptedKey);\n if (msg.encryptedData?.length) w.uint32(42).bytes(msg.encryptedData);\n return w.finish();\n}\n\nexport function decodeSecureMessage(data: Uint8Array): SecureMessage {\n const r = new ProtoReader(data);\n const msg: SecureMessage = { version: '', timestamp: 0, nonce: '', encryptedKey: new Uint8Array(0), encryptedData: new Uint8Array(0) };\n while (r.pos < r.len) {\n const tag = r.uint32();\n switch (tag >>> 3) {\n case 1: msg.version = r.string(); break;\n case 2: msg.timestamp = r.uint64(); break;\n case 3: msg.nonce = r.string(); break;\n case 4: msg.encryptedKey = r.bytes(); break;\n case 5: msg.encryptedData = r.bytes(); break;\n default: r.skipType(tag & 7); break;\n }\n }\n return msg;\n}\n\n// ---- HttpRequest ----\n\nexport interface HttpRequest {\n method: string;\n path: string;\n headers: Record<string, string>;\n body: Uint8Array;\n reqId: string;\n}\n\nexport function encodeHttpRequest(msg: HttpRequest): Uint8Array {\n const w = new ProtoWriter();\n if (msg.method) w.uint32(10).string(msg.method);\n if (msg.path) w.uint32(18).string(msg.path);\n if (msg.headers) {\n for (const [k, v] of Object.entries(msg.headers)) {\n w.uint32(26).fork().uint32(10).string(k).uint32(18).string(v).ldelim();\n }\n }\n if (msg.body?.length) w.uint32(34).bytes(msg.body);\n if (msg.reqId) w.uint32(42).string(msg.reqId);\n return w.finish();\n}\n\nexport function decodeHttpRequest(data: Uint8Array): HttpRequest {\n const r = new ProtoReader(data);\n const msg: HttpRequest = { method: '', path: '', headers: {}, body: new Uint8Array(0), reqId: '' };\n while (r.pos < r.len) {\n const tag = r.uint32();\n switch (tag >>> 3) {\n case 1: msg.method = r.string(); break;\n case 2: msg.path = r.string(); break;\n case 3: {\n const entryEnd = r.uint32() + r.pos;\n let key = '', value = '';\n while (r.pos < entryEnd) {\n const entryTag = r.uint32();\n switch (entryTag >>> 3) {\n case 1: key = r.string(); break;\n case 2: value = r.string(); break;\n default: r.skipType(entryTag & 7); break;\n }\n }\n msg.headers[key] = value;\n break;\n }\n case 4: msg.body = r.bytes(); break;\n case 5: msg.reqId = r.string(); break;\n default: r.skipType(tag & 7); break;\n }\n }\n return msg;\n}\n\n// ---- HttpResponse ----\n\nexport interface HttpResponse {\n statusCode: number;\n statusText: string;\n headers: Record<string, string>;\n body: Uint8Array;\n reqId: string;\n}\n\nexport function decodeHttpResponse(data: Uint8Array): HttpResponse {\n const r = new ProtoReader(data);\n const msg: HttpResponse = { statusCode: 0, statusText: '', headers: {}, body: new Uint8Array(0), reqId: '' };\n while (r.pos < r.len) {\n const tag = r.uint32();\n switch (tag >>> 3) {\n case 1: msg.statusCode = r.int32(); break;\n case 2: msg.statusText = r.string(); break;\n case 3: {\n const entryEnd = r.uint32() + r.pos;\n let key = '', value = '';\n while (r.pos < entryEnd) {\n const entryTag = r.uint32();\n switch (entryTag >>> 3) {\n case 1: key = r.string(); break;\n case 2: value = r.string(); break;\n default: r.skipType(entryTag & 7); break;\n }\n }\n msg.headers[key] = value;\n break;\n }\n case 4: msg.body = r.bytes(); break;\n case 5: msg.reqId = r.string(); break;\n default: r.skipType(tag & 7); break;\n }\n }\n return msg;\n}\n\n// ---- WebSocketMessage ----\n\nexport interface EventHeader {\n eventId: string;\n eventType: string;\n eventCreatedAt: number;\n}\n\nexport interface WsEvent {\n eventHeader?: EventHeader;\n eventBody: Uint8Array;\n}\n\nexport interface WebSocketMessage {\n ping?: { timestamp: number };\n pong?: { timestamp: number };\n initRequest?: { userAgent: string };\n initResponse?: Record<string, never>;\n event?: WsEvent;\n eventAck?: { eventId: string };\n httpRequest?: HttpRequest;\n httpResponse?: HttpResponse;\n}\n\nexport function encodeWebSocketMessage(msg: WebSocketMessage): Uint8Array {\n const w = new ProtoWriter();\n if (msg.ping) {\n w.uint32(10).fork();\n if (msg.ping.timestamp) w.uint32(8).uint64(msg.ping.timestamp);\n w.ldelim();\n }\n if (msg.pong) {\n w.uint32(18).fork();\n if (msg.pong.timestamp) w.uint32(8).uint64(msg.pong.timestamp);\n w.ldelim();\n }\n if (msg.initRequest) {\n w.uint32(26).fork();\n if (msg.initRequest.userAgent) w.uint32(10).string(msg.initRequest.userAgent);\n w.ldelim();\n }\n if (msg.initResponse) {\n w.uint32(34).fork().ldelim();\n }\n if (msg.event) {\n w.uint32(42).fork();\n if (msg.event.eventHeader) {\n w.uint32(10).fork();\n if (msg.event.eventHeader.eventId) w.uint32(10).string(msg.event.eventHeader.eventId);\n if (msg.event.eventHeader.eventType) w.uint32(18).string(msg.event.eventHeader.eventType);\n if (msg.event.eventHeader.eventCreatedAt) w.uint32(24).uint64(msg.event.eventHeader.eventCreatedAt);\n w.ldelim();\n }\n if (msg.event.eventBody?.length) w.uint32(18).bytes(msg.event.eventBody);\n w.ldelim();\n }\n if (msg.eventAck) {\n w.uint32(50).fork();\n if (msg.eventAck.eventId) w.uint32(10).string(msg.eventAck.eventId);\n w.ldelim();\n }\n if (msg.httpRequest) {\n w.uint32(58).bytes(encodeHttpRequest(msg.httpRequest));\n }\n return w.finish();\n}\n\nexport function decodeWebSocketMessage(data: Uint8Array): WebSocketMessage {\n const r = new ProtoReader(data);\n const msg: WebSocketMessage = {};\n while (r.pos < r.len) {\n const tag = r.uint32();\n switch (tag >>> 3) {\n case 1: { // ping\n const subEnd = r.uint32() + r.pos;\n const ping = { timestamp: 0 };\n while (r.pos < subEnd) {\n const subTag = r.uint32();\n if ((subTag >>> 3) === 1) ping.timestamp = r.uint64();\n else r.skipType(subTag & 7);\n }\n msg.ping = ping;\n break;\n }\n case 2: { // pong\n const subEnd = r.uint32() + r.pos;\n const pong = { timestamp: 0 };\n while (r.pos < subEnd) {\n const subTag = r.uint32();\n if ((subTag >>> 3) === 1) pong.timestamp = r.uint64();\n else r.skipType(subTag & 7);\n }\n msg.pong = pong;\n break;\n }\n case 3: { // initRequest\n const subEnd = r.uint32() + r.pos;\n const initReq = { userAgent: '' };\n while (r.pos < subEnd) {\n const subTag = r.uint32();\n if ((subTag >>> 3) === 1) initReq.userAgent = r.string();\n else r.skipType(subTag & 7);\n }\n msg.initRequest = initReq;\n break;\n }\n case 4: { // initResponse\n const subEnd = r.uint32() + r.pos;\n r.pos = subEnd;\n msg.initResponse = {};\n break;\n }\n case 5: { // event\n const subEnd = r.uint32() + r.pos;\n const event: WsEvent = { eventBody: new Uint8Array(0) };\n while (r.pos < subEnd) {\n const subTag = r.uint32();\n switch (subTag >>> 3) {\n case 1: {\n const headerEnd = r.uint32() + r.pos;\n const header: EventHeader = { eventId: '', eventType: '', eventCreatedAt: 0 };\n while (r.pos < headerEnd) {\n const hTag = r.uint32();\n switch (hTag >>> 3) {\n case 1: header.eventId = r.string(); break;\n case 2: header.eventType = r.string(); break;\n case 3: header.eventCreatedAt = r.uint64(); break;\n default: r.skipType(hTag & 7); break;\n }\n }\n event.eventHeader = header;\n break;\n }\n case 2: event.eventBody = r.bytes(); break;\n default: r.skipType(subTag & 7); break;\n }\n }\n msg.event = event;\n break;\n }\n case 6: { // eventAck\n const subEnd = r.uint32() + r.pos;\n const ack = { eventId: '' };\n while (r.pos < subEnd) {\n const subTag = r.uint32();\n if ((subTag >>> 3) === 1) ack.eventId = r.string();\n else r.skipType(subTag & 7);\n }\n msg.eventAck = ack;\n break;\n }\n case 7: {\n const bytes = r.bytes();\n msg.httpRequest = decodeHttpRequest(bytes);\n break;\n }\n case 8: {\n const bytes = r.bytes();\n msg.httpResponse = decodeHttpResponse(bytes);\n break;\n }\n default: r.skipType(tag & 7); break;\n }\n }\n return msg;\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from './config';\nimport type { EventHeader, WrappedEventHandler } from './types';\nimport { USER_AGENT } from './version';\nimport { DEFAULT_WS_PATH } from './consts';\nimport type { CryptoManager } from './crypto';\nimport {\n encodeSecureMessage,\n decodeSecureMessage,\n encodeWebSocketMessage,\n decodeWebSocketMessage,\n encodeHttpRequest,\n decodeHttpResponse,\n} from '@/internal/transport';\nimport type { HttpRequest, HttpResponse, WebSocketMessage } from '@/internal/transport';\n\n// Resolve WebSocket implementation: native (browser / Node 22+) or 'ws' package (Node < 22)\nlet _WebSocketImpl: typeof WebSocket | undefined;\n\nasync function getWebSocket(): Promise<typeof WebSocket> {\n if (_WebSocketImpl) return _WebSocketImpl;\n if (typeof WebSocket !== 'undefined') {\n _WebSocketImpl = WebSocket;\n return _WebSocketImpl;\n }\n try {\n // Dynamic import for Node.js < 22; 'ws' is an optional peer dependency\n const mod = await (Function('return import(\"ws\")')() as Promise<Record<string, unknown>>);\n _WebSocketImpl = (mod.default || mod) as unknown as typeof WebSocket;\n return _WebSocketImpl;\n } catch {\n throw new Error(\n 'No WebSocket implementation found. ' +\n 'Install the \"ws\" package: npm install ws',\n );\n }\n}\n\nconst RECONNECT_CHECK_INTERVAL = 10_000;\nconst HEALTH_CHECK_INTERVAL = 20_000;\nconst ALIVE_TIMEOUT = 40_000;\nconst CONNECT_TIMEOUT = 5_000;\nconst WRITE_TIMEOUT = 60_000;\n\ninterface WsClientOptions {\n config: Config;\n getSecret: () => string;\n getToken: () => Promise<string>;\n ensurePing: () => Promise<void>;\n cryptoManager: CryptoManager;\n}\n\ninterface ReqCallback {\n resolve: (resp: HttpResponse) => void;\n reject: (err: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n}\n\nexport class WsClient {\n private config: Config;\n private getSecret: () => string;\n private getToken: () => Promise<string>;\n private ensurePing: () => Promise<void>;\n private cryptoManager: CryptoManager;\n\n private eventHandlerMap = new Map<string, WrappedEventHandler[]>();\n private socket: WebSocket | null = null;\n private isConnecting = false;\n private isReconnecting = false;\n private shouldClose = false;\n private reqCount = 0;\n private reqCallbacks = new Map<string, ReqCallback>();\n private reconnectAttempt = 0;\n private lastMessageAt = 0;\n private healthCheckTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectCheckTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private initDone = false;\n private initPromise: Promise<void> | null = null;\n\n constructor(options: WsClientOptions) {\n this.config = options.config;\n this.getSecret = options.getSecret;\n this.getToken = options.getToken;\n this.ensurePing = options.ensurePing;\n this.cryptoManager = options.cryptoManager;\n }\n\n onEvent(eventType: string, handler: WrappedEventHandler): void {\n this.ensureInit();\n let handlers = this.eventHandlerMap.get(eventType);\n if (!handlers) {\n handlers = [];\n this.eventHandlerMap.set(eventType, handlers);\n }\n handlers.push(handler);\n }\n\n offEvent(eventType: string, handler: WrappedEventHandler): void {\n const handlers = this.eventHandlerMap.get(eventType);\n if (!handlers) return;\n const idx = handlers.indexOf(handler);\n if (idx >= 0) {\n handlers.splice(idx, 1);\n }\n }\n\n async httpRequest(req: HttpRequest): Promise<HttpResponse> {\n await this.ensureInit();\n\n const reqId = String(++this.reqCount);\n req.reqId = reqId;\n\n return new Promise<HttpResponse>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.reqCallbacks.delete(reqId);\n reject(new Error(`websocket request timeout: ${WRITE_TIMEOUT}ms`));\n }, WRITE_TIMEOUT);\n\n this.reqCallbacks.set(reqId, { resolve, reject, timer });\n\n const reqBytes = encodeHttpRequest(req);\n this.sendMessage({\n httpRequest: {\n method: req.method,\n path: req.path,\n headers: req.headers,\n body: req.body,\n reqId,\n },\n }).catch((err) => {\n clearTimeout(timer);\n this.reqCallbacks.delete(reqId);\n reject(err);\n });\n });\n }\n\n close(): void {\n this.shouldClose = true;\n this.clearTimers();\n if (this.socket) {\n try {\n this.socket.close(1000, 'client close');\n } catch {\n // ignore\n }\n this.socket = null;\n }\n // Reject all pending callbacks\n for (const [, cb] of this.reqCallbacks) {\n clearTimeout(cb.timer);\n cb.reject(new Error('websocket closed'));\n }\n this.reqCallbacks.clear();\n }\n\n // --- Internal ---\n\n private ensureInit(): void {\n if (this.initDone) return;\n if (!this.initPromise) {\n this.initPromise = this.doInit();\n }\n }\n\n private async doInit(): Promise<void> {\n if (this.initDone) return;\n try {\n await this.ensurePing();\n await this.connect();\n this.initDone = true;\n } catch (err) {\n this.config.logger.error('ws init failed', err);\n this.reconnect();\n }\n }\n\n private async connect(): Promise<void> {\n if (this.isConnecting) return;\n this.isConnecting = true;\n\n try {\n // Close existing socket\n if (this.socket) {\n try { this.socket.close(); } catch { /* ignore */ }\n this.socket = null;\n }\n\n // Reject pending callbacks\n for (const [, cb] of this.reqCallbacks) {\n clearTimeout(cb.timer);\n cb.reject(new Error('websocket reconnecting'));\n }\n this.reqCallbacks.clear();\n\n await this.ensurePing();\n const token = await this.getToken();\n\n // Build WS URL\n let wsUrl = this.config.backendUrl.replace(/^http/, 'ws') + DEFAULT_WS_PATH + `?token=${encodeURIComponent(token)}`;\n\n const WS = await getWebSocket();\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new Error('websocket connect timeout'));\n }, CONNECT_TIMEOUT);\n\n const ws = new WS(wsUrl);\n ws.binaryType = 'arraybuffer';\n\n ws.onopen = async () => {\n clearTimeout(timer);\n this.socket = ws;\n\n try {\n // Send InitRequest\n await this.sendMessage({ initRequest: { userAgent: USER_AGENT } });\n\n // Wait for InitResponse\n await new Promise<void>((resolveInit, rejectInit) => {\n const initTimer = setTimeout(() => {\n rejectInit(new Error('init response timeout'));\n }, CONNECT_TIMEOUT);\n\n const origHandler = ws.onmessage;\n ws.onmessage = async (event) => {\n clearTimeout(initTimer);\n try {\n const data = new Uint8Array(event.data as ArrayBuffer);\n const secureMsg = decodeSecureMessage(data);\n const decrypted = await this.cryptoManager.decryptMessage(this.getSecret(), secureMsg);\n const wsMsg = decodeWebSocketMessage(decrypted);\n if (wsMsg.initResponse) {\n resolveInit();\n } else {\n rejectInit(new Error('unexpected message during init'));\n }\n } catch (err) {\n rejectInit(err as Error);\n }\n };\n });\n\n // Set up message handler\n ws.onmessage = (event) => this.handleMessage(event);\n ws.onclose = () => this.handleClose();\n ws.onerror = (err) => {\n this.config.logger.error('ws error', err);\n };\n\n this.lastMessageAt = Date.now();\n this.startHealthCheck();\n this.startReconnectCheck();\n this.reconnectAttempt = 0;\n this.isReconnecting = false;\n\n resolve();\n } catch (err) {\n reject(err);\n }\n };\n\n ws.onerror = () => {\n clearTimeout(timer);\n reject(new Error('websocket connect failed'));\n };\n });\n } finally {\n this.isConnecting = false;\n }\n }\n\n private handleClose(): void {\n this.socket = null;\n this.clearTimers();\n if (!this.shouldClose) {\n this.reconnect();\n }\n }\n\n private async handleMessage(event: MessageEvent): Promise<void> {\n this.lastMessageAt = Date.now();\n\n try {\n const data = new Uint8Array(event.data as ArrayBuffer);\n const secureMsg = decodeSecureMessage(data);\n const decrypted = await this.cryptoManager.decryptMessage(this.getSecret(), secureMsg);\n const wsMsg = decodeWebSocketMessage(decrypted);\n\n if (wsMsg.pong) {\n this.config.timeManager.syncServerTimestamp(Number(wsMsg.pong.timestamp));\n } else if (wsMsg.event) {\n const header: EventHeader = {\n event_id: wsMsg.event.eventHeader?.eventId ?? '',\n event_type: wsMsg.event.eventHeader?.eventType ?? '',\n event_created_at: String(wsMsg.event.eventHeader?.eventCreatedAt ?? '0'),\n };\n\n const handlers = this.eventHandlerMap.get(header.event_type);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(header, wsMsg.event.eventBody ?? new Uint8Array(0));\n } catch (err) {\n this.config.logger.error('event handler error', err);\n }\n }\n }\n\n // Send event ack\n this.sendMessage({ eventAck: { eventId: header.event_id } }).catch(() => {});\n } else if (wsMsg.httpResponse) {\n const reqId = wsMsg.httpResponse.reqId;\n const cb = this.reqCallbacks.get(reqId);\n if (cb) {\n clearTimeout(cb.timer);\n this.reqCallbacks.delete(reqId);\n cb.resolve(wsMsg.httpResponse);\n }\n }\n } catch (err) {\n this.config.logger.error('ws message parse error', err);\n }\n }\n\n private async sendMessage(msg: WebSocketMessage): Promise<void> {\n const WS = await getWebSocket();\n if (!this.socket || this.socket.readyState !== WS.OPEN) {\n throw new Error('websocket not connected');\n }\n\n const msgBytes = encodeWebSocketMessage(msg);\n const secureMsg = await this.cryptoManager.encryptMessage(this.getSecret(), msgBytes);\n const data = encodeSecureMessage(secureMsg);\n this.socket.send(data);\n }\n\n private reconnect(): void {\n if (this.shouldClose || this.isReconnecting) return;\n this.isReconnecting = true;\n\n const delay = this.getReconnectDelay();\n this.config.logger.info(`ws reconnecting in ${delay}ms (attempt ${this.reconnectAttempt + 1})`);\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectAttempt++;\n try {\n await this.connect();\n this.config.logger.info('ws reconnected');\n } catch (err) {\n this.config.logger.error('ws reconnect failed', err);\n this.isReconnecting = false;\n this.reconnect();\n }\n }, delay);\n }\n\n private getReconnectDelay(): number {\n const attempt = this.reconnectAttempt;\n if (attempt === 0) {\n return 250 + Math.floor(Math.random() * 250);\n }\n if (attempt <= 4) {\n return 750 + Math.floor(Math.random() * 500);\n }\n const base = Math.min(10000, Math.max(750, (attempt - 4) * 2000));\n const jitter = Math.floor(Math.random() * 1000);\n return Math.min(15000, base + jitter);\n }\n\n private startHealthCheck(): void {\n this.stopHealthCheck();\n this.healthCheckTimer = setInterval(async () => {\n try {\n const timestamp = this.config.timeManager.getServerTimestamp();\n await this.sendMessage({ ping: { timestamp } });\n } catch {\n // ignore, reconnect check will handle it\n }\n }, HEALTH_CHECK_INTERVAL);\n }\n\n private stopHealthCheck(): void {\n if (this.healthCheckTimer) {\n clearInterval(this.healthCheckTimer);\n this.healthCheckTimer = null;\n }\n }\n\n private startReconnectCheck(): void {\n this.stopReconnectCheck();\n this.reconnectCheckTimer = setInterval(() => {\n if (Date.now() - this.lastMessageAt > ALIVE_TIMEOUT) {\n this.config.logger.warn('ws alive timeout, reconnecting');\n this.clearTimers();\n if (this.socket) {\n try { this.socket.close(); } catch { /* ignore */ }\n this.socket = null;\n }\n this.reconnect();\n }\n }, RECONNECT_CHECK_INTERVAL);\n }\n\n private stopReconnectCheck(): void {\n if (this.reconnectCheckTimer) {\n clearInterval(this.reconnectCheckTimer);\n this.reconnectCheckTimer = null;\n }\n }\n\n private clearTimers(): void {\n this.stopHealthCheck();\n this.stopReconnectCheck();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from './config';\nimport type {\n ApiClient,\n ApiRequest,\n ApiResponse,\n EventHeader,\n WrappedEventHandler,\n} from './types';\nimport { USER_AGENT } from './version';\nimport {\n DEFAULT_PING_PATH,\n DEFAULT_TOKEN_PATH,\n DEFAULT_GATEWAY_PATH,\n} from './consts';\nimport { CryptoManager, sha256Hex } from './crypto';\nimport { WsClient } from './ws_client';\nimport {\n encodeSecureMessage,\n decodeSecureMessage,\n encodeHttpRequest,\n decodeHttpResponse,\n} from '@/internal/transport';\nimport type { HttpRequest } from '@/internal/transport';\n\nconst TIMESTAMP_HEADER = 'X-Cored-Timestamp';\nconst NONCE_HEADER = 'X-Cored-Nonce';\n\nexport class DefaultApiClient implements ApiClient {\n private config: Config;\n private secret: string = '';\n private token: string = '';\n private tokenRefreshAt: number = 0;\n private tokenExpiresAt: number = 0;\n private tokenFetching: boolean = false;\n private tokenPromise: Promise<void> | null = null;\n private pingCalled: boolean = false;\n private pingExpiresAt: number = 0;\n private pingFetching: boolean = false;\n private pingPromise: Promise<void> | null = null;\n private cryptoManager: CryptoManager;\n private ws: WsClient;\n\n constructor(config: Config) {\n this.config = config;\n this.cryptoManager = new CryptoManager(config);\n this.ws = new WsClient({\n config,\n getSecret: () => this.secret,\n getToken: () => this.getToken(),\n ensurePing: () => this.ensurePing(),\n cryptoManager: this.cryptoManager,\n });\n }\n\n async init(): Promise<void> {\n this.secret = await sha256Hex(`${this.config.appId}:${this.config.appSecret}`);\n }\n\n async preheat(): Promise<void> {\n await this.ensurePing();\n await this.getToken();\n }\n\n async close(): Promise<void> {\n this.ws.close();\n }\n\n onEvent(eventType: string, handler: WrappedEventHandler): void {\n this.ws.onEvent(eventType, handler);\n }\n\n offEvent(eventType: string, handler: WrappedEventHandler): void {\n this.ws.offEvent(eventType, handler);\n }\n\n async request(req: ApiRequest): Promise<ApiResponse> {\n await this.ensurePing();\n\n // Build URL\n let path = req.path;\n if (req.pathParams) {\n for (const [key, value] of Object.entries(req.pathParams)) {\n path = path.replace(`:${key}`, encodeURIComponent(value));\n }\n }\n\n let url = this.config.backendUrl + path;\n if (req.queryParams) {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(req.queryParams)) {\n if (value) params.set(key, value);\n }\n const qs = params.toString();\n if (qs) url += '?' + qs;\n }\n\n // Encrypted path\n if (this.config.enableEncryption && req.withAppAccessToken) {\n const token = await this.getToken();\n const bodyBytes = req.body\n ? new TextEncoder().encode(this.config.jsonMarshal(req.body))\n : new Uint8Array(0);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT,\n [TIMESTAMP_HEADER]: String(this.config.timeManager.getServerTimestamp()),\n [NONCE_HEADER]: randomAlphanumeric(16),\n };\n if (req.headerParams) {\n Object.assign(headers, req.headerParams);\n }\n\n const httpReq: HttpRequest = {\n method: req.method,\n path: url.replace(this.config.backendUrl, ''),\n headers,\n body: bodyBytes,\n reqId: '',\n };\n\n // WebSocket path\n if (req.withWebSocket) {\n const httpResp = await this.ws.httpRequest(httpReq);\n return {\n json: async () => JSON.parse(new TextDecoder().decode(httpResp.body)),\n body: async () => httpResp.body instanceof Uint8Array ? httpResp.body : new Uint8Array(httpResp.body),\n };\n }\n\n // Gateway path\n const httpReqBytes = encodeHttpRequest(httpReq);\n const secureMessage = await this.cryptoManager.encryptMessage(this.secret, httpReqBytes);\n const secureBytes = encodeSecureMessage(secureMessage);\n\n const gatewayUrl = this.config.backendUrl + DEFAULT_GATEWAY_PATH;\n const resp = await this.config.httpClient.fetch(gatewayUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-protobuf',\n 'Authorization': `Bearer ${token}`,\n 'User-Agent': USER_AGENT,\n },\n body: secureBytes as unknown as BodyInit,\n });\n\n const respBytes = new Uint8Array(await resp.arrayBuffer());\n const respSecureMessage = decodeSecureMessage(respBytes);\n const decryptedBytes = await this.cryptoManager.decryptMessage(this.secret, respSecureMessage);\n const httpResp = decodeHttpResponse(decryptedBytes);\n\n return {\n json: async () => JSON.parse(new TextDecoder().decode(httpResp.body)),\n body: async () => httpResp.body instanceof Uint8Array ? httpResp.body : new Uint8Array(httpResp.body),\n };\n }\n\n // Plain HTTP path\n const timestamp = String(this.config.timeManager.getServerTimestamp());\n const nonce = randomAlphanumeric(16);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT,\n [TIMESTAMP_HEADER]: timestamp,\n [NONCE_HEADER]: nonce,\n };\n\n if (req.withAppAccessToken) {\n const token = await this.getToken();\n headers['Authorization'] = `Bearer ${token}`;\n }\n if (req.headerParams) {\n for (const [key, value] of Object.entries(req.headerParams)) {\n if (value) headers[key] = value;\n }\n }\n\n const fetchInit: RequestInit = {\n method: req.method,\n headers,\n };\n if (req.body && req.method !== 'GET') {\n fetchInit.body = this.config.jsonMarshal(req.body);\n }\n\n const resp = await this.config.httpClient.fetch(url, fetchInit);\n return {\n json: async () => resp.json(),\n body: async () => new Uint8Array(await resp.arrayBuffer()),\n };\n }\n\n // --- Token management ---\n\n private async getToken(): Promise<string> {\n const now = this.config.timeManager.getServerTimestamp();\n\n // Token still fully valid\n if (this.token && this.tokenRefreshAt > now) {\n return this.token;\n }\n\n // Token expired\n if (!this.token || this.tokenExpiresAt <= now) {\n if (this.tokenPromise) {\n await this.tokenPromise;\n return this.token;\n }\n this.tokenPromise = this.fetchToken();\n try {\n await this.tokenPromise;\n } finally {\n this.tokenPromise = null;\n }\n return this.token;\n }\n\n // Token near expiry, refresh in background\n if (!this.tokenFetching) {\n this.tokenFetching = true;\n this.fetchToken().finally(() => {\n this.tokenFetching = false;\n });\n }\n\n return this.token;\n }\n\n private async fetchToken(): Promise<void> {\n const timestamp = String(this.config.timeManager.getServerTimestamp());\n const nonce = randomAlphanumeric(16);\n const signPayload = `${this.config.appId}:${timestamp}:${this.config.appSecret}:${nonce}`;\n const signature = await sha256Hex(signPayload);\n\n const url = this.config.backendUrl + DEFAULT_TOKEN_PATH;\n const resp = await this.config.httpClient.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'User-Agent': USER_AGENT,\n },\n body: JSON.stringify({\n app_id: this.config.appId,\n timestamp,\n nonce,\n signature: `v1:${signature}`,\n }),\n });\n\n const data = await resp.json() as {\n code: number;\n msg: string;\n data?: {\n access_token: string;\n expires_in: number;\n };\n };\n\n if (data.code !== 0 || !data.data) {\n throw new Error(`fetch token failed: code=${data.code}, msg=${data.msg}`);\n }\n\n this.token = data.data.access_token;\n const now = this.config.timeManager.getServerTimestamp();\n this.tokenExpiresAt = now + (data.data.expires_in - 60) * 1000;\n this.tokenRefreshAt = this.tokenExpiresAt - 5 * 60 * 1000;\n }\n\n // --- Ping / server time sync ---\n\n private async ensurePing(): Promise<void> {\n const now = Date.now();\n\n if (this.pingCalled && this.pingExpiresAt > now) {\n return;\n }\n\n if (!this.pingCalled || this.pingExpiresAt <= now) {\n if (this.pingPromise) {\n await this.pingPromise;\n return;\n }\n this.pingPromise = this.fetchPing();\n try {\n await this.pingPromise;\n } finally {\n this.pingPromise = null;\n }\n return;\n }\n\n // Background refresh\n if (!this.pingFetching) {\n this.pingFetching = true;\n this.fetchPing().finally(() => {\n this.pingFetching = false;\n });\n }\n }\n\n private async fetchPing(): Promise<void> {\n const url = this.config.backendUrl + DEFAULT_PING_PATH;\n const resp = await this.config.httpClient.fetch(url, {\n method: 'GET',\n headers: { 'User-Agent': USER_AGENT },\n });\n\n const data = await resp.json() as {\n code: number;\n msg: string;\n data?: {\n version: string;\n timestamp: number;\n org_code: string;\n };\n };\n\n if (data.code !== 0 || !data.data) {\n throw new Error(`ping failed: code=${data.code}, msg=${data.msg}`);\n }\n\n this.config.timeManager.syncServerTimestamp(data.data.timestamp);\n this.pingCalled = true;\n this.pingExpiresAt = Date.now() + 10 * 60 * 1000; // 10 minutes\n this.config.logger.info(`ping ok, server version=${data.data.version}, org_code=${data.data.org_code}`);\n }\n}\n\n// --- Helpers ---\n\nconst ALPHANUMERIC = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nfunction randomAlphanumeric(size: number): string {\n const bytes = new Uint8Array(size);\n crypto.getRandomValues(bytes);\n let result = '';\n for (let i = 0; i < size; i++) {\n result += ALPHANUMERIC[bytes[i] % 62];\n }\n return result;\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { HttpClient } from './types';\n\nexport class DefaultHttpClient implements HttpClient {\n private timeout: number;\n\n constructor(timeout: number = 60000) {\n this.timeout = timeout;\n }\n\n async fetch(url: string, init: RequestInit): Promise<Response> {\n if (this.timeout > 0) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeout);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n }\n return fetch(url, init);\n }\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport { LoggerLevel } from './types';\nimport type { Logger } from './types';\n\nexport class DefaultLogger implements Logger {\n private level: LoggerLevel;\n\n constructor(level: LoggerLevel = LoggerLevel.Info) {\n this.level = level;\n }\n\n debug(msg: string, ...args: unknown[]): void {\n if (this.level <= LoggerLevel.Debug) {\n console.debug(`[sdk] DEBUG ${msg}`, ...args);\n }\n }\n\n info(msg: string, ...args: unknown[]): void {\n if (this.level <= LoggerLevel.Info) {\n console.info(`[sdk] INFO ${msg}`, ...args);\n }\n }\n\n warn(msg: string, ...args: unknown[]): void {\n if (this.level <= LoggerLevel.Warn) {\n console.warn(`[sdk] WARN ${msg}`, ...args);\n }\n }\n\n error(msg: string, ...args: unknown[]): void {\n if (this.level <= LoggerLevel.Error) {\n console.error(`[sdk] ERROR ${msg}`, ...args);\n }\n }\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { TimeManager } from './types';\n\nexport class DefaultTimeManager implements TimeManager {\n private serverTimeBase = 0;\n private systemTimeBase = 0;\n\n getSystemTimestamp(): number {\n return Date.now();\n }\n\n getServerTimestamp(): number {\n if (this.serverTimeBase === 0) {\n return this.getSystemTimestamp();\n }\n return this.getSystemTimestamp() - this.systemTimeBase + this.serverTimeBase;\n }\n\n syncServerTimestamp(timestamp: number): void {\n if (timestamp <= this.serverTimeBase) {\n return;\n }\n this.serverTimeBase = timestamp;\n this.systemTimeBase = this.getSystemTimestamp();\n }\n}\n","// Code generated by Cored SDK Generator. DO NOT EDIT.\nimport type { Config } from '@/core/config';\nimport type { CreateTypingReq, CreateTypingResp, DeleteTypingReq, DeleteTypingResp } from './chat_model';\n\nexport class Chat {\n private readonly config: Config;\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /**\n * Set typing status\n * \n * Set the typing status, lasts only 5 seconds, direct messages only\n */\n async createTyping(req: CreateTypingReq): Promise<CreateTypingResp> {\n const resp = await this.config.apiClient.request({\n method: 'POST',\n path: `/oapi/im/v1/chats/${req.chat_id ?? ''}/typing`,\n body: req,\n withAppAccessToken: true,\n });\n return await resp.json() as CreateTypingResp;\n }\n\n /**\n * Clear typing status\n * \n * Direct messages only\n */\n async deleteTyping(req: DeleteTypingReq): Promise<DeleteTypingResp> {\n const resp = await this.config.apiClient.request({\n method: 'DELETE',\n path: `/oapi/im/v1/chats/${req.chat_id ?? ''}/typing`,\n body: req,\n withAppAccessToken: true,\n });\n return await resp.json() as DeleteTypingResp;\n }\n}\n","// Code generated by Cored SDK Generator. DO NOT EDIT.\nimport type { Config } from '@/core/config';\nimport type { EventHeader, WrappedEventHandler } from '@/core/types';\nimport type { EventMessageReceiveBody } from './message_model';\n\n/** Message received */\nexport interface EventMessageReceive {\n header: EventHeader;\n body: EventMessageReceiveBody;\n}\n\nexport class MessageEvent {\n private readonly config: Config;\n private readonly handlerMap = new Map<Function, WrappedEventHandler>();\n\n constructor(config: Config) {\n this.config = config;\n }\n\n /** Message received */\n onMessageReceive(handler: (event: EventMessageReceive) => void): void {\n const wrappedHandler = (header: EventHeader, body: Uint8Array | string): void => {\n const event: EventMessageReceive = {\n header,\n body: typeof body === 'string' ? JSON.parse(body) as EventMessageReceiveBody : JSON.parse(new TextDecoder().decode(body)) as EventMessageReceiveBody,\n };\n handler(event);\n };\n this.handlerMap.set(handler, wrappedHandler);\n this.config.apiClient.onEvent('im.v1.message.receive', wrappedHandler);\n }\n\n offMessageReceive(handler: (event: EventMessageReceive) => void): void {\n const wrappedHandler = this.handlerMap.get(handler);\n if (wrappedHandler) {\n this.config.apiClient.offEvent('im.v1.message.receive', wrappedHandler);\n this.handlerMap.delete(handler);\n }\n }\n}\n","// Code generated by Cored SDK Generator. DO NOT EDIT.\nimport type { Config } from '@/core/config';\nimport { MessageEvent } from './message_event';\nimport type { GetMessageReq, GetMessageResp, ReadMessageReq, ReadMessageResp, RecallMessageReq, RecallMessageResp, SendMessageReq, SendMessageResp } from './message_model';\n\nexport class Message {\n private readonly config: Config;\n public readonly Event: MessageEvent;\n\n constructor(config: Config) {\n this.config = config;\n this.Event = new MessageEvent(config);\n }\n\n /** Send a message */\n async sendMessage(req: SendMessageReq): Promise<SendMessageResp> {\n const resp = await this.config.apiClient.request({\n method: 'POST',\n path: '/oapi/im/v1/messages',\n body: req,\n withAppAccessToken: true,\n withWebSocket: true,\n });\n return await resp.json() as SendMessageResp;\n }\n\n /** Get a message */\n async getMessage(req: GetMessageReq): Promise<GetMessageResp> {\n const resp = await this.config.apiClient.request({\n method: 'GET',\n path: `/oapi/im/v1/messages/${req.message_id ?? ''}`,\n body: req,\n withAppAccessToken: true,\n });\n return await resp.json() as GetMessageResp;\n }\n\n /** Recall a message */\n async recallMessage(req: RecallMessageReq): Promise<RecallMessageResp> {\n const resp = await this.config.apiClient.request({\n method: 'POST',\n path: `/oapi/im/v1/messages/${req.message_id ?? ''}/recall`,\n body: req,\n withAppAccessToken: true,\n });\n return await resp.json() as RecallMessageResp;\n }\n\n /** Mark message as read */\n async readMessage(req: ReadMessageReq): Promise<ReadMessageResp> {\n const resp = await this.config.apiClient.request({\n method: 'POST',\n path: `/oapi/im/v1/messages/${req.message_id ?? ''}/read`,\n body: req,\n withAppAccessToken: true,\n });\n return await resp.json() as ReadMessageResp;\n }\n}\n","// Code generated by Cored SDK Generator. DO NOT EDIT.\nimport type { Config } from '@/core/config';\nimport { Chat } from './chat';\nimport { Message } from './message';\n\nexport class V1 {\n public readonly Chat: Chat;\n public readonly Message: Message;\n\n constructor(config: Config) {\n this.Chat = new Chat(config);\n this.Message = new Message(config);\n }\n}\n","// Code generated by Cored SDK Generator. DO NOT EDIT.\nimport type { Config } from '@/core/config';\nimport { V1 } from './v1/index';\n\nexport class Service {\n public readonly v1: V1;\n\n constructor(config: Config) {\n this.v1 = new V1(config);\n }\n}\n","// Copyright (c) 2026 Cored Limited\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Config } from '@/core/config';\nimport type {\n ApiClient,\n HttpClient,\n Logger,\n TimeManager,\n Marshaller,\n Unmarshaller,\n} from '@/core/types';\nimport { LoggerLevel } from '@/core/types';\nimport { DefaultApiClient } from '@/core/api_client';\nimport { DefaultHttpClient } from '@/core/http_client';\nimport { DefaultLogger } from '@/core/logger';\nimport { DefaultTimeManager } from '@/core/time_manager';\nimport { Service as ImService } from '@/service/im/index';\n\nexport interface CoredClientOptions {\n httpClient?: HttpClient;\n requestTimeout?: number;\n enableEncryption?: boolean;\n logLevel?: LoggerLevel;\n logger?: Logger;\n timeManager?: TimeManager;\n jsonMarshal?: Marshaller;\n jsonUnmarshal?: Unmarshaller;\n}\n\nexport class CoredClient {\n public readonly config: Config;\n public readonly apiClient: ApiClient;\n public readonly Im: ImService;\n\n private constructor(config: Config) {\n this.config = config;\n this.apiClient = config.apiClient;\n this.Im = new ImService(config);\n }\n\n static async create(\n backendUrl: string,\n appId: string,\n appSecret: string,\n options: CoredClientOptions = {},\n ): Promise<CoredClient> {\n // Normalize backend URL\n backendUrl = backendUrl.replace(/\\/+$/, '');\n\n const logger = options.logger ?? new DefaultLogger(options.logLevel ?? LoggerLevel.Info);\n const httpClient = options.httpClient ?? new DefaultHttpClient(options.requestTimeout ?? 60_000);\n const timeManager = options.timeManager ?? new DefaultTimeManager();\n const jsonMarshal = options.jsonMarshal ?? ((v: unknown) => JSON.stringify(v));\n const jsonUnmarshal = options.jsonUnmarshal ?? ((s: string) => JSON.parse(s));\n\n const config: Config = {\n appId,\n appSecret,\n backendUrl,\n httpClient,\n apiClient: null!, // will be set below\n enableEncryption: options.enableEncryption ?? true,\n requestTimeout: options.requestTimeout ?? 60_000,\n timeManager,\n logger,\n jsonMarshal,\n jsonUnmarshal,\n };\n\n const apiClient = new DefaultApiClient(config);\n await apiClient.init();\n config.apiClient = apiClient;\n\n return new CoredClient(config);\n }\n\n async preheat(): Promise<void> {\n await this.apiClient.preheat();\n }\n\n async close(): Promise<void> {\n await this.apiClient.close();\n }\n}\n"],"mappings":"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","names":["LoggerLevel","headers","randomAlphanumeric","httpResp","resp","ALPHANUMERIC"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cored-im/openapi-sdk",
|
|
3
|
+
"version": "0.28.102",
|
|
4
|
+
"description": "@cored-im/openapi-sdk - OpenAPI SDK for JavaScript/TypeScript",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"sideEffects": false,
|
|
22
|
+
"files": [
|
|
23
|
+
"dist",
|
|
24
|
+
"src"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"clean": "rm -rf dist"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"openapi",
|
|
33
|
+
"sdk",
|
|
34
|
+
"im"
|
|
35
|
+
],
|
|
36
|
+
"license": "Apache-2.0",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "https://github.com/cored-im/openapi-sdk-js"
|
|
40
|
+
},
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"ws": "^8.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependenciesMeta": {
|
|
45
|
+
"ws": {
|
|
46
|
+
"optional": true
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"tsup": "^8.0.0",
|
|
51
|
+
"typescript": "^5.0.0"
|
|
52
|
+
}
|
|
53
|
+
}
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Copyright (c) 2026 Cored Limited
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { Config } from '@/core/config';
|
|
5
|
+
import type {
|
|
6
|
+
ApiClient,
|
|
7
|
+
HttpClient,
|
|
8
|
+
Logger,
|
|
9
|
+
TimeManager,
|
|
10
|
+
Marshaller,
|
|
11
|
+
Unmarshaller,
|
|
12
|
+
} from '@/core/types';
|
|
13
|
+
import { LoggerLevel } from '@/core/types';
|
|
14
|
+
import { DefaultApiClient } from '@/core/api_client';
|
|
15
|
+
import { DefaultHttpClient } from '@/core/http_client';
|
|
16
|
+
import { DefaultLogger } from '@/core/logger';
|
|
17
|
+
import { DefaultTimeManager } from '@/core/time_manager';
|
|
18
|
+
import { Service as ImService } from '@/service/im/index';
|
|
19
|
+
|
|
20
|
+
export interface CoredClientOptions {
|
|
21
|
+
httpClient?: HttpClient;
|
|
22
|
+
requestTimeout?: number;
|
|
23
|
+
enableEncryption?: boolean;
|
|
24
|
+
logLevel?: LoggerLevel;
|
|
25
|
+
logger?: Logger;
|
|
26
|
+
timeManager?: TimeManager;
|
|
27
|
+
jsonMarshal?: Marshaller;
|
|
28
|
+
jsonUnmarshal?: Unmarshaller;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class CoredClient {
|
|
32
|
+
public readonly config: Config;
|
|
33
|
+
public readonly apiClient: ApiClient;
|
|
34
|
+
public readonly Im: ImService;
|
|
35
|
+
|
|
36
|
+
private constructor(config: Config) {
|
|
37
|
+
this.config = config;
|
|
38
|
+
this.apiClient = config.apiClient;
|
|
39
|
+
this.Im = new ImService(config);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static async create(
|
|
43
|
+
backendUrl: string,
|
|
44
|
+
appId: string,
|
|
45
|
+
appSecret: string,
|
|
46
|
+
options: CoredClientOptions = {},
|
|
47
|
+
): Promise<CoredClient> {
|
|
48
|
+
// Normalize backend URL
|
|
49
|
+
backendUrl = backendUrl.replace(/\/+$/, '');
|
|
50
|
+
|
|
51
|
+
const logger = options.logger ?? new DefaultLogger(options.logLevel ?? LoggerLevel.Info);
|
|
52
|
+
const httpClient = options.httpClient ?? new DefaultHttpClient(options.requestTimeout ?? 60_000);
|
|
53
|
+
const timeManager = options.timeManager ?? new DefaultTimeManager();
|
|
54
|
+
const jsonMarshal = options.jsonMarshal ?? ((v: unknown) => JSON.stringify(v));
|
|
55
|
+
const jsonUnmarshal = options.jsonUnmarshal ?? ((s: string) => JSON.parse(s));
|
|
56
|
+
|
|
57
|
+
const config: Config = {
|
|
58
|
+
appId,
|
|
59
|
+
appSecret,
|
|
60
|
+
backendUrl,
|
|
61
|
+
httpClient,
|
|
62
|
+
apiClient: null!, // will be set below
|
|
63
|
+
enableEncryption: options.enableEncryption ?? true,
|
|
64
|
+
requestTimeout: options.requestTimeout ?? 60_000,
|
|
65
|
+
timeManager,
|
|
66
|
+
logger,
|
|
67
|
+
jsonMarshal,
|
|
68
|
+
jsonUnmarshal,
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const apiClient = new DefaultApiClient(config);
|
|
72
|
+
await apiClient.init();
|
|
73
|
+
config.apiClient = apiClient;
|
|
74
|
+
|
|
75
|
+
return new CoredClient(config);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async preheat(): Promise<void> {
|
|
79
|
+
await this.apiClient.preheat();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async close(): Promise<void> {
|
|
83
|
+
await this.apiClient.close();
|
|
84
|
+
}
|
|
85
|
+
}
|