@quantform/core 0.7.22 → 0.7.25

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.
Files changed (195) hide show
  1. package/lib/app.d.ts +12 -0
  2. package/lib/app.d.ts.map +1 -0
  3. package/lib/app.js +35 -0
  4. package/lib/cli/build.d.ts.map +1 -1
  5. package/lib/cli/build.js +8 -18
  6. package/lib/cli/index.js +3 -12
  7. package/lib/cli/internal/script.d.ts +1 -1
  8. package/lib/cli/internal/script.d.ts.map +1 -1
  9. package/lib/cli/internal/script.js +8 -28
  10. package/lib/cli/live.js +10 -22
  11. package/lib/cli/paper.js +10 -22
  12. package/lib/cli/replay.d.ts.map +1 -1
  13. package/lib/cli/replay.js +15 -26
  14. package/lib/index.d.ts +1 -6
  15. package/lib/index.d.ts.map +1 -1
  16. package/lib/index.js +1 -6
  17. package/lib/make-test-module.d.ts +1 -6
  18. package/lib/make-test-module.d.ts.map +1 -1
  19. package/lib/make-test-module.js +19 -30
  20. package/lib/module.d.ts.map +1 -1
  21. package/lib/module.js +9 -24
  22. package/lib/module.spec.js +8 -17
  23. package/lib/replay/use-replay-options.d.ts +5 -4
  24. package/lib/replay/use-replay-options.d.ts.map +1 -1
  25. package/lib/replay/use-replay-options.js +5 -1
  26. package/lib/replay/use-replay-scheduler.d.ts +7 -6
  27. package/lib/replay/use-replay-scheduler.d.ts.map +1 -1
  28. package/lib/replay/use-replay-scheduler.js +64 -70
  29. package/lib/replay/use-replay-storage-buffer.d.ts +3 -2
  30. package/lib/replay/use-replay-storage-buffer.d.ts.map +1 -1
  31. package/lib/replay/use-replay-storage-buffer.js +12 -23
  32. package/lib/replay/use-replay-storage-cursor.d.ts +9 -8
  33. package/lib/replay/use-replay-storage-cursor.d.ts.map +1 -1
  34. package/lib/replay/use-replay-storage-cursor.js +17 -25
  35. package/lib/replay/use-replay-storage.d.ts +5 -4
  36. package/lib/replay/use-replay-storage.d.ts.map +1 -1
  37. package/lib/replay/use-replay-storage.js +32 -39
  38. package/lib/session/use-session-storage.d.ts +1 -1
  39. package/lib/session/use-session-storage.d.ts.map +1 -1
  40. package/lib/session/use-session-storage.js +8 -5
  41. package/lib/shared/environment.js +1 -1
  42. package/lib/shared/index.d.ts +0 -1
  43. package/lib/shared/index.d.ts.map +1 -1
  44. package/lib/shared/index.js +0 -1
  45. package/lib/simulator/use-simulator.spec.js +17 -30
  46. package/lib/storage/in-memory/in-memory-storage.d.ts.map +1 -1
  47. package/lib/storage/in-memory/in-memory-storage.factory.js +2 -2
  48. package/lib/storage/in-memory/in-memory-storage.js +56 -55
  49. package/lib/storage/in-memory/in-memory-storage.spec.js +90 -100
  50. package/lib/storage/storage.d.ts +9 -8
  51. package/lib/storage/storage.d.ts.map +1 -1
  52. package/lib/storage/storage.js +8 -2
  53. package/lib/storage/use-cache.d.ts +1 -1
  54. package/lib/storage/use-cache.d.ts.map +1 -1
  55. package/lib/storage/use-cache.js +5 -5
  56. package/lib/storage/use-cache.spec.js +14 -25
  57. package/lib/storage/use-storage.d.ts +1 -1
  58. package/lib/storage/use-storage.d.ts.map +1 -1
  59. package/lib/storage/use-storage.js +9 -6
  60. package/lib/use-execution-mode.js +2 -2
  61. package/lib/use-hash.spec.js +3 -6
  62. package/lib/use-logger.d.ts +1 -1
  63. package/lib/use-logger.d.ts.map +1 -1
  64. package/lib/use-logger.js +10 -7
  65. package/lib/use-memo.spec.js +14 -25
  66. package/lib/use-socket.d.ts +3 -2
  67. package/lib/use-socket.d.ts.map +1 -1
  68. package/lib/use-socket.js +2 -2
  69. package/lib/use-timestamp.d.ts +14 -1
  70. package/lib/use-timestamp.d.ts.map +1 -1
  71. package/lib/use-timestamp.js +30 -3
  72. package/lib/with-request.d.ts +2 -1
  73. package/lib/with-request.d.ts.map +1 -1
  74. package/lib/with-request.js +4 -13
  75. package/package.json +6 -10
  76. package/src/app.ts +52 -0
  77. package/src/cli/build.ts +11 -6
  78. package/src/cli/internal/script.ts +25 -54
  79. package/src/cli/replay.ts +13 -2
  80. package/src/index.ts +1 -6
  81. package/src/make-test-module.ts +13 -21
  82. package/src/module.ts +0 -3
  83. package/src/replay/use-replay-options.ts +7 -3
  84. package/src/replay/use-replay-scheduler.ts +75 -67
  85. package/src/replay/use-replay-storage-buffer.ts +2 -1
  86. package/src/replay/use-replay-storage-cursor.ts +33 -28
  87. package/src/replay/use-replay-storage.ts +36 -27
  88. package/src/session/use-session-storage.ts +7 -5
  89. package/src/shared/index.ts +0 -1
  90. package/src/storage/in-memory/in-memory-storage.spec.ts +55 -54
  91. package/src/storage/in-memory/in-memory-storage.ts +24 -7
  92. package/src/storage/storage.ts +16 -7
  93. package/src/storage/use-cache.ts +4 -4
  94. package/src/storage/use-storage.ts +8 -6
  95. package/src/use-hash.spec.ts +3 -6
  96. package/src/use-logger.ts +9 -6
  97. package/src/use-socket.ts +5 -5
  98. package/src/use-timestamp.ts +41 -3
  99. package/src/with-request.ts +3 -3
  100. package/lib/asset/asset.d.ts +0 -41
  101. package/lib/asset/asset.d.ts.map +0 -1
  102. package/lib/asset/asset.js +0 -76
  103. package/lib/asset/asset.spec.d.ts +0 -2
  104. package/lib/asset/asset.spec.d.ts.map +0 -1
  105. package/lib/asset/asset.spec.js +0 -54
  106. package/lib/asset/index.d.ts +0 -2
  107. package/lib/asset/index.d.ts.map +0 -1
  108. package/lib/asset/index.js +0 -17
  109. package/lib/component/distinct-until-timesamp-changed.d.ts +0 -5
  110. package/lib/component/distinct-until-timesamp-changed.d.ts.map +0 -1
  111. package/lib/component/distinct-until-timesamp-changed.js +0 -9
  112. package/lib/component/error.d.ts +0 -17
  113. package/lib/component/error.d.ts.map +0 -1
  114. package/lib/component/error.js +0 -33
  115. package/lib/component/index.d.ts +0 -8
  116. package/lib/component/index.d.ts.map +0 -1
  117. package/lib/component/index.js +0 -23
  118. package/lib/component/ohlc-operator.d.ts +0 -11
  119. package/lib/component/ohlc-operator.d.ts.map +0 -1
  120. package/lib/component/ohlc-operator.js +0 -69
  121. package/lib/component/ohlc-operator.spec.d.ts +0 -2
  122. package/lib/component/ohlc-operator.spec.d.ts.map +0 -1
  123. package/lib/component/ohlc-operator.spec.js +0 -110
  124. package/lib/component/ohlc.d.ts +0 -12
  125. package/lib/component/ohlc.d.ts.map +0 -1
  126. package/lib/component/ohlc.js +0 -20
  127. package/lib/component/ohlc.spec.d.ts +0 -2
  128. package/lib/component/ohlc.spec.d.ts.map +0 -1
  129. package/lib/component/ohlc.spec.js +0 -25
  130. package/lib/component/timeframe.d.ts +0 -15
  131. package/lib/component/timeframe.d.ts.map +0 -1
  132. package/lib/component/timeframe.js +0 -21
  133. package/lib/core.d.ts +0 -3
  134. package/lib/core.d.ts.map +0 -1
  135. package/lib/core.js +0 -17
  136. package/lib/instrument/commission/commission.d.ts +0 -16
  137. package/lib/instrument/commission/commission.d.ts.map +0 -1
  138. package/lib/instrument/commission/commission.js +0 -28
  139. package/lib/instrument/commission/commission.spec.d.ts +0 -2
  140. package/lib/instrument/commission/commission.spec.d.ts.map +0 -1
  141. package/lib/instrument/commission/commission.spec.js +0 -30
  142. package/lib/instrument/index.d.ts +0 -3
  143. package/lib/instrument/index.d.ts.map +0 -1
  144. package/lib/instrument/index.js +0 -18
  145. package/lib/instrument/instrument.d.ts +0 -28
  146. package/lib/instrument/instrument.d.ts.map +0 -1
  147. package/lib/instrument/instrument.js +0 -53
  148. package/lib/instrument/instrument.spec.d.ts +0 -2
  149. package/lib/instrument/instrument.spec.d.ts.map +0 -1
  150. package/lib/instrument/instrument.spec.js +0 -51
  151. package/lib/operators.d.ts +0 -5
  152. package/lib/operators.d.ts.map +0 -1
  153. package/lib/operators.js +0 -16
  154. package/lib/shared/datetime.d.ts +0 -3
  155. package/lib/shared/datetime.d.ts.map +0 -1
  156. package/lib/shared/datetime.js +0 -7
  157. package/lib/strategy.d.ts +0 -15
  158. package/lib/strategy.d.ts.map +0 -1
  159. package/lib/strategy.js +0 -26
  160. package/lib/strategy.spec.d.ts +0 -2
  161. package/lib/strategy.spec.d.ts.map +0 -1
  162. package/lib/strategy.spec.js +0 -34
  163. package/lib/when-socket.d.ts +0 -8
  164. package/lib/when-socket.d.ts.map +0 -1
  165. package/lib/when-socket.js +0 -53
  166. package/lib/with-memo.d.ts +0 -5
  167. package/lib/with-memo.d.ts.map +0 -1
  168. package/lib/with-memo.js +0 -20
  169. package/lib/with-memo.spec.d.ts +0 -2
  170. package/lib/with-memo.spec.d.ts.map +0 -1
  171. package/lib/with-memo.spec.js +0 -47
  172. package/src/asset/asset.spec.ts +0 -70
  173. package/src/asset/asset.ts +0 -89
  174. package/src/asset/index.ts +0 -1
  175. package/src/component/distinct-until-timesamp-changed.ts +0 -11
  176. package/src/component/error.ts +0 -32
  177. package/src/component/index.ts +0 -7
  178. package/src/component/ohlc-operator.spec.ts +0 -125
  179. package/src/component/ohlc-operator.ts +0 -122
  180. package/src/component/ohlc.spec.ts +0 -30
  181. package/src/component/ohlc.ts +0 -18
  182. package/src/component/timeframe.ts +0 -17
  183. package/src/core.ts +0 -16
  184. package/src/instrument/commission/commission.spec.ts +0 -35
  185. package/src/instrument/commission/commission.ts +0 -27
  186. package/src/instrument/index.ts +0 -2
  187. package/src/instrument/instrument.spec.ts +0 -76
  188. package/src/instrument/instrument.ts +0 -65
  189. package/src/operators.ts +0 -18
  190. package/src/shared/datetime.ts +0 -5
  191. package/src/strategy.spec.ts +0 -42
  192. package/src/strategy.ts +0 -36
  193. package/src/when-socket.ts +0 -61
  194. package/src/with-memo.spec.ts +0 -46
  195. package/src/with-memo.ts +0 -33
