dolphindb 0.0.4 → 0.0.5

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 CHANGED
@@ -66,16 +66,24 @@ export interface DdbFunctionDefValue {
66
66
  export interface DdbSymbolExtendedValue {
67
67
  base_id: number;
68
68
  base: string[];
69
- value: Uint32Array;
69
+ data: Uint32Array;
70
70
  }
71
- export declare type DdbValue = null | boolean | number | [number, number] | bigint | string | string[] | Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | Uint8Array[] | DdbObj[] | DdbFunctionDefValue | DdbSymbolExtendedValue;
72
- export declare type DdbVectorValue = string | string[] | Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | Uint8Array[] | DdbObj[] | DdbSymbolExtendedValue;
71
+ export interface DdbArrayVectorBlock {
72
+ unit: 1 | 2 | 4;
73
+ rows: number;
74
+ lengths: Uint8Array | Uint16Array | Uint32Array;
75
+ data: DdbVectorValue;
76
+ }
77
+ export declare type DdbValue = null | boolean | number | [number, number] | bigint | string | string[] | Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | Uint8Array[] | DdbObj[] | DdbFunctionDefValue | DdbSymbolExtendedValue | DdbArrayVectorBlock[];
78
+ export declare type DdbVectorValue = string | string[] | Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | BigInt64Array | Uint8Array[] | DdbObj[] | DdbSymbolExtendedValue | DdbArrayVectorBlock[];
73
79
  export declare const nulls: {
74
80
  readonly char: "€";
75
81
  readonly int16: -32768;
76
82
  readonly int32: -2147483648;
77
83
  readonly int64: -9223372036854775808n;
78
84
  };
85
+ export declare const timezone_offset: number;
86
+ /** 可以表示所有 DolphinDB 数据库中的数据类型 */
79
87
  export declare class DdbObj<T extends DdbValue = DdbValue> {
80
88
  static dec: TextDecoder;
81
89
  static enc: TextEncoder;
@@ -130,6 +138,10 @@ export declare class DdbObj<T extends DdbValue = DdbValue> {
130
138
  toString(): string;
131
139
  to_cols(): any[];
132
140
  to_rows<T extends Record<string, any> = Record<string, any>>(): T[];
141
+ to_dict<T = Record<string, any>>(): T;
142
+ }
143
+ export declare class DdbVoid extends DdbObj<undefined> {
144
+ constructor();
133
145
  }
134
146
  export declare class DdbBool extends DdbObj<boolean> {
135
147
  constructor(value: boolean);
@@ -164,6 +176,8 @@ export declare class DdbPair extends DdbObj<Int32Array> {
164
176
  export declare class DdbFunction extends DdbObj<DdbFunctionDefValue> {
165
177
  constructor(name: string, type: DdbFunctionType);
166
178
  }
179
+ export declare function date2str(date: number): string;
180
+ export declare function timestamp2str(timestamp: bigint): string;
167
181
  export declare class DDB {
168
182
  /** 当前的 session id (http 或 tcp) */
169
183
  sid: string;
@@ -183,7 +197,7 @@ export declare class DDB {
183
197
  constructor(ws_url?: string);
184
198
  /** 连接到 DolphinDB Server */
185
199
  connect({ ws_url, login, username, password, }?: {
186
- /** 默认使用实例初始化时传入的 WebSocket 链接地址 */
200
+ /** 默认使用实例初始化时传入的 WebSocket 链接 */
187
201
  ws_url?: string;
188
202
  /** 是否在建立连接后自动登录,默认 true */
189
203
  login?: boolean;
@@ -193,7 +207,7 @@ export declare class DDB {
193
207
  password?: string;
194
208
  }): Promise<void>;
195
209
  disconnect(): void;
196
- /** rpc through websocket (function command)
210
+ /** rpc through websocket (function/script/variable command)
197
211
  - type: API 类型: 'script' | 'function' | 'variable'
198
212
  - options:
199
213
  - urgent?: 决定 `行为标识` 那一行字符串的取值(只适用于 script 和 function)
@@ -212,14 +226,14 @@ export declare class DDB {
212
226
  script: string,
213
227
  /** 执行选项 */
214
228
  { urgent }?: {
215
- /** 紧急 flag,使用 urgent worker 处理,防止被其它作业阻塞 */
229
+ /** 紧急 flag,确保提交的脚本使用 urgent worker 处理,防止被其它作业阻塞 */
216
230
  urgent?: boolean;
217
231
  }): Promise<T>;
218
232
  /** call function through websocket (function command)
219
233
  - func: 函数名
220
234
  - args?: `[ ]` 调用参数 (传入的原生 string 和 boolean 会被自动转换为 DdbObj<string> 和 DdbObj<boolean>)
221
235
  - options?: 调用选项
222
- - urgent?: 紧急 flag,使用 urgent worker 处理,防止被其它作业阻塞
236
+ - urgent?: 紧急 flag。使用 urgent worker 执行,防止被其它作业阻塞
223
237
  - node?: 设置结点 alias 时发送到集群中对应的结点执行 (使用 DolphinDB 中的 rpc 方法)
224
238
  - nodes?: 设置多个结点 alias 时发送到集群中对应的多个结点执行 (使用 DolphinDB 中的 pnodeRun 方法)
225
239
  - func_type?: 设置 node 参数时必传,需指定函数类型,其它情况下不传
package/browser.js CHANGED
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ddb = exports.DDB = exports.DdbFunction = exports.DdbPair = exports.DdbVectorAny = exports.DdbVectorDouble = exports.DdbVectorString = exports.DdbVectorInt = exports.DdbDouble = exports.DdbLong = exports.DdbString = exports.DdbInt = exports.DdbBool = exports.DdbObj = exports.nulls = exports.DdbFunctionType = exports.DdbType = exports.DdbForm = void 0;
3
+ exports.ddb = exports.DDB = exports.timestamp2str = exports.date2str = exports.DdbFunction = exports.DdbPair = exports.DdbVectorAny = exports.DdbVectorDouble = exports.DdbVectorString = exports.DdbVectorInt = exports.DdbDouble = exports.DdbLong = exports.DdbString = exports.DdbInt = exports.DdbBool = exports.DdbVoid = exports.DdbObj = exports.timezone_offset = exports.nulls = exports.DdbFunctionType = exports.DdbType = exports.DdbForm = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const dayjs_1 = (0, tslib_1.__importDefault)(require("dayjs"));
6
6
  require("xshell/prototype.browser");
7
7
  const utils_browser_1 = require("xshell/utils.browser");
8
- const chalk_browser_1 = require("xshell/chalk.browser");
9
8
  var DdbForm;
10
9
  (function (DdbForm) {
11
10
  DdbForm[DdbForm["scalar"] = 0] = "scalar";
@@ -75,6 +74,8 @@ exports.nulls = {
75
74
  int32: -2147483648,
76
75
  int64: -0x8000000000000000n, // -922_3372_0368_5477_5808
77
76
  };
77
+ exports.timezone_offset = 1000 * 60 * new Date().getTimezoneOffset();
78
+ /** 可以表示所有 DolphinDB 数据库中的数据类型 */
78
79
  class DdbObj {
79
80
  constructor(data) {
80
81
  /** 是否为小端 (little endian) */
@@ -333,16 +334,86 @@ class DdbObj {
333
334
  static parse_vector(buf, le, type) {
334
335
  const dv = new DataView(buf.buffer, buf.byteOffset);
335
336
  const rows = dv.getUint32(0, le);
336
- const i_items_start = 8;
337
- const [len_items, value] = this.parse_vector_items(buf.subarray(i_items_start), le, type, rows);
337
+ let i_items_start = 8;
338
+ if (type < 64 || type >= 128) {
339
+ const [len_items, value] = this.parse_vector_items(buf.subarray(i_items_start), le, type, rows);
340
+ return new this({
341
+ le,
342
+ form: DdbForm.vector,
343
+ type,
344
+ length: i_items_start + len_items,
345
+ cols: 1,
346
+ rows,
347
+ value,
348
+ });
349
+ }
350
+ // array vector
351
+ // av = array(INT[], 0, 3)
352
+ // append!(av, [1..4])
353
+ // append!(av, [1..70000])
354
+ // av
355
+ // <Buffer 44 01 type = array vector, form = vector
356
+ // 02 00 00 00 74 11 01 00 rows = 2, cols = 70004 (0x011174)
357
+ // block 0
358
+ // 01 00 block.rows = 1
359
+ // 04 block.unit = 4
360
+ // 00 reserved
361
+ // 04 00 00 00 block.lengths = [4]
362
+ // 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 block.data
363
+ // block 1
364
+ // 01 00 block.rows = 1
365
+ // 04 block.unit = 4
366
+ // 00 reserved
367
+ // 70 11 01 00 block.lengths = [70000 (0x00011170)]
368
+ // 01 00 00 00 02 00 00 00 ... 279992 more bytes> block.data
369
+ const cols = dv.getUint32(4, le);
370
+ let blocks = [];
371
+ let i_block_start = i_items_start;
372
+ // 解析一个 block
373
+ for (let i_row = 0; i_row < rows;) {
374
+ /** 对应 array vector 中元素个数 */
375
+ const rows = dv.getUint16(i_block_start, le);
376
+ /** 每个 length 占用的字节数 */
377
+ const unit = dv.getUint8(i_block_start + 2);
378
+ /** array vector 每个元素的子元素长度 */
379
+ let lengths;
380
+ const i_lengths_start = i_block_start + 4;
381
+ const i_data_start = i_lengths_start + rows * unit;
382
+ const lengths_buf = buf.slice(i_lengths_start, i_data_start);
383
+ switch (unit) {
384
+ case 1:
385
+ lengths = lengths_buf;
386
+ break;
387
+ case 2:
388
+ lengths = new Uint16Array(lengths_buf.buffer);
389
+ break;
390
+ case 4:
391
+ lengths = new Uint32Array(lengths_buf.buffer);
392
+ break;
393
+ default:
394
+ throw new Error(`array vector 存在非法 unit = ${unit}`);
395
+ }
396
+ let total_length = 0;
397
+ for (let i = 0; i < lengths.length; i++)
398
+ total_length += lengths[i];
399
+ const [len_items, data] = this.parse_vector_items(buf.subarray(i_data_start), le, type - 64, total_length);
400
+ blocks.push({
401
+ unit,
402
+ rows,
403
+ lengths,
404
+ data
405
+ });
406
+ i_block_start = i_data_start + len_items;
407
+ i_row += rows;
408
+ }
338
409
  return new this({
339
410
  le,
340
411
  form: DdbForm.vector,
341
412
  type,
342
- length: i_items_start + len_items,
343
- cols: 1,
413
+ length: i_block_start,
414
+ cols,
344
415
  rows,
345
- value,
416
+ value: blocks
346
417
  });
347
418
  }
348
419
  /** 有可能没有字节对齐,不能直接使用原有 message 的 arraybuffer, 统一复制出来,让原有 arraybuffer 被回收掉比较好 */
@@ -423,13 +494,13 @@ class DdbObj {
423
494
  }
424
495
  const value_start = 8 + base_length;
425
496
  const value_end = value_start + length * 4;
426
- const value = new Uint32Array(buf.buffer.slice(buf.byteOffset + value_start, buf.byteOffset + value_end));
497
+ const data = new Uint32Array(buf.buffer.slice(buf.byteOffset + value_start, buf.byteOffset + value_end));
427
498
  return [
428
499
  value_end,
429
500
  {
430
501
  base_id,
431
502
  base,
432
- value
503
+ data
433
504
  }
434
505
  ];
435
506
  }
@@ -554,11 +625,24 @@ class DdbObj {
554
625
  return [Float64Array.from(this.value)];
555
626
  case DdbType.duration:
556
627
  return [value];
628
+ case DdbType.handle:
629
+ throw new Error('DolphinDB Server 不支持 handle 的反序列化');
557
630
  default:
558
631
  throw new Error(`${DdbType[type]} 暂时不支持序列化`);
559
632
  }
560
633
  case DdbForm.vector:
561
634
  case DdbForm.pair:
635
+ // pack array vector
636
+ if (form === DdbForm.vector && 64 <= type && type < 128)
637
+ return [
638
+ Uint32Array.of(this.rows, this.cols),
639
+ ...this.value.map(block => ([
640
+ Uint16Array.of(block.rows),
641
+ Uint8Array.of(block.unit, 0),
642
+ block.lengths,
643
+ block.data
644
+ ])).flat()
645
+ ];
562
646
  return [
563
647
  Uint32Array.of(this.rows, 1),
564
648
  ...DdbObj.pack_vector_body(value, type, this.rows)
@@ -674,6 +758,14 @@ class DdbObj {
674
758
  bufs[i] = value[i].pack();
675
759
  return bufs;
676
760
  }
761
+ case DdbType.symbol_extended: {
762
+ const { base_id, base, data } = value;
763
+ return [
764
+ Uint32Array.of(base_id, base.length),
765
+ ...this.pack_vector_body(base, DdbType.string, base.length),
766
+ data
767
+ ];
768
+ }
677
769
  default:
678
770
  throw new Error(`vector ${DdbType[type]} 暂不支持序列化`);
679
771
  }
@@ -687,6 +779,8 @@ class DdbObj {
687
779
  return `functiondef<${DdbFunctionType[this.value.type]}>`;
688
780
  return tname;
689
781
  case DdbForm.vector:
782
+ if (64 <= this.type && this.type < 128)
783
+ return `${DdbType[this.type - 64]}[][${this.rows}]`;
690
784
  return `${tname}[${this.rows}]`;
691
785
  case DdbForm.pair:
692
786
  return `pair<${tname}>`;
@@ -709,7 +803,7 @@ class DdbObj {
709
803
  return `'${this.value.name}'`;
710
804
  return this.value;
711
805
  })();
712
- return `${(0, chalk_browser_1.blue)(type)}(${this.name ? `'${(0, chalk_browser_1.yellow)(this.name)}', ` : ''}${data})\n`;
806
+ return `${type}(${this.name ? `'${this.name}', ` : ''}${data})\n`;
713
807
  }
714
808
  to_cols() {
715
809
  return this.value.map(col => {
@@ -719,18 +813,10 @@ class DdbObj {
719
813
  };
720
814
  switch (col.type) {
721
815
  case DdbType.timestamp:
722
- col_.render = (value) => {
723
- if (value === exports.nulls.int64)
724
- return '';
725
- return (0, dayjs_1.default)(Number(value)).format('YYYY.MM.DD HH:mm:ss.SSS');
726
- };
816
+ col_.render = timestamp2str;
727
817
  break;
728
818
  case DdbType.date:
729
- col_.render = (value) => {
730
- if (value === exports.nulls.int32)
731
- return '';
732
- return (0, dayjs_1.default)(Number(1000 * 3600 * 24 * value)).format('YYYY.MM.DD');
733
- };
819
+ col_.render = date2str;
734
820
  break;
735
821
  case DdbType.ipaddr:
736
822
  col_.render = value => value.slice().reverse().join('.').replace(/^(0\.)+/, '');
@@ -755,6 +841,15 @@ class DdbObj {
755
841
  }
756
842
  return rows;
757
843
  }
844
+ to_dict() {
845
+ if (this.form !== DdbForm.dict)
846
+ throw new Error('this.form 不是 dict, 不能转换为 Object');
847
+ const [{ value: keys }, { value: values }] = this.value;
848
+ let obj = {};
849
+ for (let i = 0; i < this.rows; i++)
850
+ obj[keys[i]] = values[i].value;
851
+ return obj;
852
+ }
758
853
  }
759
854
  exports.DdbObj = DdbObj;
760
855
  DdbObj.dec = new TextDecoder('utf-8');
@@ -763,6 +858,16 @@ DdbObj.enc = new TextEncoder();
763
858
  DdbObj.symbol_bases = {};
764
859
  /** little endian (client) */
765
860
  DdbObj.le_client = Boolean(new Uint8Array(Uint32Array.of(1).buffer)[0]);
861
+ class DdbVoid extends DdbObj {
862
+ constructor() {
863
+ super({
864
+ form: DdbForm.scalar,
865
+ type: DdbType.void,
866
+ length: 0,
867
+ });
868
+ }
869
+ }
870
+ exports.DdbVoid = DdbVoid;
766
871
  class DdbBool extends DdbObj {
767
872
  constructor(value) {
768
873
  super({
@@ -894,6 +999,20 @@ class DdbFunction extends DdbObj {
894
999
  }
895
1000
  }
896
1001
  exports.DdbFunction = DdbFunction;
1002
+ function date2str(date) {
1003
+ return date === exports.nulls.int32 ?
1004
+ ''
1005
+ :
1006
+ (0, dayjs_1.default)(exports.timezone_offset + 1000 * 3600 * 24 * date).format('YYYY.MM.DD');
1007
+ }
1008
+ exports.date2str = date2str;
1009
+ function timestamp2str(timestamp) {
1010
+ return timestamp === exports.nulls.int64 ?
1011
+ ''
1012
+ :
1013
+ (0, dayjs_1.default)(exports.timezone_offset + Number(timestamp)).format('YYYY.MM.DD HH:mm:ss.SSS');
1014
+ }
1015
+ exports.timestamp2str = timestamp2str;
897
1016
  class DDB {
898
1017
  constructor(ws_url) {
899
1018
  /** 当前的 session id (http 或 tcp) */
@@ -972,7 +1091,7 @@ class DDB {
972
1091
  disconnect() {
973
1092
  this.ws?.close(1000);
974
1093
  }
975
- /** rpc through websocket (function command)
1094
+ /** rpc through websocket (function/script/variable command)
976
1095
  - type: API 类型: 'script' | 'function' | 'variable'
977
1096
  - options:
978
1097
  - urgent?: 决定 `行为标识` 那一行字符串的取值(只适用于 script 和 function)
@@ -1043,7 +1162,7 @@ class DDB {
1043
1162
  - func: 函数名
1044
1163
  - args?: `[ ]` 调用参数 (传入的原生 string 和 boolean 会被自动转换为 DdbObj<string> 和 DdbObj<boolean>)
1045
1164
  - options?: 调用选项
1046
- - urgent?: 紧急 flag,使用 urgent worker 处理,防止被其它作业阻塞
1165
+ - urgent?: 紧急 flag。使用 urgent worker 执行,防止被其它作业阻塞
1047
1166
  - node?: 设置结点 alias 时发送到集群中对应的结点执行 (使用 DolphinDB 中的 rpc 方法)
1048
1167
  - nodes?: 设置多个结点 alias 时发送到集群中对应的多个结点执行 (使用 DolphinDB 中的 pnodeRun 方法)
1049
1168
  - func_type?: 设置 node 参数时必传,需指定函数类型,其它情况下不传