@solncebro/market-data-feeder-lib 0.1.0
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/CHANGELOG.md +10 -0
- package/README.md +60 -0
- package/dist/client/dataStaleness.d.ts +18 -0
- package/dist/client/dataStaleness.d.ts.map +1 -0
- package/dist/client/dataStaleness.js +23 -0
- package/dist/client/dataStaleness.js.map +1 -0
- package/dist/client/marketDataClient.d.ts +47 -0
- package/dist/client/marketDataClient.d.ts.map +1 -0
- package/dist/client/marketDataClient.js +262 -0
- package/dist/client/marketDataClient.js.map +1 -0
- package/dist/client/marketDataClient.types.d.ts +15 -0
- package/dist/client/marketDataClient.types.d.ts.map +1 -0
- package/dist/client/marketDataClient.types.js +2 -0
- package/dist/client/marketDataClient.types.js.map +1 -0
- package/dist/client/marketDataSource.types.d.ts +27 -0
- package/dist/client/marketDataSource.types.d.ts.map +1 -0
- package/dist/client/marketDataSource.types.js +2 -0
- package/dist/client/marketDataSource.types.js.map +1 -0
- package/dist/client/mirrorStore.d.ts +29 -0
- package/dist/client/mirrorStore.d.ts.map +1 -0
- package/dist/client/mirrorStore.js +119 -0
- package/dist/client/mirrorStore.js.map +1 -0
- package/dist/client/mirrorStore.types.d.ts +20 -0
- package/dist/client/mirrorStore.types.d.ts.map +1 -0
- package/dist/client/mirrorStore.types.js +2 -0
- package/dist/client/mirrorStore.types.js.map +1 -0
- package/dist/domain/constants.d.ts +12 -0
- package/dist/domain/constants.d.ts.map +1 -0
- package/dist/domain/constants.js +47 -0
- package/dist/domain/constants.js.map +1 -0
- package/dist/domain/events.types.d.ts +14 -0
- package/dist/domain/events.types.d.ts.map +1 -0
- package/dist/domain/events.types.js +2 -0
- package/dist/domain/events.types.js.map +1 -0
- package/dist/domain/feederSource.types.d.ts +44 -0
- package/dist/domain/feederSource.types.d.ts.map +1 -0
- package/dist/domain/feederSource.types.js +2 -0
- package/dist/domain/feederSource.types.js.map +1 -0
- package/dist/domain/managedSource.types.d.ts +13 -0
- package/dist/domain/managedSource.types.d.ts.map +1 -0
- package/dist/domain/managedSource.types.js +2 -0
- package/dist/domain/managedSource.types.js.map +1 -0
- package/dist/domain/marketData.types.d.ts +29 -0
- package/dist/domain/marketData.types.d.ts.map +1 -0
- package/dist/domain/marketData.types.js +2 -0
- package/dist/domain/marketData.types.js.map +1 -0
- package/dist/domain/snapshot.types.d.ts +10 -0
- package/dist/domain/snapshot.types.d.ts.map +1 -0
- package/dist/domain/snapshot.types.js +2 -0
- package/dist/domain/snapshot.types.js.map +1 -0
- package/dist/domain/subscription.types.d.ts +11 -0
- package/dist/domain/subscription.types.d.ts.map +1 -0
- package/dist/domain/subscription.types.js +2 -0
- package/dist/domain/subscription.types.js.map +1 -0
- package/dist/embedded/embeddedMarketDataSource.d.ts +29 -0
- package/dist/embedded/embeddedMarketDataSource.d.ts.map +1 -0
- package/dist/embedded/embeddedMarketDataSource.js +121 -0
- package/dist/embedded/embeddedMarketDataSource.js.map +1 -0
- package/dist/embedded/embeddedMarketDataSource.types.d.ts +17 -0
- package/dist/embedded/embeddedMarketDataSource.types.d.ts.map +1 -0
- package/dist/embedded/embeddedMarketDataSource.types.js +2 -0
- package/dist/embedded/embeddedMarketDataSource.types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/clientMessageValidation.d.ts +3 -0
- package/dist/protocol/clientMessageValidation.d.ts.map +1 -0
- package/dist/protocol/clientMessageValidation.js +41 -0
- package/dist/protocol/clientMessageValidation.js.map +1 -0
- package/dist/protocol/codec.d.ts +5 -0
- package/dist/protocol/codec.d.ts.map +1 -0
- package/dist/protocol/codec.js +40 -0
- package/dist/protocol/codec.js.map +1 -0
- package/dist/protocol/messages.types.d.ts +65 -0
- package/dist/protocol/messages.types.d.ts.map +1 -0
- package/dist/protocol/messages.types.js +2 -0
- package/dist/protocol/messages.types.js.map +1 -0
- package/dist/source/gapRepair.d.ts +15 -0
- package/dist/source/gapRepair.d.ts.map +1 -0
- package/dist/source/gapRepair.js +40 -0
- package/dist/source/gapRepair.js.map +1 -0
- package/dist/source/indicators.d.ts +5 -0
- package/dist/source/indicators.d.ts.map +1 -0
- package/dist/source/indicators.js +21 -0
- package/dist/source/indicators.js.map +1 -0
- package/dist/source/marketDataManager.d.ts +94 -0
- package/dist/source/marketDataManager.d.ts.map +1 -0
- package/dist/source/marketDataManager.js +930 -0
- package/dist/source/marketDataManager.js.map +1 -0
- package/dist/source/massStale.d.ts +10 -0
- package/dist/source/massStale.d.ts.map +1 -0
- package/dist/source/massStale.js +8 -0
- package/dist/source/massStale.js.map +1 -0
- package/dist/source/symbolListDelta.d.ts +4 -0
- package/dist/source/symbolListDelta.d.ts.map +1 -0
- package/dist/source/symbolListDelta.js +9 -0
- package/dist/source/symbolListDelta.js.map +1 -0
- package/dist/source/symbolListDelta.types.d.ts +10 -0
- package/dist/source/symbolListDelta.types.d.ts.map +1 -0
- package/dist/source/symbolListDelta.types.js +2 -0
- package/dist/source/symbolListDelta.types.js.map +1 -0
- package/dist/source/symbolRemovalGuard.d.ts +14 -0
- package/dist/source/symbolRemovalGuard.d.ts.map +1 -0
- package/dist/source/symbolRemovalGuard.js +19 -0
- package/dist/source/symbolRemovalGuard.js.map +1 -0
- package/dist/utils/intervalScheduler.d.ts +16 -0
- package/dist/utils/intervalScheduler.d.ts.map +1 -0
- package/dist/utils/intervalScheduler.js +42 -0
- package/dist/utils/intervalScheduler.js.map +1 -0
- package/dist/utils/timeout.d.ts +3 -0
- package/dist/utils/timeout.d.ts.map +1 -0
- package/dist/utils/timeout.js +18 -0
- package/dist/utils/timeout.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ExchangeNameEnum } from '@solncebro/trade-engine';
|
|
2
|
+
import type { KlineInterval } from '../domain/marketData.types.js';
|
|
3
|
+
import type { FeederSource } from '../domain/feederSource.types.js';
|
|
4
|
+
interface EmbeddedMarketDataSourceArgs {
|
|
5
|
+
source: FeederSource;
|
|
6
|
+
onNotify?: (message: string) => void;
|
|
7
|
+
teardownConnection?: () => Promise<void> | void;
|
|
8
|
+
}
|
|
9
|
+
interface CreateEmbeddedMarketDataSourceArgs {
|
|
10
|
+
exchangeName: ExchangeNameEnum;
|
|
11
|
+
exchangeApiKey: string;
|
|
12
|
+
exchangeSecret: string;
|
|
13
|
+
interval: KlineInterval;
|
|
14
|
+
onNotify?: (message: string) => void;
|
|
15
|
+
}
|
|
16
|
+
export type { CreateEmbeddedMarketDataSourceArgs, EmbeddedMarketDataSourceArgs };
|
|
17
|
+
//# sourceMappingURL=embeddedMarketDataSource.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddedMarketDataSource.types.d.ts","sourceRoot":"","sources":["../../src/embedded/embeddedMarketDataSource.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,UAAU,4BAA4B;IACpC,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjD;AAED,UAAU,kCAAkC;IAC1C,YAAY,EAAE,gBAAgB,CAAC;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAED,YAAY,EAAE,kCAAkC,EAAE,4BAA4B,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddedMarketDataSource.types.js","sourceRoot":"","sources":["../../src/embedded/embeddedMarketDataSource.types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export * from './domain/constants.js';
|
|
2
|
+
export * from './domain/events.types.js';
|
|
3
|
+
export * from './domain/feederSource.types.js';
|
|
4
|
+
export * from './domain/managedSource.types.js';
|
|
5
|
+
export * from './domain/marketData.types.js';
|
|
6
|
+
export * from './domain/snapshot.types.js';
|
|
7
|
+
export * from './domain/subscription.types.js';
|
|
8
|
+
export * from './protocol/clientMessageValidation.js';
|
|
9
|
+
export * from './protocol/codec.js';
|
|
10
|
+
export * from './protocol/messages.types.js';
|
|
11
|
+
export * from './source/gapRepair.js';
|
|
12
|
+
export * from './source/indicators.js';
|
|
13
|
+
export * from './source/marketDataManager.js';
|
|
14
|
+
export * from './source/massStale.js';
|
|
15
|
+
export * from './source/symbolListDelta.js';
|
|
16
|
+
export * from './source/symbolListDelta.types.js';
|
|
17
|
+
export * from './source/symbolRemovalGuard.js';
|
|
18
|
+
export * from './client/dataStaleness.js';
|
|
19
|
+
export * from './client/marketDataClient.js';
|
|
20
|
+
export * from './client/marketDataClient.types.js';
|
|
21
|
+
export * from './client/marketDataSource.types.js';
|
|
22
|
+
export * from './client/mirrorStore.js';
|
|
23
|
+
export * from './client/mirrorStore.types.js';
|
|
24
|
+
export * from './embedded/embeddedMarketDataSource.js';
|
|
25
|
+
export * from './embedded/embeddedMarketDataSource.types.js';
|
|
26
|
+
export * from './utils/intervalScheduler.js';
|
|
27
|
+
export * from './utils/timeout.js';
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// Pass-through surface on purpose: the feeder server (market-data-feeder) consumes these modules
|
|
2
|
+
// directly — a hand-picked export list would silently lag behind what it actually needs.
|
|
3
|
+
export * from './domain/constants.js';
|
|
4
|
+
export * from './domain/events.types.js';
|
|
5
|
+
export * from './domain/feederSource.types.js';
|
|
6
|
+
export * from './domain/managedSource.types.js';
|
|
7
|
+
export * from './domain/marketData.types.js';
|
|
8
|
+
export * from './domain/snapshot.types.js';
|
|
9
|
+
export * from './domain/subscription.types.js';
|
|
10
|
+
export * from './protocol/clientMessageValidation.js';
|
|
11
|
+
export * from './protocol/codec.js';
|
|
12
|
+
export * from './protocol/messages.types.js';
|
|
13
|
+
export * from './source/gapRepair.js';
|
|
14
|
+
export * from './source/indicators.js';
|
|
15
|
+
export * from './source/marketDataManager.js';
|
|
16
|
+
export * from './source/massStale.js';
|
|
17
|
+
export * from './source/symbolListDelta.js';
|
|
18
|
+
export * from './source/symbolListDelta.types.js';
|
|
19
|
+
export * from './source/symbolRemovalGuard.js';
|
|
20
|
+
export * from './client/dataStaleness.js';
|
|
21
|
+
export * from './client/marketDataClient.js';
|
|
22
|
+
export * from './client/marketDataClient.types.js';
|
|
23
|
+
export * from './client/marketDataSource.types.js';
|
|
24
|
+
export * from './client/mirrorStore.js';
|
|
25
|
+
export * from './client/mirrorStore.types.js';
|
|
26
|
+
export * from './embedded/embeddedMarketDataSource.js';
|
|
27
|
+
export * from './embedded/embeddedMarketDataSource.types.js';
|
|
28
|
+
export * from './utils/intervalScheduler.js';
|
|
29
|
+
export * from './utils/timeout.js';
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,yFAAyF;AACzF,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAClD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wCAAwC,CAAC;AACvD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMessageValidation.d.ts","sourceRoot":"","sources":["../../src/protocol/clientMessageValidation.ts"],"names":[],"mappings":"AAiCA,iBAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAkBnD;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isKnownInterval } from '../domain/constants.js';
|
|
2
|
+
const MAX_SUBSCRIBE_SYMBOL_COUNT = 5000;
|
|
3
|
+
const SYMBOL_PATTERN = /^[A-Z0-9]{1,30}$/;
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === 'object' && value !== null;
|
|
6
|
+
}
|
|
7
|
+
function isValidSymbol(value) {
|
|
8
|
+
return typeof value === 'string' && SYMBOL_PATTERN.test(value);
|
|
9
|
+
}
|
|
10
|
+
function isValidScope(scope) {
|
|
11
|
+
if (!isRecord(scope)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
if (scope.kind === 'all') {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
if (scope.kind !== 'symbols') {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (!Array.isArray(scope.symbolList) || scope.symbolList.length === 0 || scope.symbolList.length > MAX_SUBSCRIBE_SYMBOL_COUNT) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return scope.symbolList.every(isValidSymbol);
|
|
24
|
+
}
|
|
25
|
+
function isValidSubscribe(message) {
|
|
26
|
+
if (!isRecord(message)) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
if (message.type !== 'subscribe') {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
if (typeof message.interval !== 'string' || !isKnownInterval(message.interval)) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (!Array.isArray(message.events)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return isValidScope(message.scope);
|
|
39
|
+
}
|
|
40
|
+
export { isValidSubscribe };
|
|
41
|
+
//# sourceMappingURL=clientMessageValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientMessageValidation.js","sourceRoot":"","sources":["../../src/protocol/clientMessageValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,0BAA0B,GAAG,IAAI,CAAC;AACxC,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,0BAA0B,EAAE,CAAC;QAC9H,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAgB;IACxC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FeederMessage } from './messages.types.js';
|
|
2
|
+
declare function encodeMessage(message: FeederMessage): string;
|
|
3
|
+
declare function decodeMessage(raw: string): FeederMessage | null;
|
|
4
|
+
export { decodeMessage, encodeMessage };
|
|
5
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/protocol/codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,iBAAS,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAErD;AAgBD,iBAAS,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAcxD;AAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const KNOWN_TYPE_SET = new Set([
|
|
2
|
+
'subscribe',
|
|
3
|
+
'unsubscribe',
|
|
4
|
+
'snapshot',
|
|
5
|
+
'klineClosed',
|
|
6
|
+
'klineUpdated',
|
|
7
|
+
'klineUpdatedTick',
|
|
8
|
+
'symbolAdded',
|
|
9
|
+
'symbolRemoved',
|
|
10
|
+
'volume24h',
|
|
11
|
+
'heartbeat',
|
|
12
|
+
]);
|
|
13
|
+
function encodeMessage(message) {
|
|
14
|
+
return JSON.stringify(message);
|
|
15
|
+
}
|
|
16
|
+
function isFeederMessage(value) {
|
|
17
|
+
if (typeof value !== 'object' || value === null) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (!('type' in value)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const messageType = value.type;
|
|
24
|
+
return typeof messageType === 'string' && KNOWN_TYPE_SET.has(messageType);
|
|
25
|
+
}
|
|
26
|
+
function decodeMessage(raw) {
|
|
27
|
+
let parsed;
|
|
28
|
+
try {
|
|
29
|
+
parsed = JSON.parse(raw);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
if (!isFeederMessage(parsed)) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
return parsed;
|
|
38
|
+
}
|
|
39
|
+
export { decodeMessage, encodeMessage };
|
|
40
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/protocol/codec.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAS;IAC1D,WAAW;IACX,aAAa;IACb,UAAU;IACV,aAAa;IACb,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,eAAe;IACf,WAAW;IACX,WAAW;CACZ,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,OAAsB;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IAE/B,OAAO,OAAO,WAAW,KAAK,QAAQ,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Kline, KlineInterval, MaValues } from '../domain/marketData.types.js';
|
|
2
|
+
import type { FeedEventName, SubscriptionScope } from '../domain/subscription.types.js';
|
|
3
|
+
import type { MarketDataSnapshotEntry } from '../domain/snapshot.types.js';
|
|
4
|
+
interface SubscribeMessage {
|
|
5
|
+
type: 'subscribe';
|
|
6
|
+
interval: KlineInterval;
|
|
7
|
+
scope: SubscriptionScope;
|
|
8
|
+
events: FeedEventName[];
|
|
9
|
+
wantMa: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface UnsubscribeMessage {
|
|
12
|
+
type: 'unsubscribe';
|
|
13
|
+
interval: KlineInterval;
|
|
14
|
+
scope: SubscriptionScope;
|
|
15
|
+
}
|
|
16
|
+
interface SnapshotMessage {
|
|
17
|
+
type: 'snapshot';
|
|
18
|
+
interval: KlineInterval;
|
|
19
|
+
entryList: MarketDataSnapshotEntry[];
|
|
20
|
+
isFinal: boolean;
|
|
21
|
+
}
|
|
22
|
+
interface KlineClosedMessage {
|
|
23
|
+
type: 'klineClosed';
|
|
24
|
+
interval: KlineInterval;
|
|
25
|
+
symbol: string;
|
|
26
|
+
kline: Kline;
|
|
27
|
+
maValues: MaValues;
|
|
28
|
+
}
|
|
29
|
+
interface KlineUpdatedMessage {
|
|
30
|
+
type: 'klineUpdated';
|
|
31
|
+
interval: KlineInterval;
|
|
32
|
+
symbol: string;
|
|
33
|
+
kline: Kline;
|
|
34
|
+
maValues: MaValues;
|
|
35
|
+
}
|
|
36
|
+
interface KlineUpdatedTickMessage {
|
|
37
|
+
type: 'klineUpdatedTick';
|
|
38
|
+
interval: KlineInterval;
|
|
39
|
+
symbol: string;
|
|
40
|
+
kline: Kline;
|
|
41
|
+
}
|
|
42
|
+
interface SymbolAddedMessage {
|
|
43
|
+
type: 'symbolAdded';
|
|
44
|
+
interval: KlineInterval;
|
|
45
|
+
entry: MarketDataSnapshotEntry;
|
|
46
|
+
}
|
|
47
|
+
interface SymbolRemovedMessage {
|
|
48
|
+
type: 'symbolRemoved';
|
|
49
|
+
interval: KlineInterval;
|
|
50
|
+
symbol: string;
|
|
51
|
+
}
|
|
52
|
+
interface Volume24hMessage {
|
|
53
|
+
type: 'volume24h';
|
|
54
|
+
interval: KlineInterval;
|
|
55
|
+
symbol: string;
|
|
56
|
+
volume24hUsdt: number;
|
|
57
|
+
}
|
|
58
|
+
interface HeartbeatMessage {
|
|
59
|
+
type: 'heartbeat';
|
|
60
|
+
}
|
|
61
|
+
type ClientMessage = SubscribeMessage | UnsubscribeMessage;
|
|
62
|
+
type ServerMessage = SnapshotMessage | KlineClosedMessage | KlineUpdatedMessage | KlineUpdatedTickMessage | SymbolAddedMessage | SymbolRemovedMessage | Volume24hMessage | HeartbeatMessage;
|
|
63
|
+
type FeederMessage = ClientMessage | ServerMessage;
|
|
64
|
+
export type { ClientMessage, FeederMessage, HeartbeatMessage, KlineClosedMessage, KlineUpdatedMessage, KlineUpdatedTickMessage, ServerMessage, SnapshotMessage, SubscribeMessage, SymbolAddedMessage, SymbolRemovedMessage, UnsubscribeMessage, Volume24hMessage, };
|
|
65
|
+
//# sourceMappingURL=messages.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.types.d.ts","sourceRoot":"","sources":["../../src/protocol/messages.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE3E,UAAU,gBAAgB;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,iBAAiB,CAAC;CAC1B;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,UAAU,uBAAuB;IAC/B,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd;AAED,UAAU,kBAAkB;IAC1B,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,uBAAuB,CAAC;CAChC;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,KAAK,aAAa,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE3D,KAAK,aAAa,GACd,eAAe,GACf,kBAAkB,GAClB,mBAAmB,GACnB,uBAAuB,GACvB,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,KAAK,aAAa,GAAG,aAAa,GAAG,aAAa,CAAC;AAEnD,YAAY,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.types.js","sourceRoot":"","sources":["../../src/protocol/messages.types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Kline } from '@solncebro/trade-engine';
|
|
2
|
+
interface MergeRepairedKlinesArgs {
|
|
3
|
+
bufferKlineList: Kline[];
|
|
4
|
+
fetchedKlineList: Kline[];
|
|
5
|
+
formingOpenTimestamp: number | null;
|
|
6
|
+
maxBufferSize: number;
|
|
7
|
+
}
|
|
8
|
+
interface MergeRepairedKlinesResult {
|
|
9
|
+
mergedKlineList: Kline[];
|
|
10
|
+
changedCount: number;
|
|
11
|
+
}
|
|
12
|
+
declare function mergeRepairedKlines(args: MergeRepairedKlinesArgs): MergeRepairedKlinesResult;
|
|
13
|
+
export { mergeRepairedKlines };
|
|
14
|
+
export type { MergeRepairedKlinesArgs, MergeRepairedKlinesResult };
|
|
15
|
+
//# sourceMappingURL=gapRepair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gapRepair.d.ts","sourceRoot":"","sources":["../../src/source/gapRepair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,UAAU,uBAAuB;IAC/B,eAAe,EAAE,KAAK,EAAE,CAAC;IACzB,gBAAgB,EAAE,KAAK,EAAE,CAAC;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,yBAAyB;IACjC,eAAe,EAAE,KAAK,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAeD,iBAAS,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,GAAG,yBAAyB,CAkCrF;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC;AAC/B,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function isSameKline(first, second) {
|
|
2
|
+
return first.openPrice === second.openPrice
|
|
3
|
+
&& first.highPrice === second.highPrice
|
|
4
|
+
&& first.lowPrice === second.lowPrice
|
|
5
|
+
&& first.closePrice === second.closePrice
|
|
6
|
+
&& first.volume === second.volume
|
|
7
|
+
&& first.isClosed === second.isClosed;
|
|
8
|
+
}
|
|
9
|
+
// Merges a REST-refetched history slice into a live buffer. Only exchange-confirmed CLOSED candles
|
|
10
|
+
// strictly below the live forming candle are merged — the live tail must never be rolled back to an
|
|
11
|
+
// older REST snapshot of itself. Equal-timestamp candles are replaced only when they differ (this
|
|
12
|
+
// is what corrects a locally sealed close price); missing candles are inserted in order.
|
|
13
|
+
function mergeRepairedKlines(args) {
|
|
14
|
+
const { bufferKlineList, fetchedKlineList, formingOpenTimestamp, maxBufferSize } = args;
|
|
15
|
+
const klineByOpenTimestamp = new Map();
|
|
16
|
+
for (const kline of bufferKlineList) {
|
|
17
|
+
klineByOpenTimestamp.set(kline.openTimestamp, kline);
|
|
18
|
+
}
|
|
19
|
+
let changedCount = 0;
|
|
20
|
+
for (const fetchedKline of fetchedKlineList) {
|
|
21
|
+
if (fetchedKline.isClosed !== true) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (formingOpenTimestamp !== null && fetchedKline.openTimestamp >= formingOpenTimestamp) {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
const existingKline = klineByOpenTimestamp.get(fetchedKline.openTimestamp);
|
|
28
|
+
if (existingKline !== undefined && isSameKline(existingKline, fetchedKline)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
klineByOpenTimestamp.set(fetchedKline.openTimestamp, fetchedKline);
|
|
32
|
+
changedCount += 1;
|
|
33
|
+
}
|
|
34
|
+
const mergedKlineList = Array.from(klineByOpenTimestamp.values())
|
|
35
|
+
.sort((first, second) => first.openTimestamp - second.openTimestamp)
|
|
36
|
+
.slice(-maxBufferSize);
|
|
37
|
+
return { mergedKlineList, changedCount };
|
|
38
|
+
}
|
|
39
|
+
export { mergeRepairedKlines };
|
|
40
|
+
//# sourceMappingURL=gapRepair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gapRepair.js","sourceRoot":"","sources":["../../src/source/gapRepair.ts"],"names":[],"mappings":"AAcA,SAAS,WAAW,CAAC,KAAY,EAAE,MAAa;IAC9C,OAAO,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;WACtC,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS;WACpC,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;WAClC,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU;WACtC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;WAC9B,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;AAC1C,CAAC;AAED,mGAAmG;AACnG,oGAAoG;AACpG,kGAAkG;AAClG,yFAAyF;AACzF,SAAS,mBAAmB,CAAC,IAA6B;IACxD,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;IACxF,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAiB,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,YAAY,IAAI,gBAAgB,EAAE,CAAC;QAC5C,IAAI,YAAY,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,IAAI,oBAAoB,KAAK,IAAI,IAAI,YAAY,CAAC,aAAa,IAAI,oBAAoB,EAAE,CAAC;YACxF,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAE3E,IAAI,aAAa,KAAK,SAAS,IAAI,WAAW,CAAC,aAAa,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QACnE,YAAY,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC;SAC9D,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;SACnE,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC;IAEzB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;AAC3C,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicators.d.ts","sourceRoot":"","sources":["../../src/source/indicators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAiB9D,iBAAS,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,QAAQ,CAO1D;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function calculateSma(klineList, period) {
|
|
2
|
+
if (klineList.length < period) {
|
|
3
|
+
return 0;
|
|
4
|
+
}
|
|
5
|
+
const periodKlineList = klineList.slice(-period);
|
|
6
|
+
let sum = 0;
|
|
7
|
+
for (const kline of periodKlineList) {
|
|
8
|
+
sum += kline.closePrice;
|
|
9
|
+
}
|
|
10
|
+
return sum / period;
|
|
11
|
+
}
|
|
12
|
+
function calculateAllMaValues(klineList) {
|
|
13
|
+
return {
|
|
14
|
+
ma25: calculateSma(klineList, 25),
|
|
15
|
+
ma50: calculateSma(klineList, 50),
|
|
16
|
+
ma100: calculateSma(klineList, 100),
|
|
17
|
+
ma200: calculateSma(klineList, 200),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export { calculateAllMaValues };
|
|
21
|
+
//# sourceMappingURL=indicators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicators.js","sourceRoot":"","sources":["../../src/source/indicators.ts"],"names":[],"mappings":"AAIA,SAAS,YAAY,CAAC,SAAkB,EAAE,MAAc;IACtD,IAAI,SAAS,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC;IAC1B,CAAC;IAED,OAAO,GAAG,GAAG,MAAM,CAAC;AACtB,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;QACjC,IAAI,EAAE,YAAY,CAAC,SAAS,EAAE,EAAE,CAAC;QACjC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC;QACnC,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { RateLimitedRequestQueue } from '@solncebro/trade-engine';
|
|
3
|
+
import type { ExchangeConnector, Kline } from '@solncebro/trade-engine';
|
|
4
|
+
import type { KlineInterval, MaValues, StaleSymbolInfo } from '../domain/marketData.types.js';
|
|
5
|
+
import type { FeederSource, StreamLiveness } from '../domain/feederSource.types.js';
|
|
6
|
+
import type { SymbolLoadOutcome } from '../domain/managedSource.types.js';
|
|
7
|
+
export declare function markBackfilledHistoryClosed(klineList: Kline[]): void;
|
|
8
|
+
declare class MarketDataManager extends EventEmitter implements FeederSource {
|
|
9
|
+
private readonly exchangeConnector;
|
|
10
|
+
private readonly tradifiSymbolGate;
|
|
11
|
+
private readonly interval;
|
|
12
|
+
private readonly klineListBySymbol;
|
|
13
|
+
private readonly maValuesBySymbol;
|
|
14
|
+
private readonly subscriptionBySymbol;
|
|
15
|
+
private readonly handlerBySymbol;
|
|
16
|
+
private readonly currentKlineBySymbol;
|
|
17
|
+
private readonly lastEmittedUpdateBySymbol;
|
|
18
|
+
private readonly consecutiveStaleScanCountBySymbol;
|
|
19
|
+
private readonly persistentStaleEmittedSet;
|
|
20
|
+
private readonly skippedOlderKlineCountBySymbol;
|
|
21
|
+
private throttledMaRecomputeCount;
|
|
22
|
+
private skippedStaleEmitCount;
|
|
23
|
+
private lastInboundAtMs;
|
|
24
|
+
private isStreamSilent;
|
|
25
|
+
private isMassStale;
|
|
26
|
+
private isShutDown;
|
|
27
|
+
private pendingRemovalSet;
|
|
28
|
+
private isSymbolSyncAnomalyActive;
|
|
29
|
+
private readonly lastGapRepairAtMsBySymbol;
|
|
30
|
+
private readonly gapRepairInFlightSet;
|
|
31
|
+
private readonly gapRepairPendingSymbolList;
|
|
32
|
+
private readonly gapRepairFetchCountBySymbol;
|
|
33
|
+
private readonly backfillConvergedSet;
|
|
34
|
+
private readonly pendingBackfillConvergeSet;
|
|
35
|
+
private readonly convergedReprobeCountBySymbol;
|
|
36
|
+
private readonly acceptedHistoryStartMsBySymbol;
|
|
37
|
+
private locallyClosedCandleCount;
|
|
38
|
+
private stalenessSchedulerHandle;
|
|
39
|
+
private silenceSchedulerHandle;
|
|
40
|
+
private volumeSchedulerHandle;
|
|
41
|
+
private readonly lastEmittedVolumeBySymbol;
|
|
42
|
+
private readonly backfillQueue;
|
|
43
|
+
constructor(exchangeConnector: ExchangeConnector, interval: KlineInterval, backfillQueue?: RateLimitedRequestQueue);
|
|
44
|
+
start(): void;
|
|
45
|
+
loadAllSymbols(): Promise<void>;
|
|
46
|
+
getInterval(): KlineInterval;
|
|
47
|
+
getIntervalMs(): number;
|
|
48
|
+
getMaValues(symbol: string): MaValues;
|
|
49
|
+
getKlineList(symbol: string): Kline[];
|
|
50
|
+
getCurrentKline(symbol: string): Kline | undefined;
|
|
51
|
+
getSymbolList(): string[];
|
|
52
|
+
getKlineCount(): number;
|
|
53
|
+
getLastUpdateTimestamp(symbol: string): number | undefined;
|
|
54
|
+
getLastKlineOpenTimestamp(symbol: string): number | undefined;
|
|
55
|
+
getVolume24h(symbol: string): number;
|
|
56
|
+
getSubscriptionCount(): number;
|
|
57
|
+
getStreamLiveness(): StreamLiveness;
|
|
58
|
+
getFreshSymbolCount(): number;
|
|
59
|
+
getPersistentStaleCount(): number;
|
|
60
|
+
getStaleSymbolList(): StaleSymbolInfo[];
|
|
61
|
+
ensureSymbolLoaded(symbol: string): Promise<SymbolLoadOutcome>;
|
|
62
|
+
releaseSymbol(symbol: string): void;
|
|
63
|
+
syncAllSymbols(): Promise<void>;
|
|
64
|
+
private resolveSymbolSyncAnomaly;
|
|
65
|
+
shutdown(): Promise<void>;
|
|
66
|
+
private fetchKlinesWithTimeout;
|
|
67
|
+
private loadKlines;
|
|
68
|
+
private subscribeToKlines;
|
|
69
|
+
private handleKline;
|
|
70
|
+
private recordInboundMessage;
|
|
71
|
+
private handleKlineUnsafe;
|
|
72
|
+
private scheduleGapRepair;
|
|
73
|
+
private drainGapRepairQueue;
|
|
74
|
+
private runGapRepair;
|
|
75
|
+
private recalculateAndStoreMa;
|
|
76
|
+
private isKlineFresh;
|
|
77
|
+
private emitTickGuarded;
|
|
78
|
+
private emitGuarded;
|
|
79
|
+
private startStalenessWatchdog;
|
|
80
|
+
private startSilenceWatchdog;
|
|
81
|
+
private silenceScan;
|
|
82
|
+
private startVolumeRefreshScheduler;
|
|
83
|
+
private refreshVolumes;
|
|
84
|
+
private stalenessScan;
|
|
85
|
+
private scanUndergrownSymbols;
|
|
86
|
+
private computeExpectedKlineCount;
|
|
87
|
+
private isSymbolUndergrown;
|
|
88
|
+
private handleRepairConverged;
|
|
89
|
+
private recordConvergedReprobe;
|
|
90
|
+
private evaluateMassStale;
|
|
91
|
+
private flushSkippedOlderKlineCounters;
|
|
92
|
+
}
|
|
93
|
+
export { MarketDataManager };
|
|
94
|
+
//# sourceMappingURL=marketDataManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketDataManager.d.ts","sourceRoot":"","sources":["../../src/source/marketDataManager.ts"],"names":[],"mappings":"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"}
|