@@ -1,10 +1,20 @@
1
- import { Observable, Subject } from 'rxjs';
1
+ import { Observable } from 'rxjs';
2
2
 
3
- import { core } from '@lib/core';
4
3
  import { Dependency, Module } from '@lib/module';
5
4
 
5
+ import { InMemoryStorageFactory, useStorageFactory } from './storage';
6
+ import { useExecutionMode } from './use-execution-mode';
7
+ import { ConsoleLoggerFactory, logger } from './use-logger';
8
+ import { useMemo } from './use-memo';
9
+
6
10
  export async function makeTestModule(dependencies: Dependency[]) {
7
- const module = new Module([...core(), ...dependencies]);
11
+ const module = new Module([
12
+ useMemo.options(),
13
+ logger(new ConsoleLoggerFactory()),
14
+ useExecutionMode.paperOptions({ recording: false }),
15
+ useStorageFactory.options(new InMemoryStorageFactory()),
16
+ ...dependencies
17
+ ]);
8
18
 
9
19
  const { act } = await module.awake();
10
20
 
@@ -14,11 +24,6 @@ export async function makeTestModule(dependencies: Dependency[]) {
14
24
  };
15
25
  }
16
26
 
17
- type MockableFunction = (...args: any[]) => any;
18
-
19
- export const mockedFunc = <Func extends MockableFunction>(mockedFunc: Func) =>
20
- mockedFunc as jest.MockedFunction<typeof mockedFunc>;
21
-
22
27
  export function toArray<T>(observable: Observable<T>) {
23
28
  const array = Array.of<T | Error>();
24
29
 
@@ -47,16 +52,3 @@ export function toArray<T>(observable: Observable<T>) {
47
52
  }
48
53
 
49
54
  export type InferObservableType<T> = T extends Observable<infer U> ? U : never;
50
-
51
- export function mockSubject<
52
- T extends jest.FunctionProperties<Required<T>>,
53
- M extends keyof jest.FunctionProperties<Required<T>>
54
- >(object: T, method: M) {
55
- const subject = new Subject<
56
- InferObservableType<ReturnType<jest.FunctionProperties<Required<T>>[M]>>
57
- >();
58
-
59
- jest.spyOn<T, M>(object, method).mockReturnValue(subject.asObservable() as any);
60
-
61
- return subject;
62
- }
package/src/module.ts CHANGED
@@ -37,9 +37,6 @@ function missingInjectionTokenError(token: InjectionToken) {
37
37
  return new Error(`Unable to resolve unregistered dependency: ${token.toString()}`);
38
38
  }
39
39
 
40
- /**
41
- *
42
- */
43
40
  let moduleLocalStorage = new AsyncLocalStorage<Module>();
44
41
 
45
42
  export function setAsyncLocalStorage(als: AsyncLocalStorage<Module>) {
@@ -1,10 +1,11 @@
1
1
  import { Dependency, useContext } from '@lib/module';
2
+ import { Timestamp } from '@lib/use-timestamp';
2
3
 
3
4
  const injectionToken = Symbol('replay-options');
4
5
 
5
6
  type ReplayOptions = {
6
- from: number;
7
- to: number;
7
+ from: Timestamp<'ns'>;
8
+ to: Timestamp<'ns'>;
8
9
  limit?: number;
9
10
  storage?: string;
10
11
  };
@@ -13,7 +14,10 @@ type ReplayOptions = {
13
14
  *
14
15
  */
15
16
  export function replayOptions(
16
- options: Omit<ReplayOptions, 'from' | 'to'> & { from: number; to: number }
17
+ options: Omit<ReplayOptions, 'from' | 'to'> & {
18
+ from: Timestamp<'ns'>;
19
+ to: Timestamp<'ns'>;
20
+ }
17
21
  ): Dependency {
18
22
  return {
19
23
  provide: injectionToken,
@@ -1,97 +1,105 @@
1
1
  import { defer, filter, map, Observable, Subject } from 'rxjs';
2
2
 
3
- import { withMemo } from '@lib/with-memo';
3
+ import { useMemo } from '@lib/use-memo';
4
+ import { Timestamp } from '@lib/use-timestamp';
4
5
 
5
6
  import { useReplayOptions } from './use-replay-options';
6
7
  import { useReplayStorageBuffer } from './use-replay-storage-buffer';
7
8
  import { ReplayQuery, useReplayStorageCursor } from './use-replay-storage-cursor';
8
9
 
9
- export const useReplayScheduler = withMemo(() => {
10
- const { from } = useReplayOptions();
11
- const { get, cursor } = useReplayStorageCursor();
10
+ export function useReplayScheduler() {
11
+ return useMemo(() => {
12
+ const { from } = useReplayOptions();
13
+ const { get, cursor } = useReplayStorageCursor();
12
14
 
13
- let timestamp = from;
14
- let stopAcquire = 1;
15
- let processing = false;
15
+ let timestamp = from;
16
+ let stopAcquire = 1;
17
+ let processing = false;
16
18
 
17
- const stream$ = new Subject<
18
- [ReturnType<typeof useReplayStorageBuffer<any>>, { timestamp: number; payload: any }]
19
- >();
19
+ const stream$ = new Subject<
20
+ [
21
+ ReturnType<typeof useReplayStorageBuffer<any>>,
22
+ { timestamp: Timestamp<'ns'>; payload: any }
23
+ ]
24
+ >();
20
25
 
21
- const processNext = async () => {
22
- const storage = await cursor();
26
+ const processNext = async () => {
27
+ const storage = await cursor();
23
28
 
24
- if (!storage || !storage.peek()) {
25
- stream$.complete();
26
- return false;
27
- }
29
+ if (!storage || !storage.peek()) {
30
+ stream$.complete();
31
+ return false;
32
+ }
33
+
34
+ const sample = storage.dequeue();
28
35
 
29
- const sample = storage.dequeue();
36
+ timestamp = sample.timestamp;
30
37
 
31
- timestamp = sample.timestamp;
38
+ stream$.next([storage, sample]);
32
39
 
33
- stream$.next([storage, sample]);
40
+ return true;
41
+ };
34
42
 
35
- return true;
36
- };
43
+ const next = async () => {
44
+ if (processing) {
45
+ return;
46
+ }
37
47
 
38
- const next = async () => {
39
- if (processing) {
40
- return;
41
- }
48
+ processing = true;
42
49
 
43
- processing = true;
50
+ while (stopAcquire === 0) {
51
+ if (!(await processNext())) {
52
+ break;
53
+ }
44
54
 
45
- while (stopAcquire === 0) {
46
- if (!(await processNext())) {
47
- break;
55
+ await new Promise(it => setImmediate(it));
48
56
  }
49
57
 
50
- await new Promise(it => setImmediate(it));
51
- }
52
-
53
- processing = false;
54
- };
58
+ processing = false;
59
+ };
55
60
 
56
- const tryContinue = () => {
57
- if (stopAcquire === 0) {
58
- return;
59
- }
61
+ const tryContinue = () => {
62
+ if (stopAcquire === 0) {
63
+ return;
64
+ }
60
65
 
61
- stopAcquire--;
66
+ stopAcquire--;
62
67
 
63
- if (stopAcquire === 0) {
64
- next();
65
- }
66
- };
68
+ if (stopAcquire === 0) {
69
+ next();
70
+ }
71
+ };
67
72
 
68
- return {
69
- stream: stream$.asObservable(),
73
+ return {
74
+ stream: stream$.asObservable(),
70
75
 
71
- timestamp() {
72
- return timestamp;
73
- },
76
+ timestamp() {
77
+ return timestamp;
78
+ },
74
79
 
75
- stop() {
76
- stopAcquire++;
77
- },
80
+ stop() {
81
+ stopAcquire++;
82
+ },
78
83
 
79
- tryContinue,
84
+ tryContinue,
80
85
 
81
- watch<T>(query: ReplayQuery<T>): Observable<{ timestamp: number; payload: T }> {
82
- const storage = get<T>(query);
86
+ watch<T>(
87
+ query: ReplayQuery<T>
88
+ ): Observable<{ timestamp: Timestamp<'ns'>; payload: T }> {
89
+ const storage = get<T>(query);
83
90
 
84
- return defer(() => {
85
- tryContinue();
91
+ return defer(() => {
92
+ tryContinue();
86
93
 
87
- return stream$.pipe(
88
- filter(([cur]) => cur === storage),
89
- map(([, it]) => ({
90
- timestamp: it.timestamp,
91
- payload: it.payload as T
92
- }))
93
- );
94
- });
95
- }
96
- };
97
- });
94
+ return stream$.pipe(
95
+ filter(([cur]) => cur === storage),
96
+ map(([, it]) => ({
97
+ timestamp: it.timestamp,
98
+ payload: it.payload as T
99
+ }))
100
+ );
101
+ });
102
+ }
103
+ };
104
+ }, [useReplayScheduler.name]);
105
+ }
@@ -1,4 +1,5 @@
1
1
  import { between } from '@lib/storage';
2
+ import { Timestamp } from '@lib/use-timestamp';
2
3
 
3
4
  import { useReplayOptions } from './use-replay-options';
4
5
  import { ReplayQuery } from './use-replay-storage-cursor';
@@ -6,7 +7,7 @@ import { ReplayQuery } from './use-replay-storage-cursor';
6
7
  export function useReplayStorageBuffer<T>(storage: ReplayQuery<T>) {
7
8
  const { from, to, limit } = useReplayOptions();
8
9
 
9
- let page: Array<{ timestamp: number; payload: T }> = [];
10
+ let page: Array<{ timestamp: Timestamp<'ns'>; payload: T }> = [];
10
11
  let index = 0;
11
12
  let completed = false;
12
13
  let count = 0;
@@ -1,48 +1,53 @@
1
1
  import { Query, QueryObject } from '@lib/storage';
2
- import { withMemo } from '@lib/with-memo';
2
+ import { useMemo } from '@lib/use-memo';
3
+ import { Timestamp } from '@lib/use-timestamp';
3
4
 
4
5
  import { useReplayStorageBuffer } from './use-replay-storage-buffer';
5
6
 
6
7
  export interface ReplayQuery<V> {
7
8
  query(
8
9
  query: Query<QueryObject> & {
9
- where: { timestamp: { type: 'between'; min: number; max: number } };
10
+ where: {
11
+ timestamp: { type: 'between'; min: Timestamp<'ns'>; max: Timestamp<'ns'> };
12
+ };
10
13
  }
11
- ): Promise<{ timestamp: number; payload: V }[]>;
14
+ ): Promise<{ timestamp: Timestamp<'ns'>; payload: V }[]>;
12
15
  }
13
16
 
14
- export const useReplayStorageCursor = withMemo(() => {
15
- const cursors = Array.of<ReturnType<typeof useReplayStorageBuffer<any>>>();
17
+ export function useReplayStorageCursor() {
18
+ return useMemo(() => {
19
+ const cursors = Array.of<ReturnType<typeof useReplayStorageBuffer<any>>>();
16
20
 
17
- return {
18
- get<T>(query: ReplayQuery<T>) {
19
- const buffer = useReplayStorageBuffer<T>(query);
21
+ return {
22
+ get<T>(query: ReplayQuery<T>) {
23
+ const buffer = useReplayStorageBuffer<T>(query);
20
24
 
21
- cursors.push(buffer);
25
+ cursors.push(buffer);
22
26
 
23
- return buffer;
24
- },
27
+ return buffer;
28
+ },
25
29
 
26
- async cursor() {
27
- let current: ReturnType<typeof useReplayStorageBuffer<any>> | undefined;
30
+ async cursor() {
31
+ let current: ReturnType<typeof useReplayStorageBuffer<any>> | undefined;
28
32
 
29
- for (const cursor of cursors) {
30
- if (cursor.completed()) {
31
- continue;
32
- }
33
+ for (const cursor of cursors) {
34
+ if (cursor.completed()) {
35
+ continue;
36
+ }
33
37
 
34
- if (cursor.size() == 0) {
35
- await cursor.fetchNextPage();
36
- }
38
+ if (cursor.size() == 0) {
39
+ await cursor.fetchNextPage();
40
+ }
37
41
 
38
- if (cursor.peek()) {
39
- if (!current || current.peek().timestamp > cursor.peek().timestamp) {
40
- current = cursor;
42
+ if (cursor.peek()) {
43
+ if (!current || current.peek().timestamp > cursor.peek().timestamp) {
44
+ current = cursor;
45
+ }
41
46
  }
42
47
  }
43
- }
44
48
 
45
- return current;
46
- }
47
- };
48
- });
49
+ return current;
50
+ }
51
+ };
52
+ }, [useReplayStorageCursor.name]);
53
+ }
@@ -13,6 +13,7 @@ import {
13
13
  import { Uri } from '@lib/uri';
14
14
  import { useLogger } from '@lib/use-logger';
15
15
  import { useMemo } from '@lib/use-memo';
16
+ import { ns, Timestamp } from '@lib/use-timestamp';
16
17
 
17
18
  import { useReplayOptions } from './use-replay-options';
18
19
  import { useReplayScheduler } from './use-replay-scheduler';
@@ -20,17 +21,21 @@ import { useReplayScheduler } from './use-replay-scheduler';
20
21
  export type ReplayStorageQuery<V> = {
21
22
  sync: <T extends QueryObjectType<K>, K extends QueryObject>(
22
23
  query: Query<InferQueryObject<T>> & {
23
- where: { timestamp: { type: 'between'; min: number; max: number } };
24
+ where: {
25
+ timestamp: { type: 'between'; min: Timestamp<'ns'>; max: Timestamp<'ns'> };
26
+ };
24
27
  },
25
- storage: { save: (objects: { timestamp: number; payload: V }[]) => Promise<void> }
28
+ storage: {
29
+ save: (objects: { timestamp: Timestamp<'ns'>; payload: V }[]) => Promise<void>;
30
+ }
26
31
  ) => Promise<void>;
27
32
  };
28
33
 
29
34
  const storageIndexObject = Storage.createObject('index://range', {
30
- timestamp: 'number',
35
+ timestamp: 'bigint',
31
36
  uri: 'string',
32
- min: 'number',
33
- max: 'number'
37
+ min: 'bigint',
38
+ max: 'bigint'
34
39
  });
35
40
 
36
41
  export function useReplayStorage<V, P extends Record<string, string | number>>(
@@ -38,16 +43,16 @@ export function useReplayStorage<V, P extends Record<string, string | number>>(
38
43
  { sync }: ReplayStorageQuery<V>
39
44
  ) {
40
45
  const { watch } = useReplayScheduler();
41
- const { info } = useLogger(useReplayStorage.name);
46
+ const { info, error } = useLogger(useReplayStorage.name);
42
47
  const options = useReplayOptions();
43
48
  const storage = useStorage([options.storage]);
44
49
  const storageObjectKey = uri.query;
45
50
  const storageObject = Storage.createObject(storageObjectKey, {
46
- timestamp: 'number',
51
+ timestamp: 'bigint',
47
52
  payload: 'string'
48
53
  });
49
54
 
50
- const id = hashCode(storageObjectKey);
55
+ const id = ns(hashCode(storageObjectKey));
51
56
 
52
57
  return {
53
58
  watch: () =>
@@ -65,26 +70,30 @@ export function useReplayStorage<V, P extends Record<string, string | number>>(
65
70
  if (!index || min < index.min || max > index.max) {
66
71
  info(`fetching replay for ${storageObjectKey} started`);
67
72
 
68
- await sync(query, {
69
- async save(objects) {
70
- await storage.save(
71
- storageObject,
72
- objects.map(it => ({
73
- timestamp: it.timestamp,
74
- payload: JSON.stringify(it.payload)
75
- }))
76
- );
77
- }
78
- });
73
+ try {
74
+ await sync(query, {
75
+ async save(objects) {
76
+ await storage.save(
77
+ storageObject,
78
+ objects.map(it => ({
79
+ timestamp: it.timestamp,
80
+ payload: JSON.stringify(it.payload)
81
+ }))
82
+ );
83
+ }
84
+ });
79
85
 
80
- await storage.save(storageIndexObject, [
81
- {
82
- timestamp: id,
83
- max,
84
- min,
85
- uri: storageObjectKey
86
- }
87
- ]);
86
+ await storage.save(storageIndexObject, [
87
+ {
88
+ timestamp: id,
89
+ max,
90
+ min,
91
+ uri: storageObjectKey
92
+ }
93
+ ]);
94
+ } catch (err) {
95
+ error(`fetching replay for ${storageObjectKey} failed: ${err}`);
96
+ }
88
97
 
89
98
  info(`fetching replay for ${storageObjectKey} finished`);
90
99
  }
@@ -1,9 +1,11 @@
1
1
  import { useSession } from '@lib/session';
2
2
  import { useStorage } from '@lib/storage';
3
- import { withMemo } from '@lib/with-memo';
3
+ import { useMemo } from '@lib/use-memo';
4
4
 
5
- export const useSessionStorage = withMemo(() => {
6
- const { id } = useSession();
5
+ export function useSessionStorage() {
6
+ return useMemo(() => {
7
+ const { id } = useSession();
7
8
 
8
- return useStorage(['session', id]);
9
- });
9
+ return useStorage(['session', id]);
10
+ }, [useSessionStorage.name]);
11
+ }
@@ -1,3 +1,2 @@
1
- export * from '@lib/shared/datetime';
2
1
  export * from '@lib/shared/decimals';
3
2
  export * from '@lib/shared/environment';