dolphindb 3.0.2 → 3.0.20

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dolphindb",
3
3
  "description": "DolphinDB JavaScript API",
4
- "version": "3.0.2",
4
+ "version": "3.0.20",
5
5
  "type": "module",
6
6
  "main": "./index.js",
7
7
  "browser": "./browser.js",
@@ -13,7 +13,7 @@
13
13
  "scan": "i18n-scan --input \"**/*.{ts,tsx}\""
14
14
  },
15
15
  "engines": {
16
- "node": ">=20.7.3"
16
+ "node": ">=22.1.0"
17
17
  },
18
18
  "author": "Hongfei Shen <hongfei.shen@dolphindb.com> (https://dolphindb.net/hongfeishen)",
19
19
  "publisher": "Hongfei Shen",
@@ -32,14 +32,14 @@
32
32
  "JavaScript"
33
33
  ],
34
34
  "devDependencies": {
35
- "@types/node": "^20.12.7",
36
- "eslint": "^9.1.1",
35
+ "@types/node": "^20.12.11",
36
+ "eslint": "^9.2.0",
37
37
  "typescript": "^5.4.5"
38
38
  },
39
39
  "dependencies": {
40
- "dayjs": "^1.11.10",
40
+ "dayjs": "^1.11.11",
41
41
  "ipaddr.js": "^2.2.0",
42
42
  "tslib": "^2.6.2",
43
- "xshell": "^1.0.91"
43
+ "xshell": "^1.0.97"
44
44
  }
45
45
  }
