@quantform/core 0.4.8 → 0.5.13
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/dist/adapter/adapter-aggregate.d.ts +4 -2
- package/dist/adapter/adapter-aggregate.js +4 -3
- package/dist/adapter/adapter-aggregate.js.map +1 -1
- package/dist/adapter/adapter.d.ts +3 -2
- package/dist/adapter/adapter.js +5 -2
- package/dist/adapter/adapter.js.map +1 -1
- package/dist/adapter/backtester/backtester-adapter.d.ts +1 -1
- package/dist/adapter/backtester/backtester-adapter.js +2 -1
- package/dist/adapter/backtester/backtester-adapter.js.map +1 -1
- package/dist/adapter/backtester/index.js +5 -1
- package/dist/adapter/backtester/index.js.map +1 -1
- package/dist/adapter/index.js +5 -1
- package/dist/adapter/index.js.map +1 -1
- package/dist/adapter/paper/index.js +5 -1
- package/dist/adapter/paper/index.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.d.ts +1 -1
- package/dist/adapter/paper/paper-adapter.js +1 -1
- package/dist/adapter/paper/paper-adapter.js.map +1 -1
- package/dist/adapter/paper/paper-adapter.spec.js +5 -3
- package/dist/adapter/paper/paper-adapter.spec.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-margin-simulator.d.ts +1 -1
- package/dist/adapter/paper/simulator/paper-margin-simulator.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-simulator.d.ts +1 -1
- package/dist/adapter/paper/simulator/paper-simulator.js.map +1 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.d.ts +1 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.js +1 -1
- package/dist/adapter/paper/simulator/paper-spot-simulator.js.map +1 -1
- package/dist/bootstrap.js +31 -15
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/build.d.ts +1 -0
- package/dist/cli/build.js +16 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/dev.d.ts +1 -0
- package/dist/cli/dev.js +17 -0
- package/dist/cli/dev.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +72 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/internal/workspace.d.ts +8 -0
- package/dist/cli/internal/workspace.js +14 -0
- package/dist/cli/internal/workspace.js.map +1 -0
- package/dist/cli/pull.d.ts +1 -0
- package/dist/cli/pull.js +50 -0
- package/dist/cli/pull.js.map +1 -0
- package/dist/cli/run.d.ts +1 -0
- package/dist/cli/run.js +19 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/test.d.ts +1 -0
- package/dist/cli/test.js +37 -0
- package/dist/cli/test.js.map +1 -0
- package/dist/domain/balance.d.ts +4 -3
- package/dist/domain/balance.js +20 -19
- package/dist/domain/balance.js.map +1 -1
- package/dist/domain/balance.spec.js +2 -2
- package/dist/domain/balance.spec.js.map +1 -1
- package/dist/domain/candle.d.ts +4 -2
- package/dist/domain/candle.js +13 -9
- package/dist/domain/candle.js.map +1 -1
- package/dist/domain/candle.spec.js.map +1 -1
- package/dist/domain/component.d.ts +1 -0
- package/dist/domain/index.js +5 -1
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/instrument.d.ts +1 -0
- package/dist/domain/instrument.js +1 -0
- package/dist/domain/instrument.js.map +1 -1
- package/dist/domain/order.d.ts +3 -2
- package/dist/domain/order.js +2 -0
- package/dist/domain/order.js.map +1 -1
- package/dist/domain/orderbook.d.ts +1 -0
- package/dist/domain/orderbook.js +1 -0
- package/dist/domain/orderbook.js.map +1 -1
- package/dist/domain/position.d.ts +1 -0
- package/dist/domain/position.js +1 -0
- package/dist/domain/position.js.map +1 -1
- package/dist/domain/session.d.ts +4 -18
- package/dist/domain/session.js +10 -24
- package/dist/domain/session.js.map +1 -1
- package/dist/domain/statement.js +11 -11
- package/dist/domain/statement.js.map +1 -1
- package/dist/domain/trade.d.ts +2 -1
- package/dist/domain/trade.js +1 -0
- package/dist/domain/trade.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/indicator/atr.js.map +1 -1
- package/dist/indicator/cross.spec.js.map +1 -1
- package/dist/indicator/donchian.js.map +1 -1
- package/dist/indicator/ema.js.map +1 -1
- package/dist/indicator/ema.spec.js.map +1 -1
- package/dist/indicator/envelope.js.map +1 -1
- package/dist/indicator/index.js +5 -1
- package/dist/indicator/index.js.map +1 -1
- package/dist/indicator/macd.js.map +1 -1
- package/dist/indicator/min-max.js.map +1 -1
- package/dist/indicator/rma.js.map +1 -1
- package/dist/indicator/sma.js.map +1 -1
- package/dist/indicator/sma.spec.js.map +1 -1
- package/dist/indicator/swma.js.map +1 -1
- package/dist/indicator/tma.js.map +1 -1
- package/dist/indicator/tma.spec.js.map +1 -1
- package/dist/indicator/trailing.spec.js.map +1 -1
- package/dist/indicator/truerange.js.map +1 -1
- package/dist/indicator/truerange.spec.js.map +1 -1
- package/dist/indicator/window.js.map +1 -1
- package/dist/indicator/wma.js.map +1 -1
- package/dist/indicator/wma.spec.js.map +1 -1
- package/dist/shared/index.d.ts +0 -2
- package/dist/shared/index.js +5 -3
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/policy.spec.js +2 -6
- package/dist/shared/policy.spec.js.map +1 -1
- package/dist/storage/cache.d.ts +9 -0
- package/dist/storage/cache.js +32 -0
- package/dist/storage/cache.js.map +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +6 -1
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/storage.d.ts +7 -0
- package/dist/storage/storage.js +11 -1
- package/dist/storage/storage.js.map +1 -1
- package/dist/store/event/index.js +5 -1
- package/dist/store/event/index.js.map +1 -1
- package/dist/store/event/store-balance.event.spec.js +3 -3
- package/dist/store/event/store-balance.event.spec.js.map +1 -1
- package/dist/store/event/store-candle.event.d.ts +1 -1
- package/dist/store/event/store-candle.event.js.map +1 -1
- package/dist/store/event/store-candle.event.spec.js +1 -1
- package/dist/store/event/store-candle.event.spec.js.map +1 -1
- package/dist/store/event/store-instrument.event.spec.js +1 -1
- package/dist/store/event/store-instrument.event.spec.js.map +1 -1
- package/dist/store/event/store-trade.event.spec.js +2 -2
- package/dist/store/event/store-trade.event.spec.js.map +1 -1
- package/dist/store/index.js +5 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/store.js.map +1 -1
- package/dist/tests/backtester-adapter.spec.js +2 -1
- package/dist/tests/backtester-adapter.spec.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +26 -24
- package/src/adapter/adapter-aggregate.ts +8 -3
- package/src/adapter/adapter.ts +9 -3
- package/src/adapter/backtester/backtester-adapter.ts +3 -1
- package/src/adapter/paper/paper-adapter.spec.ts +5 -3
- package/src/adapter/paper/paper-adapter.ts +1 -1
- package/src/adapter/paper/simulator/paper-margin-simulator.ts +1 -1
- package/src/adapter/paper/simulator/paper-simulator.ts +2 -1
- package/src/adapter/paper/simulator/paper-spot-simulator.ts +2 -2
- package/src/bootstrap.ts +47 -18
- package/src/cli/build.ts +15 -0
- package/src/cli/dev.ts +18 -0
- package/src/cli/index.ts +81 -0
- package/src/cli/internal/workspace.ts +18 -0
- package/src/cli/pull.ts +67 -0
- package/src/cli/run.ts +22 -0
- package/src/cli/test.ts +50 -0
- package/src/domain/balance.spec.ts +2 -2
- package/src/domain/balance.ts +20 -19
- package/src/domain/candle.spec.ts +1 -0
- package/src/domain/candle.ts +20 -10
- package/src/domain/component.ts +1 -0
- package/src/domain/instrument.ts +1 -0
- package/src/domain/order.ts +3 -1
- package/src/domain/orderbook.ts +1 -0
- package/src/domain/position.ts +2 -0
- package/src/domain/session.ts +25 -72
- package/src/domain/statement.ts +13 -12
- package/src/domain/trade.ts +2 -1
- package/src/index.ts +0 -1
- package/src/indicator/atr.ts +1 -0
- package/src/indicator/cross.spec.ts +1 -0
- package/src/indicator/donchian.ts +1 -0
- package/src/indicator/ema.spec.ts +1 -0
- package/src/indicator/ema.ts +1 -0
- package/src/indicator/envelope.ts +1 -0
- package/src/indicator/macd.ts +1 -0
- package/src/indicator/min-max.ts +1 -0
- package/src/indicator/rma.ts +1 -0
- package/src/indicator/sma.spec.ts +1 -0
- package/src/indicator/sma.ts +1 -0
- package/src/indicator/swma.ts +1 -0
- package/src/indicator/tma.spec.ts +1 -0
- package/src/indicator/tma.ts +1 -0
- package/src/indicator/trailing.spec.ts +1 -0
- package/src/indicator/truerange.spec.ts +1 -0
- package/src/indicator/truerange.ts +1 -0
- package/src/indicator/window.ts +1 -0
- package/src/indicator/wma.spec.ts +1 -0
- package/src/indicator/wma.ts +1 -0
- package/src/shared/index.ts +0 -2
- package/src/shared/policy.spec.ts +2 -6
- package/src/storage/cache.ts +35 -0
- package/src/storage/index.ts +1 -0
- package/src/storage/storage.ts +15 -0
- package/src/store/event/store-balance.event.spec.ts +3 -3
- package/src/store/event/store-candle.event.spec.ts +1 -1
- package/src/store/event/store-candle.event.ts +2 -2
- package/src/store/event/store-instrument.event.spec.ts +1 -1
- package/src/store/event/store-trade.event.spec.ts +2 -2
- package/src/store/store.ts +1 -0
- package/src/tests/backtester-adapter.spec.ts +3 -2
- package/tsconfig.json +2 -2
- package/dist/ipc.d.ts +0 -33
- package/dist/ipc.js +0 -244
- package/dist/ipc.js.map +0 -1
- package/dist/ipc.spec.d.ts +0 -1
- package/dist/ipc.spec.js +0 -57
- package/dist/ipc.spec.js.map +0 -1
- package/dist/shared/task.d.ts +0 -6
- package/dist/shared/task.js +0 -25
- package/dist/shared/task.js.map +0 -1
- package/dist/shared/worker.d.ts +0 -10
- package/dist/shared/worker.js +0 -46
- package/dist/shared/worker.js.map +0 -1
- package/dist/shared/worker.spec.d.ts +0 -1
- package/dist/shared/worker.spec.js +0 -18
- package/dist/shared/worker.spec.js.map +0 -1
- package/jestconfig.json +0 -11
- package/src/ipc.spec.ts +0 -73
- package/src/ipc.ts +0 -321
- package/src/shared/task.ts +0 -30
- package/src/shared/worker.spec.ts +0 -25
- package/src/shared/worker.ts +0 -55
package/src/ipc.ts
DELETED
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'events';
|
|
2
|
-
import { join } from 'path';
|
|
3
|
-
import { Observable } from 'rxjs';
|
|
4
|
-
import { BacktesterStreamer } from './adapter/backtester';
|
|
5
|
-
import { Bootstrap } from './bootstrap';
|
|
6
|
-
import { instrumentOf, Session, SessionDescriptor } from './domain';
|
|
7
|
-
import { Logger, runTask } from './shared';
|
|
8
|
-
import { event, handler, Topic } from './shared/topic';
|
|
9
|
-
import minimist = require('minimist');
|
|
10
|
-
import dotenv = require('dotenv');
|
|
11
|
-
|
|
12
|
-
// force to load environment variables from .env file if this file imported.
|
|
13
|
-
dotenv.config();
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Base command/query interface for IPC communication.
|
|
17
|
-
*/
|
|
18
|
-
export interface IpcCommand {
|
|
19
|
-
/**
|
|
20
|
-
* The command name to handle.
|
|
21
|
-
*/
|
|
22
|
-
type;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Command to start a new live session.
|
|
27
|
-
*/
|
|
28
|
-
@event
|
|
29
|
-
export class IpcLiveCommand implements IpcCommand {
|
|
30
|
-
type = 'live';
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* The optional session identifier.
|
|
34
|
-
*/
|
|
35
|
-
id?: number;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Command to start a new paper session.
|
|
40
|
-
*/
|
|
41
|
-
@event
|
|
42
|
-
export class IpcPaperCommand implements IpcCommand {
|
|
43
|
-
type = 'paper';
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* The optional session identifier.
|
|
47
|
-
*/
|
|
48
|
-
id?: number;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Command to start a new backtest session.
|
|
53
|
-
*/
|
|
54
|
-
@event
|
|
55
|
-
export class IpcBacktestCommand implements IpcCommand {
|
|
56
|
-
type = 'backtest';
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* Start date of the feed in unix timestamp.
|
|
60
|
-
*/
|
|
61
|
-
from?: number;
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Due date of the feed in unix timestamp.
|
|
65
|
-
*/
|
|
66
|
-
to?: number;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Feeds specific session descriptor with instrument data.
|
|
71
|
-
*/
|
|
72
|
-
@event
|
|
73
|
-
export class IpcFeedCommand implements IpcCommand {
|
|
74
|
-
type = 'feed';
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Instrument to feed.
|
|
78
|
-
*/
|
|
79
|
-
instrument: string;
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Start date of the feed in unix timestamp.
|
|
83
|
-
*/
|
|
84
|
-
from?: number;
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Due date of the feed in unix timestamp.
|
|
88
|
-
*/
|
|
89
|
-
to?: number;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Executes user task defined in quantform.ts file.
|
|
94
|
-
*/
|
|
95
|
-
@event
|
|
96
|
-
export class IpcTaskCommand implements IpcCommand {
|
|
97
|
-
type = 'task';
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Name of the task to execute.
|
|
101
|
-
*/
|
|
102
|
-
taskName: string;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Stores current session instance.
|
|
107
|
-
*/
|
|
108
|
-
class IpcSessionAccessor {
|
|
109
|
-
session: Session;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export declare type IpcSessionDescriptor = SessionDescriptor & { ipcSub?: EventEmitter };
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Inter process communication handler.
|
|
116
|
-
*/
|
|
117
|
-
class IpcHandler extends Topic<{ type: string }, IpcSessionAccessor> {
|
|
118
|
-
constructor(
|
|
119
|
-
private readonly bootstrap: Bootstrap,
|
|
120
|
-
private readonly ipcSub?: EventEmitter
|
|
121
|
-
) {
|
|
122
|
-
super();
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* @see IpcLiveCommand
|
|
127
|
-
*/
|
|
128
|
-
@handler(IpcLiveCommand)
|
|
129
|
-
async onLiveMode(command: IpcLiveCommand, accessor: IpcSessionAccessor) {
|
|
130
|
-
accessor.session = this.bootstrap.useSessionId(command.id).live();
|
|
131
|
-
|
|
132
|
-
this.emit({
|
|
133
|
-
type: 'live:started',
|
|
134
|
-
session: accessor.session.descriptor?.id
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
await accessor.session.awake(this.describe());
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* @see IpcPaperCommand
|
|
142
|
-
*/
|
|
143
|
-
@handler(IpcPaperCommand)
|
|
144
|
-
async onPaperMode(command: IpcPaperCommand, accessor: IpcSessionAccessor) {
|
|
145
|
-
accessor.session = this.bootstrap.useSessionId(command.id).paper();
|
|
146
|
-
|
|
147
|
-
this.emit({
|
|
148
|
-
type: 'paper:started',
|
|
149
|
-
session: accessor.session.descriptor?.id
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
await accessor.session.awake(this.describe());
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* @see IpcBacktestCommand
|
|
157
|
-
*/
|
|
158
|
-
@handler(IpcBacktestCommand)
|
|
159
|
-
onBacktestMode(command: IpcBacktestCommand, accessor: IpcSessionAccessor) {
|
|
160
|
-
this.bootstrap.useBacktestPeriod(command.from, command.to).backtest();
|
|
161
|
-
const { from, to } = this.bootstrap.descriptor.options.backtester;
|
|
162
|
-
|
|
163
|
-
return new Promise<void>(async resolve => {
|
|
164
|
-
const [session, streamer] = this.bootstrap.backtest({
|
|
165
|
-
onBacktestStarted: (streamer: BacktesterStreamer) => {
|
|
166
|
-
this.emit({
|
|
167
|
-
type: 'backtest:started',
|
|
168
|
-
session: session.descriptor?.id,
|
|
169
|
-
timestamp: streamer.timestamp,
|
|
170
|
-
from,
|
|
171
|
-
to
|
|
172
|
-
});
|
|
173
|
-
},
|
|
174
|
-
onBacktestUpdated: (streamer: BacktesterStreamer) => {
|
|
175
|
-
this.emit({
|
|
176
|
-
type: 'backtest:updated',
|
|
177
|
-
session: session.descriptor?.id,
|
|
178
|
-
timestamp: streamer.timestamp,
|
|
179
|
-
from,
|
|
180
|
-
to
|
|
181
|
-
});
|
|
182
|
-
},
|
|
183
|
-
onBacktestCompleted: async (streamer: BacktesterStreamer) => {
|
|
184
|
-
await accessor.session.dispose();
|
|
185
|
-
|
|
186
|
-
this.emit({
|
|
187
|
-
type: 'backtest:completed',
|
|
188
|
-
session: session.descriptor?.id,
|
|
189
|
-
timestamp: streamer.timestamp,
|
|
190
|
-
from,
|
|
191
|
-
to
|
|
192
|
-
});
|
|
193
|
-
|
|
194
|
-
resolve();
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
accessor.session = session;
|
|
199
|
-
|
|
200
|
-
await accessor.session.awake(this.describe());
|
|
201
|
-
await streamer.tryContinue().catch(it => Logger.error(it));
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* @see IpcFeedCommand
|
|
207
|
-
*/
|
|
208
|
-
@handler(IpcFeedCommand)
|
|
209
|
-
async onFeed(command: IpcFeedCommand, accessor: IpcSessionAccessor) {
|
|
210
|
-
accessor.session = accessor.session ?? this.bootstrap.paper();
|
|
211
|
-
const instrument = instrumentOf(command.instrument);
|
|
212
|
-
const { feed } = accessor.session.descriptor;
|
|
213
|
-
|
|
214
|
-
await accessor.session.awake(undefined);
|
|
215
|
-
|
|
216
|
-
this.emit({ type: 'feed:started' });
|
|
217
|
-
|
|
218
|
-
await accessor.session.aggregate.feed({
|
|
219
|
-
instrument,
|
|
220
|
-
from: command.from,
|
|
221
|
-
to: command.to,
|
|
222
|
-
destination: feed,
|
|
223
|
-
callback: timestamp =>
|
|
224
|
-
this.emit({
|
|
225
|
-
type: 'feed:updated',
|
|
226
|
-
timestamp,
|
|
227
|
-
from: command.from,
|
|
228
|
-
to: command.to
|
|
229
|
-
})
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
this.emit({ type: 'feed:completed' });
|
|
233
|
-
|
|
234
|
-
await accessor.session.dispose();
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/**
|
|
238
|
-
* @see IpcTaskCommand
|
|
239
|
-
*/
|
|
240
|
-
@handler(IpcTaskCommand)
|
|
241
|
-
async onTask(query: IpcTaskCommand, accessor: IpcSessionAccessor) {
|
|
242
|
-
accessor.session = accessor.session ?? this.bootstrap.live();
|
|
243
|
-
|
|
244
|
-
await accessor.session.awake(undefined);
|
|
245
|
-
|
|
246
|
-
this.emit({ type: 'task:started', taskName: query.taskName });
|
|
247
|
-
|
|
248
|
-
let result = undefined;
|
|
249
|
-
|
|
250
|
-
try {
|
|
251
|
-
result = await runTask(query.taskName, accessor.session);
|
|
252
|
-
} catch (e) {
|
|
253
|
-
result = e;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
this.emit({ type: 'task:completed', taskName: query.taskName, result });
|
|
257
|
-
|
|
258
|
-
await accessor.session.dispose();
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
describe(): (session: Session) => Observable<any> {
|
|
262
|
-
const pkg = require(join(process.cwd(), 'package.json'));
|
|
263
|
-
const describe = require(join(process.cwd(), pkg.main))?.default;
|
|
264
|
-
|
|
265
|
-
if (describe instanceof Function) {
|
|
266
|
-
return describe;
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
return undefined;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Sends a message to parent process.
|
|
274
|
-
*/
|
|
275
|
-
private emit(message: any) {
|
|
276
|
-
if (process.send) {
|
|
277
|
-
process.send(message);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
this.ipcSub?.emit('message', message);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
/**
|
|
285
|
-
* Starts new managed session and subscribes to parent process messages.
|
|
286
|
-
* @param descriptor session descriptor.
|
|
287
|
-
* @param commands collection of commands to execute before session is started.
|
|
288
|
-
* @returns new session.
|
|
289
|
-
*/
|
|
290
|
-
export async function run(
|
|
291
|
-
descriptor: IpcSessionDescriptor,
|
|
292
|
-
...commands: IpcCommand[]
|
|
293
|
-
): Promise<Session> {
|
|
294
|
-
const handler = new IpcHandler(new Bootstrap(descriptor), descriptor.ipcSub);
|
|
295
|
-
const accessor = new IpcSessionAccessor();
|
|
296
|
-
const argv = minimist(process.argv.slice(2));
|
|
297
|
-
|
|
298
|
-
if (argv.command) {
|
|
299
|
-
const json = Buffer.from(argv.command, 'base64').toString('utf-8');
|
|
300
|
-
|
|
301
|
-
commands.push(JSON.parse(json));
|
|
302
|
-
} else {
|
|
303
|
-
if (!commands.length) {
|
|
304
|
-
commands.push(new IpcPaperCommand());
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
for (const command of commands) {
|
|
309
|
-
await handler.dispatch(command, accessor);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
process.on('message', async (request: any) => {
|
|
313
|
-
const response = await handler.dispatch(request, accessor);
|
|
314
|
-
|
|
315
|
-
if (response) {
|
|
316
|
-
process.send(response);
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
|
|
320
|
-
return accessor.session;
|
|
321
|
-
}
|
package/src/shared/task.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { lastValueFrom, Observable } from 'rxjs';
|
|
2
|
-
import { Session } from './../domain';
|
|
3
|
-
|
|
4
|
-
declare type Task = (session: Session) => Observable<any> | Promise<any> | any;
|
|
5
|
-
|
|
6
|
-
const tasks: Record<string, Task> = {};
|
|
7
|
-
|
|
8
|
-
export function task(name: string, fn: Task) {
|
|
9
|
-
tasks[name] = fn;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function runTask(name: string, session: Session): Promise<void> {
|
|
13
|
-
const task = tasks[name];
|
|
14
|
-
|
|
15
|
-
if (!task) {
|
|
16
|
-
throw new Error('Unknown task: ' + name);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const result = tasks[name](session);
|
|
20
|
-
|
|
21
|
-
if (result instanceof Observable) {
|
|
22
|
-
return lastValueFrom(result);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (result instanceof Promise) {
|
|
26
|
-
return await result;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Worker } from './worker';
|
|
2
|
-
|
|
3
|
-
describe('worker tests', () => {
|
|
4
|
-
test('event handler tests', async () => {
|
|
5
|
-
const sut = new Worker();
|
|
6
|
-
|
|
7
|
-
let started = 0,
|
|
8
|
-
completed = 0;
|
|
9
|
-
|
|
10
|
-
sut.addListener('started', () => started++);
|
|
11
|
-
sut.addListener('completed', () => completed++);
|
|
12
|
-
|
|
13
|
-
sut.enqueue(
|
|
14
|
-
() =>
|
|
15
|
-
new Promise<void>(resolve => {
|
|
16
|
-
setTimeout(() => resolve(), 1);
|
|
17
|
-
})
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
await sut.wait();
|
|
21
|
-
|
|
22
|
-
expect(started).toBe(1);
|
|
23
|
-
expect(completed).toBe(1);
|
|
24
|
-
});
|
|
25
|
-
});
|
package/src/shared/worker.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'stream';
|
|
2
|
-
|
|
3
|
-
export type Work = () => Promise<void>;
|
|
4
|
-
|
|
5
|
-
export class Worker extends EventEmitter {
|
|
6
|
-
private readonly queue = new Array<Work>();
|
|
7
|
-
private promise: Promise<void>;
|
|
8
|
-
|
|
9
|
-
enqueue(job: Work) {
|
|
10
|
-
this.queue.push(job);
|
|
11
|
-
|
|
12
|
-
this.tryNext();
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
wait(): Promise<void> {
|
|
16
|
-
if (!this.queue.length) {
|
|
17
|
-
return Promise.resolve();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return new Promise<void>(resolve => {
|
|
21
|
-
const listener = () => {
|
|
22
|
-
if (this.queue.length) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
this.removeListener('completed', listener);
|
|
27
|
-
|
|
28
|
-
resolve();
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
this.addListener('completed', listener);
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private tryNext() {
|
|
36
|
-
if (!this.queue.length) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
if (!this.promise) {
|
|
41
|
-
const queued = this.queue[0];
|
|
42
|
-
|
|
43
|
-
this.emit('started');
|
|
44
|
-
|
|
45
|
-
this.promise = queued().finally(() => {
|
|
46
|
-
this.queue.shift();
|
|
47
|
-
|
|
48
|
-
this.promise = null;
|
|
49
|
-
|
|
50
|
-
this.emit('completed');
|
|
51
|
-
this.tryNext();
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|