dolphindb 3.1.41 → 3.1.42
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/browser.d.ts +4 -2
- package/browser.js +4 -15
- package/browser.js.map +1 -1
- package/index.d.ts +4 -2
- package/index.js +5 -14
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/unused.js +1 -0
- package/unused.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dolphindb",
|
|
3
3
|
"description": "DolphinDB JavaScript API",
|
|
4
|
-
"version": "3.1.
|
|
4
|
+
"version": "3.1.42",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
7
7
|
"browser": "./browser.js",
|
|
@@ -30,13 +30,13 @@
|
|
|
30
30
|
],
|
|
31
31
|
"devDependencies": {
|
|
32
32
|
"@types/node": "^25.5.0",
|
|
33
|
-
"eslint": "^10.0
|
|
34
|
-
"typescript": "^
|
|
33
|
+
"eslint": "^10.1.0",
|
|
34
|
+
"typescript": "^6.0.2"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
37
|
"dayjs": "^1.11.20",
|
|
38
38
|
"ipaddr.js": "^2.3.0",
|
|
39
39
|
"tslib": "^2.8.1",
|
|
40
|
-
"xshell": "^1.3.
|
|
40
|
+
"xshell": "^1.3.51"
|
|
41
41
|
}
|
|
42
42
|
}
|
package/unused.js
CHANGED
package/unused.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unused.js","sourceRoot":"","sources":["unused.ts"],"names":[],"mappings":"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","sourcesContent":["// import { Socket, createServer as create_socket_server, Server as SocketServer } from 'net'\n// import { TLSSocket, connect as tls_connect } from 'tls'\n// import type { Duplex } from 'stream'\n\n// import { table, getBorderCharacters, type TableUserConfig } from 'table'\n\n// class DdbObj {\n// port = 8848\n \n// /** ddb 连接状态 */\n// state = '未连接'\n \n// socket = null as Socket\n \n// clients = new Set<Duplex>()\n \n \n// /** dolphindb http rpc \n// - code\n// - options\n// - session_id: 20 分钟内无操作服务端会清空 session,删除所有变量\n// */\n// async rpc_json (\n// code: string,\n// {\n// hostname = '127.0.0.1',\n// // hostname = 'localhost',\n \n// port = this.port,\n// tls = false,\n// sid = this.sid,\n \n// // TEST\n// proxy = MyProxy.whistle\n// }: {\n// hostname?: string\n// port?: number\n// tls?: boolean\n// sid?: string\n// proxy?: MyProxy | false\n// } = { }\n// ): Promise<DdbJsonObj> {\n// let result = await request_json(`${tls ? 'https' : 'http'}://${hostname}:${port}/${sid}`, {\n// body: {\n// sessionID: sid,\n// functionName: 'executeCode',\n// params: [{\n// name: 'script',\n// form: 'scalar',\n// type: 'string',\n// value: encodeURIComponent(code)\n// }]\n// },\n// proxy\n// })\n \n// this.sid = result.sessionID\n \n// result.resultCode = Number(result.resultCode)\n \n// // result.userId: 未登录时为 `''`\n \n// if (result.resultCode)\n// throw Object.assign(\n// // result.msg: 成功时为 `''`; 失败时为错误信息\n// new Error((result.msg as string).red),\n// result\n// )\n \n \n// return new DdbJsonObj(result.object[0])\n// }\n \n \n// /** 创建 tcp 连接到 ddb,并完成 connect 请求,读到 chunk 后执行 on_chunk 回调\n// 成功完成后 this.socket, this.sid 会被初始化\n// */\n// async connect_socket () {\n// // --- 创建 socket, attach 状态、异常事件处理\n// this.socket = new Socket({\n// allowHalfOpen: false,\n// readable: true,\n// writable: true\n// })\n \n// this.socket.on('lookup', (error, address, family, host) => {\n// console.log('socket 域名解析 (lookup) 完成', error, address, family, host)\n// })\n \n// this.socket.on('ready', () => {\n// console.log('socket 准备就绪')\n// })\n \n// this.socket.on('close', has_error => {\n// console.log('socket 成功关闭,是否出错?', has_error)\n// })\n \n// this.socket.on('timeout', () => {\n// console.log('socket 超时')\n// })\n \n// this.socket.on('error', error => {\n// console.log('socket 出错了', error)\n// })\n \n \n// // ---\n// console.log('将 socket 连接到 server')\n// await new Promise<void>(resolve => {\n// // callback 会被 socket.once('connect', callback)\n// this.socket.connect({\n// port: this.port,\n \n// // host: 'localhost',\n// host: '127.0.0.1',\n \n// family: 0,\n// }, resolve)\n// })\n \n// console.log(this.state = 'socket 已连接')\n \n \n// // ---\n// console.log('发送 connect 请求到 ddb')\n \n// this.socket.write(\n// `API ${this.sid || '0'} 8\\n` +\n// 'connect\\n'\n// )\n \n// console.log(this.state = '已发送 connect 请求')\n \n \n// // --- 读取流数据,只等到 connect 完成,后续 chunk 交给 callback\n// await new Promise<void>(async (resolve, reject) => {\n// let last_chunk: Buffer\n \n// try {\n// for await (const chunk of this.socket) {\n// last_chunk = chunk\n// console.log('ddb.socket 读取到 chunk, 转发给所有 websocket clients')\n \n// const ck = chunk as Uint8Array\n \n// if (this.state === '已发送 connect 请求') {\n// // --- 读取 sid\n// const i_sid_end = ck.indexOf(0x20)\n \n// this.sid = this.dec.decode(\n// ck.subarray(\n// 0,\n// i_sid_end\n// )\n// )\n// console.log('sid = ', this.sid)\n \n// console.log(this.state = 'connect 完成')\n \n// resolve()\n \n// continue\n// }\n \n// this.on_chunk(ck)\n// }\n \n// console.log('ddb.socket 完美结束 (no more data to read)')\n// } catch (error) {\n// console.log('捕获到 socket 错误', error)\n// console.log('最后一个 chunk', last_chunk)\n// reject(error)\n// }\n// })\n// }\n \n \n// on_chunk (chunk: Uint8Array) {\n// for (let client of this.clients)\n// client.write(chunk)\n// }\n// }\n\n\n// class DdbJsonObj {\n// static ddb_null = { name: '', form: 'scalar', type: 'void', value: null } as const\n \n// static table_config: TableUserConfig = {\n// border: getBorderCharacters('void'),\n// singleLine: true,\n// columnDefault: {\n// paddingLeft: 0,\n// paddingRight: 1,\n// alignment: 'right'\n// },\n// }\n \n \n// name: string\n \n// form: DdbJsonForm\n \n// type?: DdbJsonType\n \n// /** 向量有这个属性 */\n// size?: number\n \n// value: null | boolean | number | string | DdbJsonObj | DdbJsonObj[]\n \n// constructor (data?: {\n// name: string\n// form: DdbJsonForm\n// type?: DdbJsonType\n// size?: string | number\n// value: any\n// }) {\n// const { name, form, type, size, value } = data || DdbJsonObj.ddb_null as DdbJsonObj\n \n// this.name = name\n// this.form = form\n// this.type = type\n \n// if ((typeof size === 'string' && size) || typeof size === 'number')\n// this.size = Number(size)\n \n// this.value = (() => {\n// if (form === 'scalar') {\n// if (type === 'void')\n// return null\n \n// if (type === 'int' || type === 'short' || type === 'float' || type === 'double') {\n// if (value === 'pi' || value === 'e')\n// return value\n \n// return Number(value)\n// }\n \n// if (type === 'long')\n// return BigInt(value)\n \n// if (type === 'bool')\n// return Boolean(value)\n \n// // integral: int128\n// // literal: char | string | uuid\n// // temporal: date | month | time | second | datetime | timestamp | nanotime | nanotimestamp | datehour\n// // system: code | ipaddr | duration\n// // complex | point\n// return value\n// }\n \n// if (form === 'pair')\n// return value\n \n// if (form === 'vector')\n// return value\n \n// if (form === 'set')\n// return value\n \n// if (form === 'matrix')\n// return value\n \n// if (form === 'dictionary')\n// return value\n \n// if (form === 'table')\n// return value\n// })()\n// }\n \n \n// [inspect.custom] () {\n// const { form, type, value, name, size } = this\n \n// if (form === 'scalar')\n// return this.format_scalar(type, value)\n \n// if (form === 'pair') {\n// const [l, r] = value as [any, any]\n// return `${ l === null ? '' : this.format_scalar(type, l) }:${ r === null ? '' : this.format_scalar(type, r) }`\n// }\n \n// if (form === 'vector' || form === 'set') {\n// return (name ? `${name} ` : '') +\n// (\n// (value as any[]).map(x => \n// x && typeof x === 'object' ?\n// inspect(\n// new DdbJsonObj(x), \n// { colors: false }\n// )\n// :\n// this.format_scalar(type, x)\n// ).join(', ') || ' '\n// ).surround(\n// form === 'vector' ? '[' : '{',\n// form === 'vector' ? ']' : '}',\n// )\n// }\n \n// if (form === 'dictionary') {\n// const [keys, values] = value as [any, any]\n// let obj = { } as Record<string, DdbJsonObj | string>\n// const size = Number(keys.size)\n// if (!size) return `dict(${keys.type}, ${values.type})`\n \n// for (let i = 0; i < size; i++) {\n// const key = keys.type === 'string' ? \n// keys.value[i]\n// :\n// this.format_scalar(keys.type, keys.value[i])\n \n// const v = values.value[i]\n// const value = typeof v === 'string' ? \n// v\n// :\n// new DdbJsonObj(v)\n// obj[key] = value\n// }\n \n// return obj\n// }\n \n// if (form === 'matrix') {\n// const nrows = Number(value[1].value)\n// const ncols = Number(value[2].value)\n// const values = value[0].value\n \n// let data = [ ]\n// for (let i = 0; i < nrows; i++)\n// for (let j = 0; j < ncols; j++) {\n// const value = values[nrows * j + i]\n// let row = data[i] || [ ]\n// row[j] = this.format_scalar(type, value)\n// data[i] = row\n// }\n \n// return `matrix <${type}[${ncols}][${nrows}]>\\n` +\n// table(data, DdbJsonObj.table_config)\n// }\n \n// if (form === 'table') {\n// const nrows = Number(size)\n// const ncols = (value as any[]).length\n// const headers = (value as any[]).map(({ name }) => name)\n \n// let data = [ ]\n// for (let i = 0; i < nrows; i++)\n// for (let j = 0; j < ncols; j++) {\n// const col = value[j]\n// const v = col.value[i]\n// let row = data[i] || [ ]\n// row[j] = this.format_scalar(col.type, v)\n// data[i] = row\n// }\n \n// return `table ${ name ? `${name} ` : '' }(${nrows} rows)\\n` +\n// table(\n// [\n// headers,\n// ...data\n// ],\n// DdbJsonObj.table_config,\n// )\n// }\n \n// return this\n// }\n \n \n// format_scalar (type: DdbJsonType, value: any) {\n// // 可以被 js 原生类型表示\n// if (\n// type === 'void' || type === 'bool' ||\n// type === 'int' || type === 'short' || type === 'long' || type === 'float' || type === 'double'\n// )\n// return value\n \n// if (type === 'string')\n// return inspect(value, { colors: false })\n \n// // 可以直接用 <value> 表示\n// if (\n// type === 'code' || type === 'point' || type === 'complex' || \n// type === 'second' || type === 'time' || type === 'nanotime' || type === 'datehour' || type === 'duration'\n// )\n// return value || 'null'\n \n// if (type === 'month') {\n// if (!value)\n// return 'null'\n// return `${value}M`\n// }\n \n// if (type === 'minute') {\n// if (!value)\n// return 'null'\n// return `${value}m`\n// }\n \n// // 用 type('<value>') 表示\n// return `${type}(${(value as string).quote()})`\n// }\n// }\n\n\n// type DdbJsonForm = 'scalar' | 'pair' | 'vector' | 'set' | 'matrix' | 'dictionary' | 'table'\n\n// type DdbJsonType = \n// 'void' | 'bool' | 'char' | \n// 'short' | 'int' | 'long' | \n// 'date' | 'month' | 'time' | 'minute' | 'second' | 'datetime' | 'timestamp' | 'nanotime' | 'nanotimestamp' | \n// 'float' | 'double' | 'symbol' | 'string' | 'uuid' | 'functiondef' | 'handle' | 'code' | \n// 'datasource' | 'resource' | 'any' | 'compress' | 'datehour' | 'ipaddr' | 'int128' | 'blob' | 'complex' | 'point' | 'duration'\n\n\n// type DdbJsonScalar = number | string | any\n\n\n// const ddb_gateway = {\n// server: null as SocketServer,\n \n// clients: new Set<Socket>(),\n \n// port: 8849,\n \n// controllers: {\n// /** alias */\n// c0: {\n// hostname: '127.0.0.1',\n// port: 8850,\n// },\n \n// c1: {\n// hostname: '127.0.0.1',\n// port: 8851,\n// },\n \n// c2: {\n// hostname: '127.0.0.1',\n// port: 8852,\n// }\n// },\n \n// master: '',\n \n// sids: new Map<string, string>(),\n \n// state: 'init',\n \n \n// async start () {\n// for (const alias in this.controllers) {\n// this.master = alias\n// break\n// }\n \n// this.server = create_socket_server(\n// {\n// allowHalfOpen: false,\n// pauseOnConnect: false,\n// },\n// this.accept.bind(this)\n// )\n \n// this.server.on('error', error => {\n// console.log(new Date(), 'gateway 出错:', error)\n// })\n \n// await new Promise<void>(resolve => {\n// this.server.listen(this.port, resolve)\n// })\n \n// this.auto_switch_master()\n \n// console.log(new Date(), 'gateway 成功启动')\n// },\n \n \n// async stop () {\n// this.state = 'stopping'\n// console.log(new Date(), '正在停止 auto_switch_master')\n \n// for (const client of this.clients)\n// client.end()\n \n// await new Promise<void>((resolve, reject) => {\n// this.server.close(error => {\n// if (error) {\n// reject(error)\n// return\n// }\n// resolve()\n// })\n// })\n// },\n \n \n// /** 接收到 client tcp 连接 */\n// async accept (client: Socket) {\n// this.clients.add(client)\n \n// const port = client.remotePort\n \n// // --- \n// console.log(port, new Date(), 'gateway accept client 连接,开始建立管道')\n \n// let controller = new Socket({\n// allowHalfOpen: false,\n// readable: true,\n// writable: true,\n// })\n \n// controller.on('lookup', (error, address, family, host) => {\n// console.log(port, new Date(), 'controller 域名解析 (lookup) 完成', error, address, family, host)\n// })\n \n// controller.on('close', has_error => {\n// console.log(port, new Date(), 'controller 关闭连接,是否出错:', has_error)\n// })\n \n// controller.on('timeout', () => {\n// console.log(port, new Date(), 'controller 超时')\n// })\n \n// controller.on('error', error => {\n// console.log(port, new Date(), 'controller 出错了:', error)\n// client.end()\n// })\n \n \n// // --- client 错误处理\n// client.on('error', error => {\n// console.log(port, new Date(), 'client 出错,关闭与 controller 的连接', error)\n// controller.end()\n// })\n \n// client.on('close', has_error => {\n// this.clients.delete(client)\n// console.log(port, new Date(), 'client 关闭连接,是否出错:', has_error)\n// })\n \n \n// // --- \n// console.log(port, new Date(), 'gateway 开始连接到 controller')\n// const { hostname, port: master_port } = this.controllers[this.master]\n// await new Promise<void>(resolve => {\n// // callback 会被 socket.once('connect', callback)\n// controller.connect({\n// port: master_port,\n \n// host: hostname,\n// // host: '127.0.0.1',\n \n// family: 0,\n// }, resolve)\n// })\n// console.log(port, new Date(), 'gateway 已连接到 controller')\n \n// // --- \n// console.log(port, new Date(), 'gateway 建立 client <-> controller')\n// client.pipe(controller)\n// controller.pipe(client)\n// },\n \n \n// /** https://www.dolphindb.cn/cn/help/FunctionsandCommands/FunctionReferences/g/getActiveMaster.html?highlight=getactivemaster */\n// async get_active_master () {\n// for (const alias in this.controllers) {\n// const { hostname, port } = this.controllers[alias] as { hostname: string, port: number }\n// const sid = this.sids.get(alias)\n// try {\n// const master = (\n// await ddb.rpc_json('getActiveMaster()', { hostname, port, sid })\n// ).value as string\n// console.log(new Date(), `${alias}.getActiveMaster() -> ${this.master}`)\n// this.sids.set(alias, sid)\n// if (!master)\n// throw new Error(`${new Date().toString()} getActiveMaster 得到的 master 为空`)\n// return master\n// } catch (error) {\n// console.log(new Date(), error)\n// }\n// }\n \n// return this.master\n// },\n \n \n// async auto_switch_master () {\n// if (this.state === 'stopping') {\n// this.state = 'running'\n// console.log('gateway 恢复 auto_switch_master')\n// return\n// }\n \n// this.state = 'running'\n \n// for (; this.state === 'running'; ) {\n// const master = this.master\n// const master_ = await this.get_active_master()\n// if (master === master_) {\n// await delay(10 * 1000)\n// continue\n// }\n \n// this.master = master_\n// console.log(new Date(), `master 从 ${master} 切换为 ${master_}, 断开所有 clients`)\n// for (const client of this.clients)\n// client.end()\n// await delay(3 * 1000)\n// }\n \n// console.log(new Date(), `gateway.state === ${this.state}, 停止 auto_switch_master`)\n// this.state = 'stopped'\n// }\n// }\n"]}
|
|
1
|
+
{"version":3,"file":"unused.js","sourceRoot":"","sources":["unused.ts"],"names":[],"mappings":"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","sourcesContent":["// import { Socket, createServer as create_socket_server, Server as SocketServer } from 'net'\n// import { TLSSocket, connect as tls_connect } from 'tls'\n// import type { Duplex } from 'stream'\n\n// import { table, getBorderCharacters, type TableUserConfig } from 'table'\n\n// class DdbObj {\n// port = 8848\n \n// /** ddb 连接状态 */\n// state = '未连接'\n \n// socket = null as Socket\n \n// clients = new Set<Duplex>()\n \n \n// /** dolphindb http rpc \n// - code\n// - options\n// - session_id: 20 分钟内无操作服务端会清空 session,删除所有变量\n// */\n// async rpc_json (\n// code: string,\n// {\n// hostname = '127.0.0.1',\n// // hostname = 'localhost',\n \n// port = this.port,\n// tls = false,\n// sid = this.sid,\n \n// // TEST\n// proxy = MyProxy.whistle\n// }: {\n// hostname?: string\n// port?: number\n// tls?: boolean\n// sid?: string\n// proxy?: MyProxy | false\n// } = { }\n// ): Promise<DdbJsonObj> {\n// let result = await request_json(`${tls ? 'https' : 'http'}://${hostname}:${port}/${sid}`, {\n// body: {\n// sessionID: sid,\n// functionName: 'executeCode',\n// params: [{\n// name: 'script',\n// form: 'scalar',\n// type: 'string',\n// value: encodeURIComponent(code)\n// }]\n// },\n// proxy\n// })\n \n// this.sid = result.sessionID\n \n// result.resultCode = Number(result.resultCode)\n \n// // result.userId: 未登录时为 `''`\n \n// if (result.resultCode)\n// throw Object.assign(\n// // result.msg: 成功时为 `''`; 失败时为错误信息\n// new Error((result.msg as string).red),\n// result\n// )\n \n \n// return new DdbJsonObj(result.object[0])\n// }\n \n \n// /** 创建 tcp 连接到 ddb,并完成 connect 请求,读到 chunk 后执行 on_chunk 回调\n// 成功完成后 this.socket, this.sid 会被初始化\n// */\n// async connect_socket () {\n// // --- 创建 socket, attach 状态、异常事件处理\n// this.socket = new Socket({\n// allowHalfOpen: false,\n// readable: true,\n// writable: true\n// })\n \n// this.socket.on('lookup', (error, address, family, host) => {\n// console.log('socket 域名解析 (lookup) 完成', error, address, family, host)\n// })\n \n// this.socket.on('ready', () => {\n// console.log('socket 准备就绪')\n// })\n \n// this.socket.on('close', has_error => {\n// console.log('socket 成功关闭,是否出错?', has_error)\n// })\n \n// this.socket.on('timeout', () => {\n// console.log('socket 超时')\n// })\n \n// this.socket.on('error', error => {\n// console.log('socket 出错了', error)\n// })\n \n \n// // ---\n// console.log('将 socket 连接到 server')\n// await new Promise<void>(resolve => {\n// // callback 会被 socket.once('connect', callback)\n// this.socket.connect({\n// port: this.port,\n \n// // host: 'localhost',\n// host: '127.0.0.1',\n \n// family: 0,\n// }, resolve)\n// })\n \n// console.log(this.state = 'socket 已连接')\n \n \n// // ---\n// console.log('发送 connect 请求到 ddb')\n \n// this.socket.write(\n// `API ${this.sid || '0'} 8\\n` +\n// 'connect\\n'\n// )\n \n// console.log(this.state = '已发送 connect 请求')\n \n \n// // --- 读取流数据,只等到 connect 完成,后续 chunk 交给 callback\n// await new Promise<void>(async (resolve, reject) => {\n// let last_chunk: Buffer\n \n// try {\n// for await (const chunk of this.socket) {\n// last_chunk = chunk\n// console.log('ddb.socket 读取到 chunk, 转发给所有 websocket clients')\n \n// const ck = chunk as Uint8Array\n \n// if (this.state === '已发送 connect 请求') {\n// // --- 读取 sid\n// const i_sid_end = ck.indexOf(0x20)\n \n// this.sid = this.dec.decode(\n// ck.subarray(\n// 0,\n// i_sid_end\n// )\n// )\n// console.log('sid = ', this.sid)\n \n// console.log(this.state = 'connect 完成')\n \n// resolve()\n \n// continue\n// }\n \n// this.on_chunk(ck)\n// }\n \n// console.log('ddb.socket 完美结束 (no more data to read)')\n// } catch (error) {\n// console.log('捕获到 socket 错误', error)\n// console.log('最后一个 chunk', last_chunk)\n// reject(error)\n// }\n// })\n// }\n \n \n// on_chunk (chunk: Uint8Array) {\n// for (let client of this.clients)\n// client.write(chunk)\n// }\n// }\n\n\n// class DdbJsonObj {\n// static ddb_null = { name: '', form: 'scalar', type: 'void', value: null } as const\n \n// static table_config: TableUserConfig = {\n// border: getBorderCharacters('void'),\n// singleLine: true,\n// columnDefault: {\n// paddingLeft: 0,\n// paddingRight: 1,\n// alignment: 'right'\n// },\n// }\n \n \n// name: string\n \n// form: DdbJsonForm\n \n// type?: DdbJsonType\n \n// /** 向量有这个属性 */\n// size?: number\n \n// value: null | boolean | number | string | DdbJsonObj | DdbJsonObj[]\n \n// constructor (data?: {\n// name: string\n// form: DdbJsonForm\n// type?: DdbJsonType\n// size?: string | number\n// value: any\n// }) {\n// const { name, form, type, size, value } = data || DdbJsonObj.ddb_null as DdbJsonObj\n \n// this.name = name\n// this.form = form\n// this.type = type\n \n// if ((typeof size === 'string' && size) || typeof size === 'number')\n// this.size = Number(size)\n \n// this.value = (() => {\n// if (form === 'scalar') {\n// if (type === 'void')\n// return null\n \n// if (type === 'int' || type === 'short' || type === 'float' || type === 'double') {\n// if (value === 'pi' || value === 'e')\n// return value\n \n// return Number(value)\n// }\n \n// if (type === 'long')\n// return BigInt(value)\n \n// if (type === 'bool')\n// return Boolean(value)\n \n// // integral: int128\n// // literal: char | string | uuid\n// // temporal: date | month | time | second | datetime | timestamp | nanotime | nanotimestamp | datehour\n// // system: code | ipaddr | duration\n// // complex | point\n// return value\n// }\n \n// if (form === 'pair')\n// return value\n \n// if (form === 'vector')\n// return value\n \n// if (form === 'set')\n// return value\n \n// if (form === 'matrix')\n// return value\n \n// if (form === 'dictionary')\n// return value\n \n// if (form === 'table')\n// return value\n// })()\n// }\n \n \n// [inspect.custom] () {\n// const { form, type, value, name, size } = this\n \n// if (form === 'scalar')\n// return this.format_scalar(type, value)\n \n// if (form === 'pair') {\n// const [l, r] = value as [any, any]\n// return `${ l === null ? '' : this.format_scalar(type, l) }:${ r === null ? '' : this.format_scalar(type, r) }`\n// }\n \n// if (form === 'vector' || form === 'set') {\n// return (name ? `${name} ` : '') +\n// (\n// (value as any[]).map(x => \n// x && typeof x === 'object' ?\n// inspect(\n// new DdbJsonObj(x), \n// { colors: false }\n// )\n// :\n// this.format_scalar(type, x)\n// ).join(', ') || ' '\n// ).surround(\n// form === 'vector' ? '[' : '{',\n// form === 'vector' ? ']' : '}',\n// )\n// }\n \n// if (form === 'dictionary') {\n// const [keys, values] = value as [any, any]\n// let obj = { } as Record<string, DdbJsonObj | string>\n// const size = Number(keys.size)\n// if (!size) return `dict(${keys.type}, ${values.type})`\n \n// for (let i = 0; i < size; i++) {\n// const key = keys.type === 'string' ? \n// keys.value[i]\n// :\n// this.format_scalar(keys.type, keys.value[i])\n \n// const v = values.value[i]\n// const value = typeof v === 'string' ? \n// v\n// :\n// new DdbJsonObj(v)\n// obj[key] = value\n// }\n \n// return obj\n// }\n \n// if (form === 'matrix') {\n// const nrows = Number(value[1].value)\n// const ncols = Number(value[2].value)\n// const values = value[0].value\n \n// let data = [ ]\n// for (let i = 0; i < nrows; i++)\n// for (let j = 0; j < ncols; j++) {\n// const value = values[nrows * j + i]\n// let row = data[i] || [ ]\n// row[j] = this.format_scalar(type, value)\n// data[i] = row\n// }\n \n// return `matrix <${type}[${ncols}][${nrows}]>\\n` +\n// table(data, DdbJsonObj.table_config)\n// }\n \n// if (form === 'table') {\n// const nrows = Number(size)\n// const ncols = (value as any[]).length\n// const headers = (value as any[]).map(({ name }) => name)\n \n// let data = [ ]\n// for (let i = 0; i < nrows; i++)\n// for (let j = 0; j < ncols; j++) {\n// const col = value[j]\n// const v = col.value[i]\n// let row = data[i] || [ ]\n// row[j] = this.format_scalar(col.type, v)\n// data[i] = row\n// }\n \n// return `table ${ name ? `${name} ` : '' }(${nrows} rows)\\n` +\n// table(\n// [\n// headers,\n// ...data\n// ],\n// DdbJsonObj.table_config,\n// )\n// }\n \n// return this\n// }\n \n \n// format_scalar (type: DdbJsonType, value: any) {\n// // 可以被 js 原生类型表示\n// if (\n// type === 'void' || type === 'bool' ||\n// type === 'int' || type === 'short' || type === 'long' || type === 'float' || type === 'double'\n// )\n// return value\n \n// if (type === 'string')\n// return inspect(value, { colors: false })\n \n// // 可以直接用 <value> 表示\n// if (\n// type === 'code' || type === 'point' || type === 'complex' || \n// type === 'second' || type === 'time' || type === 'nanotime' || type === 'datehour' || type === 'duration'\n// )\n// return value || 'null'\n \n// if (type === 'month') {\n// if (!value)\n// return 'null'\n// return `${value}M`\n// }\n \n// if (type === 'minute') {\n// if (!value)\n// return 'null'\n// return `${value}m`\n// }\n \n// // 用 type('<value>') 表示\n// return `${type}(${(value as string).quote()})`\n// }\n// }\n\n\n// type DdbJsonForm = 'scalar' | 'pair' | 'vector' | 'set' | 'matrix' | 'dictionary' | 'table'\n\n// type DdbJsonType = \n// 'void' | 'bool' | 'char' | \n// 'short' | 'int' | 'long' | \n// 'date' | 'month' | 'time' | 'minute' | 'second' | 'datetime' | 'timestamp' | 'nanotime' | 'nanotimestamp' | \n// 'float' | 'double' | 'symbol' | 'string' | 'uuid' | 'functiondef' | 'handle' | 'code' | \n// 'datasource' | 'resource' | 'any' | 'compress' | 'datehour' | 'ipaddr' | 'int128' | 'blob' | 'complex' | 'point' | 'duration'\n\n\n// type DdbJsonScalar = number | string | any\n\n\n// const ddb_gateway = {\n// server: null as SocketServer,\n \n// clients: new Set<Socket>(),\n \n// port: 8849,\n \n// controllers: {\n// /** alias */\n// c0: {\n// hostname: '127.0.0.1',\n// port: 8850,\n// },\n \n// c1: {\n// hostname: '127.0.0.1',\n// port: 8851,\n// },\n \n// c2: {\n// hostname: '127.0.0.1',\n// port: 8852,\n// }\n// },\n \n// master: '',\n \n// sids: new Map<string, string>(),\n \n// state: 'init',\n \n \n// async start () {\n// for (const alias in this.controllers) {\n// this.master = alias\n// break\n// }\n \n// this.server = create_socket_server(\n// {\n// allowHalfOpen: false,\n// pauseOnConnect: false,\n// },\n// this.accept.bind(this)\n// )\n \n// this.server.on('error', error => {\n// console.log(new Date(), 'gateway 出错:', error)\n// })\n \n// await new Promise<void>(resolve => {\n// this.server.listen(this.port, resolve)\n// })\n \n// this.auto_switch_master()\n \n// console.log(new Date(), 'gateway 成功启动')\n// },\n \n \n// async stop () {\n// this.state = 'stopping'\n// console.log(new Date(), '正在停止 auto_switch_master')\n \n// for (const client of this.clients)\n// client.end()\n \n// await new Promise<void>((resolve, reject) => {\n// this.server.close(error => {\n// if (error) {\n// reject(error)\n// return\n// }\n// resolve()\n// })\n// })\n// },\n \n \n// /** 接收到 client tcp 连接 */\n// async accept (client: Socket) {\n// this.clients.add(client)\n \n// const port = client.remotePort\n \n// // --- \n// console.log(port, new Date(), 'gateway accept client 连接,开始建立管道')\n \n// let controller = new Socket({\n// allowHalfOpen: false,\n// readable: true,\n// writable: true,\n// })\n \n// controller.on('lookup', (error, address, family, host) => {\n// console.log(port, new Date(), 'controller 域名解析 (lookup) 完成', error, address, family, host)\n// })\n \n// controller.on('close', has_error => {\n// console.log(port, new Date(), 'controller 关闭连接,是否出错:', has_error)\n// })\n \n// controller.on('timeout', () => {\n// console.log(port, new Date(), 'controller 超时')\n// })\n \n// controller.on('error', error => {\n// console.log(port, new Date(), 'controller 出错了:', error)\n// client.end()\n// })\n \n \n// // --- client 错误处理\n// client.on('error', error => {\n// console.log(port, new Date(), 'client 出错,关闭与 controller 的连接', error)\n// controller.end()\n// })\n \n// client.on('close', has_error => {\n// this.clients.delete(client)\n// console.log(port, new Date(), 'client 关闭连接,是否出错:', has_error)\n// })\n \n \n// // --- \n// console.log(port, new Date(), 'gateway 开始连接到 controller')\n// const { hostname, port: master_port } = this.controllers[this.master]\n// await new Promise<void>(resolve => {\n// // callback 会被 socket.once('connect', callback)\n// controller.connect({\n// port: master_port,\n \n// host: hostname,\n// // host: '127.0.0.1',\n \n// family: 0,\n// }, resolve)\n// })\n// console.log(port, new Date(), 'gateway 已连接到 controller')\n \n// // --- \n// console.log(port, new Date(), 'gateway 建立 client <-> controller')\n// client.pipe(controller)\n// controller.pipe(client)\n// },\n \n \n// /** https://www.dolphindb.cn/cn/help/FunctionsandCommands/FunctionReferences/g/getActiveMaster.html?highlight=getactivemaster */\n// async get_active_master () {\n// for (const alias in this.controllers) {\n// const { hostname, port } = this.controllers[alias] as { hostname: string, port: number }\n// const sid = this.sids.get(alias)\n// try {\n// const master = (\n// await ddb.rpc_json('getActiveMaster()', { hostname, port, sid })\n// ).value as string\n// console.log(new Date(), `${alias}.getActiveMaster() -> ${this.master}`)\n// this.sids.set(alias, sid)\n// if (!master)\n// throw new Error(`${new Date().toString()} getActiveMaster 得到的 master 为空`)\n// return master\n// } catch (error) {\n// console.log(new Date(), error)\n// }\n// }\n \n// return this.master\n// },\n \n \n// async auto_switch_master () {\n// if (this.state === 'stopping') {\n// this.state = 'running'\n// console.log('gateway 恢复 auto_switch_master')\n// return\n// }\n \n// this.state = 'running'\n \n// for (; this.state === 'running'; ) {\n// const master = this.master\n// const master_ = await this.get_active_master()\n// if (master === master_) {\n// await delay(10 * 1000)\n// continue\n// }\n \n// this.master = master_\n// console.log(new Date(), `master 从 ${master} 切换为 ${master_}, 断开所有 clients`)\n// for (const client of this.clients)\n// client.end()\n// await delay(3 * 1000)\n// }\n \n// console.log(new Date(), `gateway.state === ${this.state}, 停止 auto_switch_master`)\n// this.state = 'stopped'\n// }\n// }\n"]}
|