package/test.d.ts CHANGED
@@ -1,2 +1 @@
1
- import { DDB } from './index.js';
2
- export declare function test_types(ddb: DDB): Promise<void>;
1
+ export {};
package/test.js CHANGED
@@ -17,14 +17,15 @@ const ddb_options = fexists('T:/TEMP/', { print: false }) ? { proxy: MyProxy.wor
17
17
  let ddb = new DDB(url, ddb_options);
18
18
  const tests = [
19
19
  test_repl,
20
- // test_keywords,
21
- // test_types,
22
- // test_reconnection,
23
- // test_connection_error,
24
- // test_print,
25
- // test_time,
26
- // test_streaming,
27
- // test_error,
20
+ test_keywords,
21
+ test_types,
22
+ test_reconnection,
23
+ test_connection_error,
24
+ test_print,
25
+ test_time,
26
+ test_streaming,
27
+ test_error,
28
+ test_invoke
28
29
  ];
29
30
  for (const fn_test of tests)
30
31
  await fn_test(ddb);
@@ -217,7 +218,7 @@ async function time2str_equal(ddb, timestr) {
217
218
  assert(inspect(await ddb.eval(code), { colors: false }).slice('timestamp('.length, -1) ===
218
219
  (await get_printed(ddb, code)).replace('T', ' '));
219
220
  }
220
- export async function test_types(ddb) {
221
+ async function test_types(ddb) {
221
222
  console.log('测试通过 ddb.call 调用 getNodeAlias 函数');
222
223
  console.log(await ddb.call('getNodeAlias'));
223
224
  console.log('测试 ddb.call 上传不同类型的变量');
@@ -311,4 +312,68 @@ export async function test_types(ddb) {
311
312
  await ddb.eval('dict(["a", "b", "c"], [compress([1, 2, 3]), 123, "bbb"])')
312
313
  ]);
313
314
  }
315
+ async function test_from_stdjson(ddb) {
316
+ console.log('测试 fromStdJson');
317
+ console.log(await ddb.call('fromStdJson', [JSON.stringify({
318
+ a: 1234,
319
+ b: 'aaa',
320
+ c: {
321
+ e: 1234,
322
+ f: 4321
323
+ },
324
+ f: 'blabla\n中文\u4e2d\u6587'
325
+ })]));
326
+ console.log(await ddb.call('fromStdJson', [JSON.stringify(1234)]));
327
+ console.log(await ddb.call('fromStdJson', [
328
+ JSON.stringify({
329
+ data: {
330
+ code: 'select * from kline where secid == "230012"'
331
+ }
332
+ })
333
+ ]));
334
+ }
335
+ async function test_invoke(ddb) {
336
+ console.log('测试 invoke');
337
+ await ddb.eval('def echo (data) {\n' +
338
+ // ' print(data)\n' +
339
+ ' return data\n' +
340
+ '}\n');
341
+ const str = 'blabla\n中文"\u4e2d\u6587"\\\"\"';
342
+ assert((await ddb.invoke('echo', [{
343
+ a: 1234,
344
+ b: 'aaa',
345
+ c: {
346
+ e: 1234,
347
+ f: 4321
348
+ },
349
+ f: str
350
+ }]))
351
+ .f === str);
352
+ await ddb.execute('cbool = true false false;\n' +
353
+ "cchar = 'a' 'b' 'c';\n" +
354
+ 'cshort = 122h 32h 45h;\n' +
355
+ 'cint = 1 4 9;\n' +
356
+ 'clong = 17l 39l 72l;\n' +
357
+ 'cdate = 2013.06.13 2015.07.12 2019.08.15;\n' +
358
+ 'cmonth = 2011.08M 2014.02M 2019.07M;\n' +
359
+ 'ctime = 04:15:51.921 09:27:16.095 11:32:28.387;\n' +
360
+ 'cminute = 03:25m 08:12m 10:15m;\n' +
361
+ 'csecond = 01:15:20 04:26:45 09:22:59;\n' +
362
+ 'cdatetime = 1976.09.10 02:31:42 1987.12.13 11:58:31 1999.12.10 20:49:23;\n' +
363
+ 'ctimestamp = 1997.07.20 21:45:16.339 2002.11.26 12:40:31.783 2008.08.10 23:54:27.629;\n' +
364
+ 'cnanotime = 01:25:33.365869429 03:47:25.364828475 08:16:22.748395721;\n' +
365
+ 'cnanotimestamp = 2005.09.23 13:30:35.468385940 2007.12.11 14:54:38.949792731 2009.09.30 16:39:51.973463623;\n' +
366
+ 'cfloat = 7.5f 0.79f 8.27f;\n' +
367
+ 'cdouble = 5.7 7.2 3.9;\n' +
368
+ 'cstring = "hello" "hi" "here";\n' +
369
+ 'cdatehour = datehour(2012.06.15 15:32:10.158 2012.06.15 17:30:10.008 2014.09.29 23:55:42.693);\n' +
370
+ 'cblob = blob("dolphindb" "gaussdb" "goldendb")\n' +
371
+ 'cdecimal32 = decimal32(12 17 135.2,2)\n' +
372
+ 'cdecimal64 = decimal64(18 24 33.878,4)\n' +
373
+ 'cdecimal128 = decimal128(18 24 33.878,18)\n');
374
+ assert(
375
+ // await ddb.invoke<DdbTableData>('defs')
376
+ (await ddb.invoke('objs', [true]))
377
+ .columns.includes('shared'));
378
+ }
314
379
  //# sourceMappingURL=test.js.map
package/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepEqual } from 'assert/strict'\n\nimport { assert, defer, fexists, inspect, MyProxy, set_inspect_options, WebSocketConnectionError } from 'xshell'\n\nimport { keywords } from './language.js'\nimport {\n DDB, DdbConnectionError, DdbDatabaseError, DdbForm, DdbInt, DdbLong, DdbObj, DdbType, \n DdbVectorAny, DdbVectorDouble, DdbVectorSymbol, month2ms, DdbDurationUnit,\n type DdbStringObj, type DdbVectorAnyObj, type DdbDurationVectorValue, type DdbVectorObj, type DdbTableObj, DdbTimeStamp,\n type DdbDictObj\n} from './index.js'\n\n\nset_inspect_options()\n\n\n// linux\n// export const url = 'ws://115.239.209.123:8892' as const\nconst url = 'ws://192.168.0.200:20023' as const\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// windows\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// local 8848\n// export const url = 'ws://127.0.0.1:8848' as const\n\nconst ddb_options = fexists('T:/TEMP/', { print: false }) ? { proxy: MyProxy.work } : { }\n\n\n;(async function test () {\n console.log('--- 测试开始 ---'.green)\n \n let ddb = new DDB(url, ddb_options)\n \n const tests = [\n test_repl,\n \n // test_keywords,\n // test_types,\n // test_reconnection,\n // test_connection_error,\n // test_print,\n // test_time,\n // test_streaming,\n // test_error,\n ]\n \n for (const fn_test of tests)\n await fn_test(ddb)\n \n ddb.disconnect()\n \n console.log('--- 测试通过 ---'.green)\n})()\n\n\n\nfunction test_keywords () {\n assert(new Set(keywords).size === keywords.length, 'keywords 中不能有重复的项')\n}\n\n\nasync function get_printed (ddb: DDB, code: string) {\n return new Promise<string>(async (resolve, reject) => {\n try {\n let resolved = false\n await ddb.eval(\n `print(${code})`,\n {\n listener ({ type, data }) {\n if (type === 'print' && !resolved) {\n resolved = true\n resolve(data)\n }\n }\n }\n )\n if (!resolved)\n reject(new Error('未输出 print 消息'))\n } catch (error) {\n reject(error)\n }\n })\n}\n\n\nasync function test_repl (ddb: DDB) {\n \n}\n\n\nasync function test_reconnection (ddb: DDB) {\n let _ddb = new DDB(url, ddb_options)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.connect()\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_connection_error (ddb: DDB) {\n let _ddb = new DDB(url, ddb_options)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.eval('1 + 1')\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_error (ddb: DDB) {\n console.log('测试 DdbDatabaseError 和 DdbConnectionError')\n \n const error_message = '错误消息'\n const error_script = `throw ${error_message.quote()}`\n \n let database_error: DdbDatabaseError\n \n try {\n await ddb.eval(error_script)\n } catch (error) {\n database_error = error\n }\n \n assert(database_error)\n assert(database_error instanceof DdbDatabaseError)\n assert(database_error.message === `throw ${error_message.quote('double')} => ${error_message}`)\n assert(database_error.name === 'DdbDatabaseError')\n assert(database_error.url === ddb.url)\n assert(database_error.type === 'script')\n assert(database_error.options.script === error_script)\n assert(database_error.stack.includes('test_error'))\n \n \n let ddbtest = new DDB(url, ddb_options)\n let connection_error: DdbConnectionError\n try {\n await ddbtest.connect()\n ddbtest.disconnect()\n await ddbtest.eval('1')\n } catch (error) {\n connection_error = error\n }\n \n assert(connection_error)\n assert(connection_error instanceof DdbConnectionError)\n assert(connection_error.url === ddbtest.url)\n \n \n // --- 首次连接失败也会抛出 DdbConnectionError\n let ddbtest2 = new DDB('ws://dolphindb.com/')\n let connection_error2: DdbConnectionError\n try {\n await ddbtest2.connect()\n } catch (error) {\n connection_error2 = error\n }\n \n assert(connection_error2)\n assert(connection_error2 instanceof DdbConnectionError)\n assert(connection_error2.cause && connection_error2.cause instanceof WebSocketConnectionError)\n}\n\n\nasync function test_print (ddb: DDB) {\n console.log('测试 print message')\n \n const str = 'test print message\\n中文'\n \n assert(await get_printed(ddb, str.quote()) === str)\n \n console.log('测试 verbose 输出')\n \n let vddb = new DDB(url, { ...ddb_options, verbose: true })\n \n await vddb.call('typestr', [\n new DdbVectorAny([\n new DdbVectorSymbol(['a', 'b', 'a', 'b', 'a', 'b']),\n new DdbLong(3n)\n ])\n ])\n \n vddb.disconnect()\n}\n\n\nasync function test_streaming (ddb: DDB) {\n console.log('测试流数据')\n \n await ddb.eval(\n 'try {\\n' +\n \" if (!defined('prices', SHARED)) {\\n\" +\n ' share(\\n' +\n ' streamTable(\\n' +\n ' 10000:0,\\n' +\n \" ['time', 'stock', 'price'],\\n\" +\n ' [TIMESTAMP, SYMBOL, DOUBLE]\\n' +\n ' ),\\n' +\n \" 'prices'\\n\" +\n ' )\\n' +\n \" print('prices 流表创建成功')\\n\" +\n ' } else\\n' +\n \" print('prices 流表已存在')\\n\" +\n '} catch (error) {\\n' +\n \" print('prices 流表创建失败')\\n\" +\n ' print(error)\\n' +\n '}\\n'\n )\n \n let total_rows = 0\n \n let promise = defer<void>()\n \n let sddb = new DDB(url, {\n ...ddb_options,\n streaming: {\n table: 'prices',\n handler ({ rows, error, colnames, data, time, id, window, schema }) {\n if (error)\n throw error\n \n if (total_rows === 0 && schema) {\n console.log('流订阅返回了 table schema')\n console.log(schema)\n }\n \n // console.log(data)\n \n deepEqual(colnames, ['time', 'stock', 'price'])\n \n assert(data.form === DdbForm.vector)\n assert(data.rows === 3)\n assert(id)\n assert(time)\n assert(window.rows)\n \n total_rows += rows\n \n if (total_rows === 50)\n promise.resolve()\n },\n }\n })\n \n await sddb.connect()\n \n await ddb.eval(\n 'n = 5\\n' +\n '\\n' +\n 'for (i in 0..9)\\n' +\n ' append!(\\n' +\n ' prices,\\n' +\n ' table([\\n' +\n ' (now() + 0..(n-1)) as time,\\n' +\n \" take(['MSFT', 'FUTU'], n) as stock,\\n\" +\n ' (0..(n-1) \\\\ 10) as price\\n' +\n ' ])\\n' +\n ' )\\n'\n )\n \n await promise\n console.log('流数据已全部收齐')\n \n sddb.disconnect()\n}\n\n\nasync function test_time (ddb: DDB) {\n console.log('测试时间显示')\n \n await time2str_equal(ddb, '2022-09-01T14:30:01.095')\n await time2str_equal(ddb, '2022-07-01T00:00:00.000')\n await time2str_equal(ddb, '2022-07-02T00:00:00.000')\n await time2str_equal(ddb, '2022-06-30T00:00:00.000')\n await time2str_equal(ddb, '2022-12-22T16:57:30.248')\n \n \n console.log('测试 month2ms')\n assert(\n month2ms(\n (\n await ddb.eval<DdbObj<number>>('2022.12M')\n ).value\n ) === new Date('2022.12.01').valueOf()\n )\n}\n\n\nasync function time2str_equal (ddb: DDB, timestr: string) {\n const code = `temporalParse('${timestr}', 'yyyy-MM-ddTHH:mm:sss.SSS')`\n \n assert(\n inspect(\n await ddb.eval(code),\n { colors: false }\n ).slice('timestamp('.length, -1) === \n (\n await get_printed(ddb, code)\n ).replace('T', ' ')\n )\n}\n\n\nexport async function test_types (ddb: DDB) {\n console.log('测试通过 ddb.call 调用 getNodeAlias 函数')\n console.log(await ddb.call('getNodeAlias'))\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result0 = await ddb.call('typestr', [new DdbInt(1)])\n console.log(result0)\n assert(result0.form === DdbForm.scalar)\n assert(result0.type === DdbType.string)\n assert(result0.value === 'INT')\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result1 = await ddb.call('typestr', [new DdbVectorDouble([0.1, 0.2, 0.3])])\n console.log(result1)\n assert(result1.form === DdbForm.scalar)\n assert(result1.type === DdbType.string)\n assert(result1.value === 'FAST DOUBLE VECTOR')\n \n console.log('测试 array vector')\n const av = await ddb.eval(\n 'av = array(INT[], 0, 3)\\n' +\n 'append!(av, [1..4])\\n' +\n 'append!(av, [1..70000])\\n' +\n 'av\\n'\n )\n \n console.log(av)\n assert(av.form === DdbForm.vector)\n assert(av.type === DdbType.int + 64) // array vector 的 type 比较特殊,需要偏移 64\n assert(av.rows === 2)\n \n // 测试 array vector 格式化\n // console.log(\n // await ddb.eval<DdbVectorObj>(\n // 'av = array(DECIMAL128(2)[], 0, 1)\\n' +\n // 'append!(av, [[92233720368547758.11, NULL, 100000000000000, NULL, -92233720368547758, -100000000000000]])\\n' +\n // 'av\\n'\n // )\n // )\n \n // 测试 Invalid Date\n await ddb.upload(['x'], [new DdbTimeStamp(10000000000000000n)])\n \n assert(\n inspect(\n await ddb.eval('x'), \n { colors: false }\n ) === 'timestamp(Invalid Date)'\n )\n \n console.log('测试大数据')\n let bigarr = new Float64Array(10)\n bigarr.fill(0.5)\n \n await ddb.call<DdbStringObj>('typestr', [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n await ddb.upload(['a'], [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n assert((\n await ddb.eval<DdbVectorDouble>('a')\n ).rows === bigarr.length)\n \n \n console.log('测试 datasource')\n \n const ds = (await ddb.eval<DdbVectorAnyObj>(\n 'db_path = \"dfs://test-datasource\"\\n' + \n 'tb_name = \"db\"\\n' + \n 'if (!existsTable(db_path, tb_name))\\n' + \n ' createTable(\\n' + \n ' database(db_path, VALUE , [1]),\\n' +\n ' table(1:0,`id`name, [INT, STRING]),\\n' +\n ' tb_name\\n' +\n ' ).append!(table(1 2 as id, `str1`str2 as name))\\n' +\n '\\n' +\n 'tb = loadTable(db_path, tb_name)\\n' +\n 'sqlDS(<select * from tb where id = 1>)\\n'\n )).value[0] as DdbStringObj\n \n const { type, form, value } = ds\n \n assert(type === DdbType.datasource && form === DdbForm.scalar, '返回的 DdbObj 具有正确的 type 和 form')\n \n assert(value === 'DataSource< select [7] * from tb where id == 1 >')\n \n // 如果直接构造 DdbObj Datasource,将其送入 ddb.call, ddb将仍然认为送入的是一个 STRING \n assert(\n (await ddb.call<DdbStringObj>('typestr', [ds])).value === 'STRING', \n '从 js 构建的 Datasource DdbObj 会被识别为 STRING'\n )\n \n console.log('测试 pair<duration>')\n const dp = await ddb.eval<DdbVectorObj<DdbDurationVectorValue>>(\n 'pair(duration(\"20d\"), duration(\"2H\"))'\n ) \n \n console.log(dp)\n assert(dp.type === DdbType.duration, 'dp 的返回值应该为 Duration')\n assert(dp.value[0].data === 20 && dp.value[0].unit === DdbDurationUnit.d, 'pair<duration> 的 value 应该已解析')\n \n console.log('测试 void vector')\n const table = await ddb.eval<DdbTableObj>('select *, NULL as val from table(1..100 as id)')\n const { value: [ints, voids] } = table\n \n console.log(voids)\n assert(voids.rows === ints.rows, 'void vector 应该具有正常的 vector length')\n assert(voids.length === 10, 'void vector 应该具有正确的数据长度')\n assert(voids.value === null, 'void vector 的值应该为 null')\n \n await ddb.upload(['voidtable'], [table])\n \n console.log('测试 compress 类型')\n \n await ddb.upload(['c'], [\n await ddb.eval<DdbDictObj>('dict([\"a\", \"b\", \"c\"], [compress([1, 2, 3]), 123, \"bbb\"])')\n ])\n}\n\n"]}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepEqual } from 'assert/strict'\n\nimport { assert, defer, fexists, inspect, MyProxy, set_inspect_options, WebSocketConnectionError } from 'xshell'\n\nimport { keywords } from './language.js'\nimport {\n DDB, DdbConnectionError, DdbDatabaseError, DdbForm, DdbInt, DdbLong, DdbObj, DdbType, \n DdbVectorAny, DdbVectorDouble, DdbVectorSymbol, month2ms, DdbDurationUnit,\n type DdbStringObj, type DdbVectorAnyObj, type DdbDurationVectorValue, type DdbVectorObj, type DdbTableObj, DdbTimeStamp, type DdbDictObj, type DdbTableData\n} from './index.js'\n\n\nset_inspect_options()\n\n\n// linux\n// export const url = 'ws://115.239.209.123:8892' as const\nconst url = 'ws://192.168.0.200:20023' as const\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// windows\n// export const url = 'ws://192.168.0.29:9002' as const\n\n// local 8848\n// export const url = 'ws://127.0.0.1:8848' as const\n\nconst ddb_options = fexists('T:/TEMP/', { print: false }) ? { proxy: MyProxy.work } : { }\n\n\n;(async function test () {\n console.log('--- 测试开始 ---'.green)\n \n let ddb = new DDB(url, ddb_options)\n \n const tests = [\n test_repl,\n \n test_keywords,\n test_types,\n test_reconnection,\n test_connection_error,\n test_print,\n test_time,\n test_streaming,\n test_error,\n test_invoke\n ]\n \n for (const fn_test of tests)\n await fn_test(ddb)\n \n ddb.disconnect()\n \n console.log('--- 测试通过 ---'.green)\n})()\n\n\n\nfunction test_keywords () {\n assert(new Set(keywords).size === keywords.length, 'keywords 中不能有重复的项')\n}\n\n\nasync function get_printed (ddb: DDB, code: string) {\n return new Promise<string>(async (resolve, reject) => {\n try {\n let resolved = false\n await ddb.eval(\n `print(${code})`,\n {\n listener ({ type, data }) {\n if (type === 'print' && !resolved) {\n resolved = true\n resolve(data)\n }\n }\n }\n )\n if (!resolved)\n reject(new Error('未输出 print 消息'))\n } catch (error) {\n reject(error)\n }\n })\n}\n\n\nasync function test_repl (ddb: DDB) {\n \n}\n\n\nasync function test_reconnection (ddb: DDB) {\n let _ddb = new DDB(url, ddb_options)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.connect()\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_connection_error (ddb: DDB) {\n let _ddb = new DDB(url, ddb_options)\n \n await _ddb.connect()\n _ddb.disconnect()\n \n let error: DdbConnectionError\n \n try {\n await _ddb.eval('1 + 1')\n } catch (_error) {\n error = _error\n }\n \n assert(error && error instanceof DdbConnectionError)\n}\n\n\nasync function test_error (ddb: DDB) {\n console.log('测试 DdbDatabaseError 和 DdbConnectionError')\n \n const error_message = '错误消息'\n const error_script = `throw ${error_message.quote()}`\n \n let database_error: DdbDatabaseError\n \n try {\n await ddb.eval(error_script)\n } catch (error) {\n database_error = error\n }\n \n assert(database_error)\n assert(database_error instanceof DdbDatabaseError)\n assert(database_error.message === `throw ${error_message.quote('double')} => ${error_message}`)\n assert(database_error.name === 'DdbDatabaseError')\n assert(database_error.url === ddb.url)\n assert(database_error.type === 'script')\n assert(database_error.options.script === error_script)\n assert(database_error.stack.includes('test_error'))\n \n \n let ddbtest = new DDB(url, ddb_options)\n let connection_error: DdbConnectionError\n try {\n await ddbtest.connect()\n ddbtest.disconnect()\n await ddbtest.eval('1')\n } catch (error) {\n connection_error = error\n }\n \n assert(connection_error)\n assert(connection_error instanceof DdbConnectionError)\n assert(connection_error.url === ddbtest.url)\n \n \n // --- 首次连接失败也会抛出 DdbConnectionError\n let ddbtest2 = new DDB('ws://dolphindb.com/')\n let connection_error2: DdbConnectionError\n try {\n await ddbtest2.connect()\n } catch (error) {\n connection_error2 = error\n }\n \n assert(connection_error2)\n assert(connection_error2 instanceof DdbConnectionError)\n assert(connection_error2.cause && connection_error2.cause instanceof WebSocketConnectionError)\n}\n\n\nasync function test_print (ddb: DDB) {\n console.log('测试 print message')\n \n const str = 'test print message\\n中文'\n \n assert(await get_printed(ddb, str.quote()) === str)\n \n console.log('测试 verbose 输出')\n \n let vddb = new DDB(url, { ...ddb_options, verbose: true })\n \n await vddb.call('typestr', [\n new DdbVectorAny([\n new DdbVectorSymbol(['a', 'b', 'a', 'b', 'a', 'b']),\n new DdbLong(3n)\n ])\n ])\n \n vddb.disconnect()\n}\n\n\nasync function test_streaming (ddb: DDB) {\n console.log('测试流数据')\n \n await ddb.eval(\n 'try {\\n' +\n \" if (!defined('prices', SHARED)) {\\n\" +\n ' share(\\n' +\n ' streamTable(\\n' +\n ' 10000:0,\\n' +\n \" ['time', 'stock', 'price'],\\n\" +\n ' [TIMESTAMP, SYMBOL, DOUBLE]\\n' +\n ' ),\\n' +\n \" 'prices'\\n\" +\n ' )\\n' +\n \" print('prices 流表创建成功')\\n\" +\n ' } else\\n' +\n \" print('prices 流表已存在')\\n\" +\n '} catch (error) {\\n' +\n \" print('prices 流表创建失败')\\n\" +\n ' print(error)\\n' +\n '}\\n'\n )\n \n let total_rows = 0\n \n let promise = defer<void>()\n \n let sddb = new DDB(url, {\n ...ddb_options,\n streaming: {\n table: 'prices',\n handler ({ rows, error, colnames, data, time, id, window, schema }) {\n if (error)\n throw error\n \n if (total_rows === 0 && schema) {\n console.log('流订阅返回了 table schema')\n console.log(schema)\n }\n \n // console.log(data)\n \n deepEqual(colnames, ['time', 'stock', 'price'])\n \n assert(data.form === DdbForm.vector)\n assert(data.rows === 3)\n assert(id)\n assert(time)\n assert(window.rows)\n \n total_rows += rows\n \n if (total_rows === 50)\n promise.resolve()\n },\n }\n })\n \n await sddb.connect()\n \n await ddb.eval(\n 'n = 5\\n' +\n '\\n' +\n 'for (i in 0..9)\\n' +\n ' append!(\\n' +\n ' prices,\\n' +\n ' table([\\n' +\n ' (now() + 0..(n-1)) as time,\\n' +\n \" take(['MSFT', 'FUTU'], n) as stock,\\n\" +\n ' (0..(n-1) \\\\ 10) as price\\n' +\n ' ])\\n' +\n ' )\\n'\n )\n \n await promise\n console.log('流数据已全部收齐')\n \n sddb.disconnect()\n}\n\n\nasync function test_time (ddb: DDB) {\n console.log('测试时间显示')\n \n await time2str_equal(ddb, '2022-09-01T14:30:01.095')\n await time2str_equal(ddb, '2022-07-01T00:00:00.000')\n await time2str_equal(ddb, '2022-07-02T00:00:00.000')\n await time2str_equal(ddb, '2022-06-30T00:00:00.000')\n await time2str_equal(ddb, '2022-12-22T16:57:30.248')\n \n \n console.log('测试 month2ms')\n assert(\n month2ms(\n (\n await ddb.eval<DdbObj<number>>('2022.12M')\n ).value\n ) === new Date('2022.12.01').valueOf()\n )\n}\n\n\nasync function time2str_equal (ddb: DDB, timestr: string) {\n const code = `temporalParse('${timestr}', 'yyyy-MM-ddTHH:mm:sss.SSS')`\n \n assert(\n inspect(\n await ddb.eval(code),\n { colors: false }\n ).slice('timestamp('.length, -1) === \n (\n await get_printed(ddb, code)\n ).replace('T', ' ')\n )\n}\n\n\nasync function test_types (ddb: DDB) {\n console.log('测试通过 ddb.call 调用 getNodeAlias 函数')\n console.log(await ddb.call('getNodeAlias'))\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result0 = await ddb.call('typestr', [new DdbInt(1)])\n console.log(result0)\n assert(result0.form === DdbForm.scalar)\n assert(result0.type === DdbType.string)\n assert(result0.value === 'INT')\n \n console.log('测试 ddb.call 上传不同类型的变量')\n const result1 = await ddb.call('typestr', [new DdbVectorDouble([0.1, 0.2, 0.3])])\n console.log(result1)\n assert(result1.form === DdbForm.scalar)\n assert(result1.type === DdbType.string)\n assert(result1.value === 'FAST DOUBLE VECTOR')\n \n console.log('测试 array vector')\n const av = await ddb.eval(\n 'av = array(INT[], 0, 3)\\n' +\n 'append!(av, [1..4])\\n' +\n 'append!(av, [1..70000])\\n' +\n 'av\\n'\n )\n \n console.log(av)\n assert(av.form === DdbForm.vector)\n assert(av.type === DdbType.int + 64) // array vector 的 type 比较特殊,需要偏移 64\n assert(av.rows === 2)\n \n // 测试 array vector 格式化\n // console.log(\n // await ddb.eval<DdbVectorObj>(\n // 'av = array(DECIMAL128(2)[], 0, 1)\\n' +\n // 'append!(av, [[92233720368547758.11, NULL, 100000000000000, NULL, -92233720368547758, -100000000000000]])\\n' +\n // 'av\\n'\n // )\n // )\n \n // 测试 Invalid Date\n await ddb.upload(['x'], [new DdbTimeStamp(10000000000000000n)])\n \n assert(\n inspect(\n await ddb.eval('x'), \n { colors: false }\n ) === 'timestamp(Invalid Date)'\n )\n \n console.log('测试大数据')\n let bigarr = new Float64Array(10)\n bigarr.fill(0.5)\n \n await ddb.call<DdbStringObj>('typestr', [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n await ddb.upload(['a'], [\n new DdbObj({\n form: DdbForm.vector,\n type: DdbType.double,\n length: 0,\n rows: bigarr.length,\n cols: 1,\n value: bigarr\n })\n ])\n \n assert((\n await ddb.eval<DdbVectorDouble>('a')\n ).rows === bigarr.length)\n \n \n console.log('测试 datasource')\n \n const ds = (await ddb.eval<DdbVectorAnyObj>(\n 'db_path = \"dfs://test-datasource\"\\n' + \n 'tb_name = \"db\"\\n' + \n 'if (!existsTable(db_path, tb_name))\\n' + \n ' createTable(\\n' + \n ' database(db_path, VALUE , [1]),\\n' +\n ' table(1:0,`id`name, [INT, STRING]),\\n' +\n ' tb_name\\n' +\n ' ).append!(table(1 2 as id, `str1`str2 as name))\\n' +\n '\\n' +\n 'tb = loadTable(db_path, tb_name)\\n' +\n 'sqlDS(<select * from tb where id = 1>)\\n'\n )).value[0] as DdbStringObj\n \n const { type, form, value } = ds\n \n assert(type === DdbType.datasource && form === DdbForm.scalar, '返回的 DdbObj 具有正确的 type 和 form')\n \n assert(value === 'DataSource< select [7] * from tb where id == 1 >')\n \n // 如果直接构造 DdbObj Datasource,将其送入 ddb.call, ddb将仍然认为送入的是一个 STRING \n assert(\n (await ddb.call<DdbStringObj>('typestr', [ds])).value === 'STRING', \n '从 js 构建的 Datasource DdbObj 会被识别为 STRING'\n )\n \n console.log('测试 pair<duration>')\n const dp = await ddb.eval<DdbVectorObj<DdbDurationVectorValue>>(\n 'pair(duration(\"20d\"), duration(\"2H\"))'\n ) \n \n console.log(dp)\n assert(dp.type === DdbType.duration, 'dp 的返回值应该为 Duration')\n assert(dp.value[0].data === 20 && dp.value[0].unit === DdbDurationUnit.d, 'pair<duration> 的 value 应该已解析')\n \n console.log('测试 void vector')\n const table = await ddb.eval<DdbTableObj>('select *, NULL as val from table(1..100 as id)')\n const { value: [ints, voids] } = table\n \n console.log(voids)\n assert(voids.rows === ints.rows, 'void vector 应该具有正常的 vector length')\n assert(voids.length === 10, 'void vector 应该具有正确的数据长度')\n assert(voids.value === null, 'void vector 的值应该为 null')\n \n await ddb.upload(['voidtable'], [table])\n \n console.log('测试 compress 类型')\n \n await ddb.upload(['c'], [\n await ddb.eval<DdbDictObj>('dict([\"a\", \"b\", \"c\"], [compress([1, 2, 3]), 123, \"bbb\"])')\n ])\n}\n\n\nasync function test_from_stdjson (ddb: DDB) {\n console.log('测试 fromStdJson')\n \n console.log(\n await ddb.call('fromStdJson', [JSON.stringify({\n a: 1234,\n b: 'aaa',\n c: {\n e: 1234,\n f: 4321\n },\n f: 'blabla\\n中文\\u4e2d\\u6587'\n })])\n )\n \n console.log(\n await ddb.call('fromStdJson', [JSON.stringify(1234)])\n )\n \n console.log(\n await ddb.call('fromStdJson', [\n JSON.stringify({\n data: {\n code: 'select * from kline where secid == \"230012\"'\n }\n })\n ])\n )\n}\n\n\nasync function test_invoke (ddb: DDB) {\n console.log('测试 invoke')\n \n await ddb.eval(\n 'def echo (data) {\\n' +\n // '\tprint(data)\\n' +\n '\treturn data\\n' +\n '}\\n'\n )\n \n const str = 'blabla\\n中文\"\\u4e2d\\u6587\"\\\\\\\"\\\"'\n \n assert(\n (await ddb.invoke('echo', [{\n a: 1234,\n b: 'aaa',\n c: {\n e: 1234,\n f: 4321\n },\n f: str\n }]))\n .f === str\n )\n \n await ddb.execute(\n 'cbool = true false false;\\n' +\n \"cchar = 'a' 'b' 'c';\\n\" +\n 'cshort = 122h 32h 45h;\\n' +\n 'cint = 1 4 9;\\n' +\n 'clong = 17l 39l 72l;\\n' +\n 'cdate = 2013.06.13 2015.07.12 2019.08.15;\\n' +\n 'cmonth = 2011.08M 2014.02M 2019.07M;\\n' +\n 'ctime = 04:15:51.921 09:27:16.095 11:32:28.387;\\n' +\n 'cminute = 03:25m 08:12m 10:15m;\\n' +\n 'csecond = 01:15:20 04:26:45 09:22:59;\\n' +\n 'cdatetime = 1976.09.10 02:31:42 1987.12.13 11:58:31 1999.12.10 20:49:23;\\n' +\n 'ctimestamp = 1997.07.20 21:45:16.339 2002.11.26 12:40:31.783 2008.08.10 23:54:27.629;\\n' +\n 'cnanotime = 01:25:33.365869429 03:47:25.364828475 08:16:22.748395721;\\n' +\n 'cnanotimestamp = 2005.09.23 13:30:35.468385940 2007.12.11 14:54:38.949792731 2009.09.30 16:39:51.973463623;\\n' +\n 'cfloat = 7.5f 0.79f 8.27f;\\n' +\n 'cdouble = 5.7 7.2 3.9;\\n' +\n 'cstring = \"hello\" \"hi\" \"here\";\\n' +\n 'cdatehour = datehour(2012.06.15 15:32:10.158 2012.06.15 17:30:10.008 2014.09.29 23:55:42.693);\\n' +\n 'cblob = blob(\"dolphindb\" \"gaussdb\" \"goldendb\")\\n' +\n 'cdecimal32 = decimal32(12 17 135.2,2)\\n' +\n 'cdecimal64 = decimal64(18 24 33.878,4)\\n' +\n 'cdecimal128 = decimal128(18 24 33.878,18)\\n'\n )\n \n assert(\n // await ddb.invoke<DdbTableData>('defs')\n (await ddb.invoke<DdbTableData>('objs', [true]))\n .columns.includes('shared')\n )\n}\n\n"]}
package/unused.js CHANGED
@@ -1,6 +1,10 @@
1
+ // import { Socket, createServer as create_socket_server, Server as SocketServer } from 'net'
2
+ // import { TLSSocket, connect as tls_connect } from 'tls'
3
+ // import type { Duplex } from 'stream'
4
+ export {};
5
+ // import { table, getBorderCharacters, type TableUserConfig } from 'table'
1
6
  // class DdbObj {
