colonies-ts 0.1.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.md +341 -0
- package/dist/index.d.mts +274 -0
- package/dist/index.d.ts +274 -0
- package/dist/index.js +976 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +944 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/crypto.ts","../src/client.ts"],"sourcesContent":["export { Crypto, generatePrivateKey, deriveId, sign } from './crypto';\nexport { ColoniesClient, ProcessState } from './client';\nexport type { ColoniesClientConfig, FunctionSpec, RPCMessage } from './client';\n","/**\n * ColonyOS Crypto implementation\n * Ported from pycolonies/crypto.py\n * Based on eth-utils and eth-keys (MIT-licensed)\n */\n\nimport { sha3_256 } from '@noble/hashes/sha3';\nimport { sha256 } from '@noble/hashes/sha256';\nimport { hmac } from '@noble/hashes/hmac';\nimport { bytesToHex, hexToBytes, randomBytes } from '@noble/hashes/utils';\n\n// ============== secp256k1 Curve Parameters ==============\n\nconst A = 0n;\nconst N = 115792089237316195423570985008687907852837564279074904382605163141518161494337n;\nconst Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240n;\nconst Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424n;\nconst G: [bigint, bigint] = [Gx, Gy];\nconst P = 2n ** 256n - 2n ** 32n - 977n;\n\ntype Point = [bigint, bigint];\ntype JacobianPoint = [bigint, bigint, bigint];\n\n// ============== Utility Functions ==============\n\nfunction pad32(value: Uint8Array): Uint8Array {\n if (value.length >= 32) return value.slice(0, 32);\n const padded = new Uint8Array(32);\n padded.set(value, 32 - value.length);\n return padded;\n}\n\nfunction intToBigEndian(value: bigint): Uint8Array {\n if (value === 0n) return new Uint8Array([0]);\n const hex = value.toString(16);\n const paddedHex = hex.length % 2 ? '0' + hex : hex;\n return hexToBytes(paddedHex);\n}\n\nfunction bigEndianToInt(value: Uint8Array): bigint {\n if (value.length === 0) return 0n;\n return BigInt('0x' + bytesToHex(value));\n}\n\n// ============== Elliptic Curve Math ==============\n\nfunction inv(a: bigint, n: bigint): bigint {\n if (a === 0n) return 0n;\n let lm = 1n, hm = 0n;\n let low = ((a % n) + n) % n, high = n;\n while (low > 1n) {\n const r = high / low;\n const nm = hm - lm * r;\n const newVal = high - low * r;\n hm = lm;\n high = low;\n lm = nm;\n low = newVal;\n }\n return ((lm % n) + n) % n;\n}\n\nfunction toJacobian(p: Point): JacobianPoint {\n return [p[0], p[1], 1n];\n}\n\nfunction fromJacobian(p: JacobianPoint): Point {\n const z = inv(p[2], P);\n const z2 = (z * z) % P;\n const z3 = (z2 * z) % P;\n return [((p[0] * z2) % P + P) % P, ((p[1] * z3) % P + P) % P];\n}\n\nfunction jacobianDouble(p: JacobianPoint): JacobianPoint {\n if (p[1] === 0n) return [0n, 0n, 0n];\n const ysq = (p[1] ** 2n) % P;\n const S = (4n * p[0] * ysq) % P;\n const M = (3n * p[0] ** 2n + A * p[2] ** 4n) % P;\n const nx = ((M ** 2n - 2n * S) % P + P) % P;\n const ny = ((M * (S - nx) - 8n * ysq ** 2n) % P + P) % P;\n const nz = (2n * p[1] * p[2]) % P;\n return [nx, ny, nz];\n}\n\nfunction jacobianAdd(p: JacobianPoint, q: JacobianPoint): JacobianPoint {\n if (p[1] === 0n) return q;\n if (q[1] === 0n) return p;\n\n const U1 = (p[0] * q[2] ** 2n) % P;\n const U2 = (q[0] * p[2] ** 2n) % P;\n const S1 = (p[1] * q[2] ** 3n) % P;\n const S2 = (q[1] * p[2] ** 3n) % P;\n\n if (U1 === U2) {\n if (S1 !== S2) return [0n, 0n, 1n];\n return jacobianDouble(p);\n }\n\n const H = ((U2 - U1) % P + P) % P;\n const R = ((S2 - S1) % P + P) % P;\n const H2 = (H * H) % P;\n const H3 = (H * H2) % P;\n const U1H2 = (U1 * H2) % P;\n const nx = ((R ** 2n - H3 - 2n * U1H2) % P + P) % P;\n const ny = ((R * (U1H2 - nx) - S1 * H3) % P + P) % P;\n const nz = (H * p[2] * q[2]) % P;\n\n return [nx, ny, nz];\n}\n\nfunction jacobianMultiply(a: JacobianPoint, n: bigint): JacobianPoint {\n if (a[1] === 0n || n === 0n) return [0n, 0n, 1n];\n if (n === 1n) return a;\n if (n < 0n || n >= N) return jacobianMultiply(a, ((n % N) + N) % N);\n if (n % 2n === 0n) {\n return jacobianDouble(jacobianMultiply(a, n / 2n));\n } else {\n return jacobianAdd(jacobianDouble(jacobianMultiply(a, n / 2n)), a);\n }\n}\n\nfunction fastMultiply(a: Point, n: bigint): Point {\n return fromJacobian(jacobianMultiply(toJacobian(a), n));\n}\n\nfunction encodeRawPublicKey(rawPublicKey: Point): Uint8Array {\n const left = pad32(intToBigEndian(rawPublicKey[0]));\n const right = pad32(intToBigEndian(rawPublicKey[1]));\n const result = new Uint8Array(64);\n result.set(left, 0);\n result.set(right, 32);\n return result;\n}\n\nfunction privateKeyToPublicKey(privateKeyBytes: Uint8Array): Uint8Array {\n const privateKeyAsNum = bigEndianToInt(privateKeyBytes);\n if (privateKeyAsNum >= N) {\n throw new Error('Invalid private key');\n }\n const rawPublicKey = fastMultiply(G, privateKeyAsNum);\n return encodeRawPublicKey(rawPublicKey);\n}\n\n// ============== ECDSA Signing ==============\n\nfunction deterministicGenerateK(msgHash: Uint8Array, privateKeyBytes: Uint8Array): bigint {\n const v0 = new Uint8Array(32).fill(0x01);\n const k0 = new Uint8Array(32).fill(0x00);\n\n // k1 = HMAC(k0, v0 || 0x00 || priv || hash)\n const data1 = new Uint8Array(v0.length + 1 + privateKeyBytes.length + msgHash.length);\n data1.set(v0, 0);\n data1[v0.length] = 0x00;\n data1.set(privateKeyBytes, v0.length + 1);\n data1.set(msgHash, v0.length + 1 + privateKeyBytes.length);\n const k1 = hmac(sha256, k0, data1);\n\n // v1 = HMAC(k1, v0)\n const v1 = hmac(sha256, k1, v0);\n\n // k2 = HMAC(k1, v1 || 0x01 || priv || hash)\n const data2 = new Uint8Array(v1.length + 1 + privateKeyBytes.length + msgHash.length);\n data2.set(v1, 0);\n data2[v1.length] = 0x01;\n data2.set(privateKeyBytes, v1.length + 1);\n data2.set(msgHash, v1.length + 1 + privateKeyBytes.length);\n const k2 = hmac(sha256, k1, data2);\n\n // v2 = HMAC(k2, v1)\n const v2 = hmac(sha256, k2, v1);\n\n // kb = HMAC(k2, v2)\n const kb = hmac(sha256, k2, v2);\n return bigEndianToInt(kb);\n}\n\nfunction ecdsaRawSign(msgHash: Uint8Array, privateKeyBytes: Uint8Array): [number, bigint, bigint] {\n const z = bigEndianToInt(msgHash);\n const k = deterministicGenerateK(msgHash, privateKeyBytes);\n\n const [r, y] = fastMultiply(G, k);\n const privKeyNum = bigEndianToInt(privateKeyBytes);\n const sRaw = (inv(k, N) * (z + r * privKeyNum)) % N;\n\n const v = 27 + Number((y % 2n) ^ (sRaw * 2n < N ? 0n : 1n));\n const s = sRaw * 2n < N ? sRaw : N - sRaw;\n\n return [v - 27, r, s];\n}\n\n// ============== Exported Functions ==============\n\n/**\n * Generate a new random private key\n * @returns Hex-encoded private key (64 characters)\n */\nexport function generatePrivateKey(): string {\n const randomData = randomBytes(32);\n const hash = sha3_256(randomData);\n return bytesToHex(hash);\n}\n\n/**\n * Derive the public ID from a private key\n * Uses SHA3-256 hash of \"04\" + hex(publicKey)\n * @param privateKey - Hex-encoded private key\n * @returns Hex-encoded ID (64 characters)\n */\nexport function deriveId(privateKey: string): string {\n const privateKeyBytes = hexToBytes(privateKey);\n const publicKey = privateKeyToPublicKey(privateKeyBytes);\n const publicKeyHex = '04' + bytesToHex(publicKey);\n\n // Hash the string representation, not the bytes\n const encoder = new TextEncoder();\n const hash = sha3_256(encoder.encode(publicKeyHex));\n\n return bytesToHex(hash);\n}\n\n/**\n * Sign a message with a private key\n * @param message - Message to sign\n * @param privateKey - Hex-encoded private key\n * @returns Hex-encoded signature (130 characters: r + s + v)\n */\nexport function sign(message: string, privateKey: string): string {\n const privateKeyBytes = hexToBytes(privateKey);\n\n // Hash message with SHA3-256\n const encoder = new TextEncoder();\n const msgHash = sha3_256(encoder.encode(message));\n\n const [v, r, s] = ecdsaRawSign(msgHash, privateKeyBytes);\n\n // Format: r (32 bytes) + s (32 bytes) + v (1 byte)\n const vBytes = new Uint8Array([v]);\n const rBytes = pad32(intToBigEndian(r));\n const sBytes = pad32(intToBigEndian(s));\n\n const signature = new Uint8Array(65);\n signature.set(rBytes, 0);\n signature.set(sBytes, 32);\n signature.set(vBytes, 64);\n\n return bytesToHex(signature);\n}\n\n/**\n * Crypto utility class for convenience\n */\nexport class Crypto {\n generatePrivateKey(): string {\n return generatePrivateKey();\n }\n\n id(privateKey: string): string {\n return deriveId(privateKey);\n }\n\n sign(message: string, privateKey: string): string {\n return sign(message, privateKey);\n }\n}\n\n// Export internal functions for testing\nexport const _internal = {\n jacobianAdd,\n jacobianDouble,\n fastMultiply,\n pad32,\n intToBigEndian,\n bigEndianToInt,\n};\n","/**\n * ColonyOS Client\n * Ported from colonyspace/aila/src/lib/api/colony.ts\n */\n\nimport { Crypto } from './crypto';\n\n// Helper function to decode base64 payload with proper UTF-8 handling\nfunction decodeBase64Utf8(base64: string): string {\n const binaryStr = atob(base64);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return new TextDecoder('utf-8').decode(bytes);\n}\n\n// Helper function to encode string to base64 with proper UTF-8 handling\nfunction encodeBase64Utf8(str: string): string {\n const utf8Bytes = new TextEncoder().encode(str);\n const binaryStr = String.fromCharCode(...utf8Bytes);\n return btoa(binaryStr);\n}\n\nexport interface ColoniesClientConfig {\n host: string;\n port: number;\n tls?: boolean;\n}\n\nexport interface RPCMessage {\n payloadtype: string;\n payload: string;\n signature: string;\n}\n\nexport interface FunctionSpec {\n nodename?: string;\n funcname: string;\n args?: any[];\n kwargs?: Record<string, any>;\n priority?: number;\n maxwaittime?: number;\n maxexectime?: number;\n maxretries?: number;\n conditions?: {\n colonyname?: string;\n executornames?: string[];\n executortype?: string;\n dependencies?: string[];\n nodes?: number;\n cpu?: string;\n processes?: number;\n processespernode?: number;\n mem?: string;\n storage?: string;\n gpu?: { name?: string; mem?: string; count?: number; nodecount?: number };\n walltime?: number;\n };\n label?: string;\n fs?: any;\n env?: Record<string, string>;\n channels?: string[];\n}\n\nexport enum ProcessState {\n WAITING = 0,\n RUNNING = 1,\n SUCCESS = 2,\n FAILED = 3,\n}\n\nexport class ColoniesClient {\n private host: string;\n private port: number;\n private tls: boolean;\n private crypto: Crypto;\n private privateKey: string | null = null;\n\n constructor(config: ColoniesClientConfig) {\n this.host = config.host;\n this.port = config.port;\n this.tls = config.tls ?? false;\n this.crypto = new Crypto();\n }\n\n setPrivateKey(privateKey: string): void {\n this.privateKey = privateKey;\n }\n\n private getBaseUrl(): string {\n const protocol = this.tls ? 'https' : 'http';\n return `${protocol}://${this.host}:${this.port}/api`;\n }\n\n private createRPCMsg(msg: any): RPCMessage {\n if (!this.privateKey) {\n throw new Error('Private key not set. Call setPrivateKey() first.');\n }\n\n const payload = encodeBase64Utf8(JSON.stringify(msg));\n const signature = this.crypto.sign(payload, this.privateKey);\n\n return {\n payloadtype: msg.msgtype,\n payload,\n signature,\n };\n }\n\n private async sendRPC(rpcMessage: RPCMessage): Promise<any> {\n const url = this.getBaseUrl();\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(rpcMessage),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorObj;\n try {\n errorObj = JSON.parse(errorText);\n } catch {\n throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);\n }\n\n if (errorObj.payload) {\n try {\n const decodedPayload = decodeBase64Utf8(errorObj.payload);\n const decodedError = JSON.parse(decodedPayload);\n throw new Error(decodedError.message || JSON.stringify(decodedError));\n } catch (e) {\n if (e instanceof Error && e.message !== 'Request failed') {\n throw e;\n }\n }\n }\n throw new Error(JSON.stringify(errorObj));\n }\n\n const responseText = await response.text();\n if (!responseText || responseText.trim() === '') {\n throw new Error('Server returned empty response');\n }\n\n const rpcReplyMsg = JSON.parse(responseText);\n const msg = JSON.parse(decodeBase64Utf8(rpcReplyMsg.payload));\n\n if (rpcReplyMsg.error === true) {\n const errorMessage = typeof msg === 'object' && msg.message ? msg.message : JSON.stringify(msg);\n throw new Error(errorMessage);\n }\n\n return msg;\n }\n\n // ==================== Colony Methods ====================\n\n async getColonies(): Promise<any> {\n const msg = { msgtype: 'getcoloniesmsg' };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getStatistics(): Promise<any> {\n const msg = { msgtype: 'getstatisticsmsg' };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Add a new colony (requires server private key)\n * @param colony - Colony object with colonyid and name\n */\n async addColony(colony: { colonyid: string; name: string }): Promise<any> {\n const msg = {\n msgtype: 'addcolonymsg',\n colony,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Remove a colony (requires server private key)\n * @param colonyName - Name of the colony to remove\n */\n async removeColony(colonyName: string): Promise<any> {\n const msg = {\n msgtype: 'removecolonymsg',\n colonyname: colonyName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Executor Methods ====================\n\n async getExecutors(colonyName: string): Promise<any> {\n const msg = {\n msgtype: 'getexecutorsmsg',\n colonyname: colonyName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getExecutor(colonyName: string, executorName: string): Promise<any> {\n const msg = {\n msgtype: 'getexecutormsg',\n colonyname: colonyName,\n executorname: executorName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async addExecutor(executor: {\n executorid: string;\n executortype: string;\n executorname: string;\n colonyname: string;\n }): Promise<any> {\n const msg = {\n msgtype: 'addexecutormsg',\n executor,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async approveExecutor(colonyName: string, executorName: string): Promise<any> {\n const msg = {\n msgtype: 'approveexecutormsg',\n colonyname: colonyName,\n executorname: executorName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeExecutor(colonyName: string, executorName: string): Promise<any> {\n const msg = {\n msgtype: 'removeexecutormsg',\n colonyname: colonyName,\n executorname: executorName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Process Methods ====================\n\n async submitFunctionSpec(spec: FunctionSpec): Promise<any> {\n const msg = {\n msgtype: 'submitfuncspecmsg',\n spec,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getProcess(processId: string): Promise<any> {\n const msg = {\n msgtype: 'getprocessmsg',\n processid: processId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getProcesses(colonyName: string, count: number, state: ProcessState): Promise<any> {\n const msg = {\n msgtype: 'getprocessesmsg',\n colonyname: colonyName,\n count,\n state,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeProcess(processId: string): Promise<any> {\n const msg = {\n msgtype: 'removeprocessmsg',\n processid: processId,\n all: false,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeAllProcesses(colonyName: string, state: number = -1): Promise<any> {\n const msg = {\n msgtype: 'removeallprocessesmsg',\n colonyname: colonyName,\n state,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async assign(colonyName: string, timeout: number, executorPrvKey: string): Promise<any> {\n // Temporarily set the executor private key for this operation\n const originalKey = this.privateKey;\n this.setPrivateKey(executorPrvKey);\n\n try {\n const msg = {\n msgtype: 'assignprocessmsg',\n colonyname: colonyName,\n timeout,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n } finally {\n if (originalKey) {\n this.setPrivateKey(originalKey);\n }\n }\n }\n\n async closeProcess(processId: string, output: string[]): Promise<any> {\n const msg = {\n msgtype: 'closesuccessfulmsg',\n processid: processId,\n out: output,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async failProcess(processId: string, errors: string[]): Promise<any> {\n const msg = {\n msgtype: 'closefailedmsg',\n processid: processId,\n errors,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Workflow Methods ====================\n\n async submitWorkflowSpec(workflowSpec: {\n colonyname: string;\n functionspecs: FunctionSpec[];\n }): Promise<any> {\n const msg = {\n msgtype: 'submitworkflowspecmsg',\n spec: workflowSpec,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getProcessGraph(processGraphId: string): Promise<any> {\n const msg = {\n msgtype: 'getprocessgraphmsg',\n processgraphid: processGraphId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getProcessGraphs(colonyName: string, count: number, state?: ProcessState): Promise<any> {\n const msg: any = {\n msgtype: 'getprocessgraphsmsg',\n colonyname: colonyName,\n count,\n };\n if (state !== undefined) {\n msg.state = state;\n }\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeProcessGraph(processGraphId: string): Promise<any> {\n const msg = {\n msgtype: 'removeprocessgraphmsg',\n processgraphid: processGraphId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeAllProcessGraphs(colonyName: string, state?: ProcessState): Promise<any> {\n const msg: any = {\n msgtype: 'removeallprocessgraphsmsg',\n colonyname: colonyName,\n };\n if (state !== undefined) {\n msg.state = state;\n }\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Log Methods ====================\n\n async addLog(processId: string, message: string, executorPrvKey: string): Promise<any> {\n const originalKey = this.privateKey;\n this.setPrivateKey(executorPrvKey);\n\n try {\n const msg = {\n msgtype: 'addlogmsg',\n processid: processId,\n message,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n } finally {\n if (originalKey) {\n this.setPrivateKey(originalKey);\n }\n }\n }\n\n async getLogs(colonyName: string, processId: string, executorName: string, count: number = 100, since: number = 0): Promise<any> {\n const msg = {\n msgtype: 'getlogsmsg',\n colonyname: colonyName,\n processid: processId,\n executorname: executorName,\n count,\n since,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Function Methods ====================\n\n async getFunctions(executorName: string, colonyName: string): Promise<any> {\n const msg = {\n msgtype: 'getfunctionsmsg',\n executorname: executorName,\n colonyname: colonyName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Cron Methods ====================\n\n async getCrons(colonyName: string, count: number = 100): Promise<any> {\n const msg = {\n msgtype: 'getcronsmsg',\n colonyname: colonyName,\n count,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getCron(cronId: string): Promise<any> {\n const msg = {\n msgtype: 'getcronmsg',\n cronid: cronId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async addCron(cronSpec: any): Promise<any> {\n const msg = {\n msgtype: 'addcronmsg',\n cron: cronSpec,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeCron(cronId: string): Promise<any> {\n const msg = {\n msgtype: 'removecronmsg',\n cronid: cronId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Generator Methods ====================\n\n async getGenerators(colonyName: string, count: number = 100): Promise<any> {\n const msg = {\n msgtype: 'getgeneratorsmsg',\n colonyname: colonyName,\n count,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getGenerator(generatorId: string): Promise<any> {\n const msg = {\n msgtype: 'getgeneratormsg',\n generatorid: generatorId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async addGenerator(generatorSpec: any): Promise<any> {\n const msg = {\n msgtype: 'addgeneratormsg',\n generator: generatorSpec,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== User Methods ====================\n\n async getUsers(colonyName: string): Promise<any> {\n const msg = {\n msgtype: 'getusersmsg',\n colonyname: colonyName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async addUser(user: {\n colonyname: string;\n userid: string;\n name: string;\n email: string;\n phone: string;\n }): Promise<any> {\n const msg = {\n msgtype: 'addusermsg',\n user,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async removeUser(colonyName: string, name: string): Promise<any> {\n const msg = {\n msgtype: 'removeusermsg',\n colonyname: colonyName,\n name,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== File Methods ====================\n\n async getFileLabels(colonyName: string, name: string = '', exact: boolean = false): Promise<any> {\n const msg = {\n msgtype: 'getfilelabelsmsg',\n colonyname: colonyName,\n name,\n exact,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getFiles(colonyName: string, label: string): Promise<any> {\n const msg = {\n msgtype: 'getfilesmsg',\n colonyname: colonyName,\n label,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Attribute Methods ====================\n\n async addAttribute(attribute: {\n targetid: string;\n targetcolonyname: string;\n targetprocessgraphid: string;\n attributetype: number;\n key: string;\n value: string;\n }): Promise<any> {\n const msg = {\n msgtype: 'addattributemsg',\n attribute,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n async getAttribute(attributeId: string): Promise<any> {\n const msg = {\n msgtype: 'getattributemsg',\n attributeid: attributeId,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Channel Methods ====================\n\n /**\n * Append a message to a process channel\n * @param processId - ID of the process\n * @param channelName - Name of the channel\n * @param sequence - Client-assigned sequence number\n * @param inReplyTo - Sequence number this message is replying to (0 if not a reply)\n * @param payload - Message content (string or Uint8Array)\n */\n async channelAppend(\n processId: string,\n channelName: string,\n sequence: number,\n inReplyTo: number,\n payload: string | Uint8Array\n ): Promise<any> {\n let payloadBytes: number[];\n if (typeof payload === 'string') {\n const encoder = new TextEncoder();\n payloadBytes = Array.from(encoder.encode(payload));\n } else {\n payloadBytes = Array.from(payload);\n }\n\n const msg = {\n msgtype: 'channelappendmsg',\n processid: processId,\n name: channelName,\n sequence: sequence,\n inreplyto: inReplyTo,\n payload: payloadBytes,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Read messages from a process channel\n * @param processId - ID of the process\n * @param channelName - Name of the channel\n * @param afterSeq - Read messages after this sequence number (use 0 for all)\n * @param limit - Maximum number of messages to return (0 for no limit)\n */\n async channelRead(\n processId: string,\n channelName: string,\n afterSeq: number,\n limit: number\n ): Promise<any[]> {\n const msg = {\n msgtype: 'channelreadmsg',\n processid: processId,\n name: channelName,\n afterseq: afterSeq,\n limit: limit,\n };\n\n const response = await this.sendRPC(this.createRPCMsg(msg));\n\n // Response is an array of channel entries, decode payload bytes if needed\n if (Array.isArray(response)) {\n return response.map((entry) => ({\n ...entry,\n payload:\n typeof entry.payload === 'string'\n ? (() => {\n try {\n const binaryStr = atob(entry.payload);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return new TextDecoder('utf-8').decode(bytes);\n } catch {\n return entry.payload;\n }\n })()\n : Array.isArray(entry.payload)\n ? new TextDecoder('utf-8').decode(new Uint8Array(entry.payload))\n : entry.payload,\n }));\n }\n\n return response || [];\n }\n\n /**\n * Subscribe to a channel using WebSocket for real-time updates\n * @param processId - ID of the process\n * @param channelName - Name of the channel\n * @param afterSeq - Start reading after this sequence number\n * @param timeout - Timeout in seconds for the subscription\n * @param onMessage - Callback for new messages\n * @param onError - Callback for errors\n * @param onClose - Callback when connection closes\n * @returns WebSocket instance for cleanup\n */\n subscribeChannel(\n processId: string,\n channelName: string,\n afterSeq: number,\n timeout: number,\n onMessage: (entries: any[]) => void,\n onError: (error: Error) => void,\n onClose: () => void\n ): WebSocket {\n if (!this.privateKey) {\n throw new Error('Private key not set. Call setPrivateKey() first.');\n }\n\n const wsProtocol = this.tls ? 'wss' : 'ws';\n const wsUrl = `${wsProtocol}://${this.host}:${this.port}/pubsub`;\n\n const ws = new WebSocket(wsUrl);\n\n ws.onopen = () => {\n const msg = {\n msgtype: 'subscribechannelmsg',\n processid: processId,\n name: channelName,\n afterseq: afterSeq,\n timeout: timeout,\n };\n\n const rpcMsg = this.createRPCMsg(msg);\n ws.send(JSON.stringify(rpcMsg));\n };\n\n ws.onmessage = (event) => {\n try {\n const rpcReply = JSON.parse(event.data as string);\n\n if (rpcReply.error) {\n const errorPayload = JSON.parse(decodeBase64Utf8(rpcReply.payload));\n onError(new Error(errorPayload.message || 'WebSocket error'));\n return;\n }\n\n const data = JSON.parse(decodeBase64Utf8(rpcReply.payload));\n\n if (Array.isArray(data)) {\n const entries = data.map((entry) => ({\n ...entry,\n payload:\n typeof entry.payload === 'string'\n ? (() => {\n try {\n const binaryStr = atob(entry.payload);\n const bytes = new Uint8Array(binaryStr.length);\n for (let i = 0; i < binaryStr.length; i++) {\n bytes[i] = binaryStr.charCodeAt(i);\n }\n return new TextDecoder('utf-8').decode(bytes);\n } catch {\n return entry.payload;\n }\n })()\n : Array.isArray(entry.payload)\n ? new TextDecoder('utf-8').decode(new Uint8Array(entry.payload))\n : entry.payload,\n }));\n\n const errorEntry = entries.find((e) => e.error);\n if (errorEntry) {\n onError(new Error(errorEntry.error));\n return;\n }\n\n onMessage(entries);\n }\n } catch (err) {\n onError(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n ws.onerror = () => {\n onError(new Error('WebSocket connection error'));\n };\n\n ws.onclose = () => {\n onClose();\n };\n\n return ws;\n }\n\n // ==================== Blueprint Definition Methods ====================\n\n /**\n * Add a blueprint definition\n * @param definition - Blueprint definition object\n */\n async addBlueprintDefinition(definition: any): Promise<any> {\n const msg = {\n msgtype: 'addblueprintdefinitionmsg',\n blueprintdefinition: definition,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Get a blueprint definition by name\n * @param colonyName - Name of the colony\n * @param name - Name of the blueprint definition\n */\n async getBlueprintDefinition(colonyName: string, name: string): Promise<any> {\n const msg = {\n msgtype: 'getblueprintdefinitionmsg',\n colonyname: colonyName,\n name,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Get all blueprint definitions in a colony\n * @param colonyName - Name of the colony\n */\n async getBlueprintDefinitions(colonyName: string): Promise<any[]> {\n const msg = {\n msgtype: 'getblueprintdefinitionsmsg',\n colonyname: colonyName,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Remove a blueprint definition\n * @param colonyName - Name of the colony (namespace)\n * @param name - Name of the blueprint definition to remove\n */\n async removeBlueprintDefinition(colonyName: string, name: string): Promise<void> {\n const msg = {\n msgtype: 'removeblueprintdefinitionmsg',\n namespace: colonyName,\n name,\n };\n await this.sendRPC(this.createRPCMsg(msg));\n }\n\n // ==================== Blueprint Methods ====================\n\n /**\n * Add a blueprint instance\n * @param blueprint - Blueprint object\n */\n async addBlueprint(blueprint: any): Promise<any> {\n const msg = {\n msgtype: 'addblueprintmsg',\n blueprint,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Get a blueprint by name\n * @param colonyName - Name of the colony (namespace)\n * @param name - Name of the blueprint\n */\n async getBlueprint(colonyName: string, name: string): Promise<any> {\n const msg = {\n msgtype: 'getblueprintmsg',\n namespace: colonyName,\n name,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Get blueprints in a colony, optionally filtered by kind and location\n * @param colonyName - Name of the colony (namespace)\n * @param kind - Optional kind filter\n * @param location - Optional location filter\n */\n async getBlueprints(colonyName: string, kind?: string, location?: string): Promise<any[]> {\n const msg: any = {\n msgtype: 'getblueprintsmsg',\n namespace: colonyName,\n };\n if (kind) msg.kind = kind;\n if (location) msg.locationname = location;\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Update an existing blueprint\n * @param blueprint - Updated blueprint object\n * @param forceGeneration - Force generation bump even if spec unchanged\n */\n async updateBlueprint(blueprint: any, forceGeneration: boolean = false): Promise<any> {\n const msg = {\n msgtype: 'updateblueprintmsg',\n blueprint,\n forcegeneration: forceGeneration,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Remove a blueprint\n * @param colonyName - Name of the colony (namespace)\n * @param name - Name of the blueprint to remove\n */\n async removeBlueprint(colonyName: string, name: string): Promise<void> {\n const msg = {\n msgtype: 'removeblueprintmsg',\n namespace: colonyName,\n name,\n };\n await this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Update blueprint status (current state)\n * @param colonyName - Name of the colony\n * @param name - Name of the blueprint\n * @param status - Status object representing current state\n */\n async updateBlueprintStatus(colonyName: string, name: string, status: any): Promise<void> {\n const msg = {\n msgtype: 'updateblueprintstatusmsg',\n colonyname: colonyName,\n blueprintname: name,\n status,\n };\n await this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Trigger reconciliation for a blueprint\n * @param colonyName - Name of the colony (namespace)\n * @param name - Name of the blueprint\n * @param force - Force reconciliation even if no changes detected\n */\n async reconcileBlueprint(colonyName: string, name: string, force: boolean = false): Promise<any> {\n const msg = {\n msgtype: 'reconcileblueprintmsg',\n namespace: colonyName,\n name,\n force,\n };\n return this.sendRPC(this.createRPCMsg(msg));\n }\n\n /**\n * Subscribe to process state changes using WebSocket\n * Use this to wait for a process to be assigned (RUNNING state) before subscribing to channels\n * @param colonyName - Name of the colony\n * @param processId - ID of the process to watch\n * @param state - Target state to wait for (0=WAITING, 1=RUNNING, 2=SUCCESS, 3=FAILED)\n * @param timeout - Timeout in seconds for the subscription\n * @param onProcess - Callback when process reaches the target state\n * @param onError - Callback for errors\n * @param onClose - Callback when connection closes\n * @returns WebSocket instance for cleanup\n */\n subscribeProcess(\n colonyName: string,\n processId: string,\n state: number,\n timeout: number,\n onProcess: (process: any) => void,\n onError: (error: Error) => void,\n onClose: () => void\n ): WebSocket {\n if (!this.privateKey) {\n throw new Error('Private key not set. Call setPrivateKey() first.');\n }\n\n const wsProtocol = this.tls ? 'wss' : 'ws';\n const wsUrl = `${wsProtocol}://${this.host}:${this.port}/pubsub`;\n\n const ws = new WebSocket(wsUrl);\n\n ws.onopen = () => {\n const msg = {\n msgtype: 'subscribeprocessmsg',\n colonyname: colonyName,\n processid: processId,\n executortype: '',\n state: state,\n timeout: timeout,\n };\n\n const rpcMsg = this.createRPCMsg(msg);\n ws.send(JSON.stringify(rpcMsg));\n };\n\n ws.onmessage = (event) => {\n try {\n const rpcReply = JSON.parse(event.data as string);\n\n if (rpcReply.error) {\n const errorPayload = JSON.parse(decodeBase64Utf8(rpcReply.payload));\n onError(new Error(errorPayload.message || 'WebSocket error'));\n return;\n }\n\n const process = JSON.parse(decodeBase64Utf8(rpcReply.payload));\n onProcess(process);\n } catch (err) {\n onError(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n ws.onerror = () => {\n onError(new Error('WebSocket connection error'));\n };\n\n ws.onclose = () => {\n onClose();\n };\n\n return ws;\n }\n}\n"],"mappings":"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","names":["ProcessState"]}
|