2
7
  // port = 8848
3
- export {};
4
8
  // /** ddb 连接状态 */
5
9
  // state = '未连接'
6
10
  // socket = null as Socket
package/unused.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"unused.js","sourceRoot":"","sources":["unused.ts"],"names":[],"mappings":"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","sourcesContent":["// 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"]}
@@ -1,21 +0,0 @@
1
- import { BigInt128Array } from '../shared/bigint-128-array.js';
2
- export interface DdbDecimal128Value {
3
- /** int32, data 需要除以 10^scale 得到原值 data needs to be divided by 10^scale to get the original value */
4
- scale: number;
5
- /** int128, 空值为 null empty value is null */
6
- data: bigint | null;
7
- }
8
- export interface DdbDecimal128VectorValue {
9
- scale: number;
10
- data: BigInt128Array;
11
- }
12
- export declare const DdbDecimal128Serializor: {
13
- /** 解析为标量 */
14
- parse_as_scalar(buf: Uint8Array, le: boolean): [number, DdbDecimal128Value];
15
- /** 解析为仅由同类数据组成的 vector 的值 */
16
- parse_as_same_type_vector_values(buf: Uint8Array, byte_offset: number, items_length: number): [number, BigInt128Array];
17
- /** 解析为 vector 中的单独项 */
18
- parse_as_vector_items(buf: Uint8Array, length: number, le: boolean): [number, DdbDecimal128VectorValue];
19
- /** 序列化 */
20
- pack(value: DdbDecimal128Value): [Int32Array, BigInt128Array];
21
- };
@@ -1,34 +0,0 @@
1
- import { BigInt128Array } from '../shared/bigint-128-array.js';
2
- import { nulls } from '../shared/constants.js';
3
- import { getBigInt128 } from '../shared/data-view-extends.js';
4
- export const DdbDecimal128Serializor = {
5
- /** 解析为标量 */
6
- parse_as_scalar(buf, le) {
7
- const dv = new DataView(buf.buffer, buf.byteOffset);
8
- const data = getBigInt128(dv, 4, le);
9
- return [20, { scale: dv.getInt32(0, le), data: data === nulls.int128 ? null : data }];
10
- },
11
- /** 解析为仅由同类数据组成的 vector 的值 */
12
- parse_as_same_type_vector_values(buf, byte_offset, items_length) {
13
- const bytes_length = items_length * 16;
14
- const data = new BigInt128Array(buf.buffer.slice(buf.byteOffset + byte_offset, buf.byteOffset + byte_offset + bytes_length));
15
- return [bytes_length, data];
16
- },
17
- /** 解析为 vector 中的单独项 */
18
- parse_as_vector_items(buf, length, le) {
19
- const dv = new DataView(buf.buffer, buf.byteOffset);
20
- return [
21
- 4 + 16 * length,
22
- {
23
- scale: dv.getInt32(0, le),
24
- data: new BigInt128Array(buf.buffer.slice(buf.byteOffset + 4, buf.byteOffset + 4 + 16 * length))
25
- }
26
- ];
27
- },
28
- /** 序列化 */
29
- pack(value) {
30
- const { scale, data } = value;
31
- return [Int32Array.of(scale), BigInt128Array.of(data === null ? nulls.int128 : data)];
32
- }
33
- };
34
- //# sourceMappingURL=decimal-128.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"decimal-128.js","sourceRoot":"","sources":["decimal-128.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAiB7D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,YAAY;IACZ,eAAe,CAAE,GAAe,EAAE,EAAW;QACzC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,CAAA;QAEnD,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEpC,OAAO,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IACzF,CAAC;IAGD,6BAA6B;IAC7B,gCAAgC,CAAE,GAAe,EAAE,WAAmB,EAAE,YAAoB;QACxF,MAAM,YAAY,GAAG,YAAY,GAAG,EAAE,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,WAAW,EAAE,GAAG,CAAC,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,CAAA;QAC5H,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;IAC/B,CAAC;IAGD,uBAAuB;IACvB,qBAAqB,CAAE,GAAe,EAAE,MAAc,EAAE,EAAW;QAC/D,MAAM,EAAE,GAAG,IAAI,QAAQ,CACnB,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,UAAU,CACjB,CAAA;QAED,OAAO;YACH,CAAC,GAAG,EAAE,GAAG,MAAM;YACf;gBACI,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;gBACzB,IAAI,EAAE,IAAI,cAAc,CACpB,GAAG,CAAC,MAAM,CAAC,KAAK,CACZ,GAAG,CAAC,UAAU,GAAG,CAAC,EAClB,GAAG,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,CACnC,CACJ;aACwB;SAChC,CAAA;IACL,CAAC;IAGD,UAAU;IACV,IAAI,CAAE,KAAyB;QAC3B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QAC7B,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACzF,CAAC;CACJ,CAAA","sourcesContent":["import { BigInt128Array } from '../shared/bigint-128-array.js'\nimport { nulls } from '../shared/constants.js'\nimport { getBigInt128 } from '../shared/data-view-extends.js'\n\nexport interface DdbDecimal128Value {\n /** int32, data 需要除以 10^scale 得到原值 data needs to be divided by 10^scale to get the original value */\n scale: number\n \n /** int128, 空值为 null empty value is null */\n data: bigint | null\n}\n\nexport interface DdbDecimal128VectorValue {\n scale: number\n \n data: BigInt128Array\n}\n\n\nexport const DdbDecimal128Serializor = {\n /** 解析为标量 */\n parse_as_scalar (buf: Uint8Array, le: boolean): [number, DdbDecimal128Value] {\n const dv = new DataView(buf.buffer, buf.byteOffset)\n \n const data = getBigInt128(dv, 4, le)\n \n return [20, { scale: dv.getInt32(0, le), data: data === nulls.int128 ? null : data }]\n },\n \n \n /** 解析为仅由同类数据组成的 vector 的值 */\n parse_as_same_type_vector_values (buf: Uint8Array, byte_offset: number, items_length: number): [number, BigInt128Array] {\n const bytes_length = items_length * 16\n const data = new BigInt128Array(buf.buffer.slice(buf.byteOffset + byte_offset, buf.byteOffset + byte_offset + bytes_length))\n return [bytes_length, data]\n },\n \n \n /** 解析为 vector 中的单独项 */\n parse_as_vector_items (buf: Uint8Array, length: number, le: boolean): [number, DdbDecimal128VectorValue] {\n const dv = new DataView(\n buf.buffer,\n buf.byteOffset\n )\n \n return [\n 4 + 16 * length,\n {\n scale: dv.getInt32(0, le),\n data: new BigInt128Array(\n buf.buffer.slice(\n buf.byteOffset + 4,\n buf.byteOffset + 4 + 16 * length\n )\n )\n } as DdbDecimal128VectorValue\n ]\n },\n \n \n /** 序列化 */\n pack (value: DdbDecimal128Value): [Int32Array, BigInt128Array] {\n const { scale, data } = value\n return [Int32Array.of(scale), BigInt128Array.of(data === null ? nulls.int128 : data)]\n }\n}\n"]}
@@ -1,26 +0,0 @@
1
- export declare class BigInt128Array {
2
- static of(...items: bigint[]): BigInt128Array;
3
- static from(arrayLike: ArrayLike<bigint>): BigInt128Array;
4
- static from<U>(arrayLike: ArrayLike<U>, mapfn: (v: U, k: number) => bigint, thisArg?: any): BigInt128Array;
5
- readonly BYTES_PER_ELEMENT: number;
6
- readonly buffer: ArrayBufferLike;
7
- readonly byteLength: number;
8
- readonly byteOffset: number;
9
- constructor(length?: number);
10
- constructor(array: Iterable<bigint>);
11
- constructor(buffer: ArrayBufferLike, byteOffset?: number, length?: number);
12
- get length(): number;
13
- set(array: ArrayLike<bigint>, offset?: number): void;
14
- at(index: number): bigint;
15
- subarray(begin?: number, end?: number): BigInt128Array;
16
- [Symbol.iterator](): {
17
- next(): {
18
- value: bigint;
19
- done: boolean;
20
- } | {
21
- done: boolean;
22
- value?: undefined;
23
- };
24
- };
25
- toString(): string;
26
- }