ctrader-x 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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +177 -0
  3. package/dist/auth/index.d.ts +7 -0
  4. package/dist/auth/index.d.ts.map +1 -0
  5. package/dist/auth/index.js +23 -0
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/auth/spotware-oauth-client.d.ts +31 -0
  8. package/dist/auth/spotware-oauth-client.d.ts.map +1 -0
  9. package/dist/auth/spotware-oauth-client.js +65 -0
  10. package/dist/auth/spotware-oauth-client.js.map +1 -0
  11. package/dist/auth/spotware-oauth-endpoints.d.ts +3 -0
  12. package/dist/auth/spotware-oauth-endpoints.d.ts.map +1 -0
  13. package/dist/auth/spotware-oauth-endpoints.js +8 -0
  14. package/dist/auth/spotware-oauth-endpoints.js.map +1 -0
  15. package/dist/auth/spotware-oauth-error.d.ts +6 -0
  16. package/dist/auth/spotware-oauth-error.d.ts.map +1 -0
  17. package/dist/auth/spotware-oauth-error.js +15 -0
  18. package/dist/auth/spotware-oauth-error.js.map +1 -0
  19. package/dist/auth/spotware-oauth-scope.enum.d.ts +5 -0
  20. package/dist/auth/spotware-oauth-scope.enum.d.ts.map +1 -0
  21. package/dist/auth/spotware-oauth-scope.enum.js +9 -0
  22. package/dist/auth/spotware-oauth-scope.enum.js.map +1 -0
  23. package/dist/auth/spotware-oauth-token.model.d.ts +7 -0
  24. package/dist/auth/spotware-oauth-token.model.d.ts.map +1 -0
  25. package/dist/auth/spotware-oauth-token.model.js +3 -0
  26. package/dist/auth/spotware-oauth-token.model.js.map +1 -0
  27. package/dist/auth/spotware-socket-auth-error.d.ts +5 -0
  28. package/dist/auth/spotware-socket-auth-error.d.ts.map +1 -0
  29. package/dist/auth/spotware-socket-auth-error.js +13 -0
  30. package/dist/auth/spotware-socket-auth-error.js.map +1 -0
  31. package/dist/auth/spotware-socket-authenticator.d.ts +21 -0
  32. package/dist/auth/spotware-socket-authenticator.d.ts.map +1 -0
  33. package/dist/auth/spotware-socket-authenticator.js +80 -0
  34. package/dist/auth/spotware-socket-authenticator.js.map +1 -0
  35. package/dist/client/index.d.ts +3 -0
  36. package/dist/client/index.d.ts.map +1 -0
  37. package/dist/client/index.js +19 -0
  38. package/dist/client/index.js.map +1 -0
  39. package/dist/client/spotware-client.d.ts +56 -0
  40. package/dist/client/spotware-client.d.ts.map +1 -0
  41. package/dist/client/spotware-client.js +172 -0
  42. package/dist/client/spotware-client.js.map +1 -0
  43. package/dist/client/spotware-request-error.d.ts +5 -0
  44. package/dist/client/spotware-request-error.d.ts.map +1 -0
  45. package/dist/client/spotware-request-error.js +13 -0
  46. package/dist/client/spotware-request-error.js.map +1 -0
  47. package/dist/example/example.d.ts +2 -0
  48. package/dist/example/example.d.ts.map +1 -0
  49. package/dist/example/example.js +187 -0
  50. package/dist/example/example.js.map +1 -0
  51. package/dist/example/market-data-example.d.ts +2 -0
  52. package/dist/example/market-data-example.d.ts.map +1 -0
  53. package/dist/example/market-data-example.js +32 -0
  54. package/dist/example/market-data-example.js.map +1 -0
  55. package/dist/example/shared/create-authenticated-client.d.ts +9 -0
  56. package/dist/example/shared/create-authenticated-client.d.ts.map +1 -0
  57. package/dist/example/shared/create-authenticated-client.js +154 -0
  58. package/dist/example/shared/create-authenticated-client.js.map +1 -0
  59. package/dist/example/trading-example.d.ts +2 -0
  60. package/dist/example/trading-example.d.ts.map +1 -0
  61. package/dist/example/trading-example.js +78 -0
  62. package/dist/example/trading-example.js.map +1 -0
  63. package/dist/index.d.ts +7 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +23 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/market-data/index.d.ts +3 -0
  68. package/dist/market-data/index.d.ts.map +1 -0
  69. package/dist/market-data/index.js +19 -0
  70. package/dist/market-data/index.js.map +1 -0
  71. package/dist/market-data/spotware-market-data.d.ts +31 -0
  72. package/dist/market-data/spotware-market-data.d.ts.map +1 -0
  73. package/dist/market-data/spotware-market-data.js +68 -0
  74. package/dist/market-data/spotware-market-data.js.map +1 -0
  75. package/dist/market-data/spotware-symbol-catalog.d.ts +19 -0
  76. package/dist/market-data/spotware-symbol-catalog.d.ts.map +1 -0
  77. package/dist/market-data/spotware-symbol-catalog.js +52 -0
  78. package/dist/market-data/spotware-symbol-catalog.js.map +1 -0
  79. package/dist/shared/sleep.d.ts +5 -0
  80. package/dist/shared/sleep.d.ts.map +1 -0
  81. package/dist/shared/sleep.js +17 -0
  82. package/dist/shared/sleep.js.map +1 -0
  83. package/dist/shared/spotware-scale.d.ts +3 -0
  84. package/dist/shared/spotware-scale.d.ts.map +1 -0
  85. package/dist/shared/spotware-scale.js +12 -0
  86. package/dist/shared/spotware-scale.js.map +1 -0
  87. package/dist/shared/typed-event-emitter.d.ts +13 -0
  88. package/dist/shared/typed-event-emitter.d.ts.map +1 -0
  89. package/dist/shared/typed-event-emitter.js +28 -0
  90. package/dist/shared/typed-event-emitter.js.map +1 -0
  91. package/dist/trading/index.d.ts +2 -0
  92. package/dist/trading/index.d.ts.map +1 -0
  93. package/dist/trading/index.js +18 -0
  94. package/dist/trading/index.js.map +1 -0
  95. package/dist/trading/spotware-trading.d.ts +59 -0
  96. package/dist/trading/spotware-trading.d.ts.map +1 -0
  97. package/dist/trading/spotware-trading.js +97 -0
  98. package/dist/trading/spotware-trading.js.map +1 -0
  99. package/dist/transport/frame-codec.d.ts +6 -0
  100. package/dist/transport/frame-codec.d.ts.map +1 -0
  101. package/dist/transport/frame-codec.js +35 -0
  102. package/dist/transport/frame-codec.js.map +1 -0
  103. package/dist/transport/index.d.ts +4 -0
  104. package/dist/transport/index.d.ts.map +1 -0
  105. package/dist/transport/index.js +20 -0
  106. package/dist/transport/index.js.map +1 -0
  107. package/dist/transport/rate-limiter.d.ts +11 -0
  108. package/dist/transport/rate-limiter.d.ts.map +1 -0
  109. package/dist/transport/rate-limiter.js +48 -0
  110. package/dist/transport/rate-limiter.js.map +1 -0
  111. package/dist/transport/reconnect-backoff.d.ts +12 -0
  112. package/dist/transport/reconnect-backoff.d.ts.map +1 -0
  113. package/dist/transport/reconnect-backoff.js +20 -0
  114. package/dist/transport/reconnect-backoff.js.map +1 -0
  115. package/dist/transport/spotware-host.enum.d.ts +6 -0
  116. package/dist/transport/spotware-host.enum.d.ts.map +1 -0
  117. package/dist/transport/spotware-host.enum.js +10 -0
  118. package/dist/transport/spotware-host.enum.js.map +1 -0
  119. package/dist/transport/spotware-rate-limiter.d.ts +8 -0
  120. package/dist/transport/spotware-rate-limiter.d.ts.map +1 -0
  121. package/dist/transport/spotware-rate-limiter.js +29 -0
  122. package/dist/transport/spotware-rate-limiter.js.map +1 -0
  123. package/dist/transport/spotware-transport.d.ts +63 -0
  124. package/dist/transport/spotware-transport.d.ts.map +1 -0
  125. package/dist/transport/spotware-transport.js +237 -0
  126. package/dist/transport/spotware-transport.js.map +1 -0
  127. package/dist/types/generated/OpenApiCommonMessages.d.ts +49 -0
  128. package/dist/types/generated/OpenApiCommonMessages.d.ts.map +1 -0
  129. package/dist/types/generated/OpenApiCommonMessages.js +285 -0
  130. package/dist/types/generated/OpenApiCommonMessages.js.map +1 -0
  131. package/dist/types/generated/OpenApiCommonModelMessages.d.ts +40 -0
  132. package/dist/types/generated/OpenApiCommonModelMessages.d.ts.map +1 -0
  133. package/dist/types/generated/OpenApiCommonModelMessages.js +140 -0
  134. package/dist/types/generated/OpenApiCommonModelMessages.js.map +1 -0
  135. package/dist/types/generated/OpenApiMessages.d.ts +964 -0
  136. package/dist/types/generated/OpenApiMessages.d.ts.map +1 -0
  137. package/dist/types/generated/OpenApiMessages.js +8754 -0
  138. package/dist/types/generated/OpenApiMessages.js.map +1 -0
  139. package/dist/types/generated/OpenApiModelMessages.d.ts +1116 -0
  140. package/dist/types/generated/OpenApiModelMessages.d.ts.map +1 -0
  141. package/dist/types/generated/OpenApiModelMessages.js +6917 -0
  142. package/dist/types/generated/OpenApiModelMessages.js.map +1 -0
  143. package/dist/types/index.d.ts +5 -0
  144. package/dist/types/index.d.ts.map +1 -0
  145. package/dist/types/index.js +141 -0
  146. package/dist/types/index.js.map +1 -0
  147. package/package.json +61 -0
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createAuthenticatedClient = createAuthenticatedClient;
37
+ require("dotenv/config");
38
+ const fs = __importStar(require("node:fs/promises"));
39
+ const http = __importStar(require("node:http"));
40
+ const path = __importStar(require("node:path"));
41
+ const auth_1 = require("../../auth");
42
+ const client_1 = require("../../client");
43
+ const transport_1 = require("../../transport");
44
+ const TOKEN_FILE_PATH = path.resolve(__dirname, '../../../.spotware-token.json');
45
+ const REDIRECT_PORT = Number(process.env.SPOTWARE__OAUTH_REDIRECT_PORT ?? 3939);
46
+ const REDIRECT_URI = `http://localhost:${REDIRECT_PORT}/callback`;
47
+ function requireEnv(name) {
48
+ const value = process.env[name];
49
+ if (!value) {
50
+ throw new Error(`Missing required environment variable "${name}"`);
51
+ }
52
+ return value;
53
+ }
54
+ async function readStoredToken() {
55
+ try {
56
+ return JSON.parse(await fs.readFile(TOKEN_FILE_PATH, 'utf8'));
57
+ }
58
+ catch {
59
+ return undefined;
60
+ }
61
+ }
62
+ async function writeStoredToken(token) {
63
+ await fs.writeFile(TOKEN_FILE_PATH, JSON.stringify(token, null, 4), 'utf8');
64
+ }
65
+ // The authorization code only lives for ~1 minute, so this listener must already be
66
+ // up before the user is sent to the browser, not started after.
67
+ function waitForAuthorizationCode(port) {
68
+ return new Promise((resolve, reject) => {
69
+ const server = http.createServer((request, response) => {
70
+ const url = new URL(request.url ?? '/', `http://localhost:${port}`);
71
+ const code = url.searchParams.get('code');
72
+ const errorParam = url.searchParams.get('error');
73
+ response.writeHead(200, { 'Content-Type': 'text/html' });
74
+ response.end(errorParam ? '<p>Authorization failed. You can close this tab.</p>' : '<p>Authorized. You can close this tab.</p>');
75
+ server.close();
76
+ if (errorParam) {
77
+ reject(new Error(`Authorization was denied: ${errorParam}`));
78
+ }
79
+ else if (code) {
80
+ resolve(code);
81
+ }
82
+ else {
83
+ reject(new Error('No authorization code was returned'));
84
+ }
85
+ });
86
+ server.listen(port);
87
+ });
88
+ }
89
+ async function obtainToken(oauthClient) {
90
+ const stored = await readStoredToken();
91
+ if (stored) {
92
+ console.log('Found a stored token, refreshing it (refresh tokens are single-use, so the file gets rewritten)...');
93
+ const refreshed = await oauthClient.refreshAccessToken({ refreshToken: stored.refreshToken });
94
+ await writeStoredToken(refreshed);
95
+ return refreshed;
96
+ }
97
+ const authorizationUrl = oauthClient.buildAuthorizationUrl({ redirectUri: REDIRECT_URI, scope: auth_1.SpotwareOAuthScope.TRADING });
98
+ console.log('No stored token found. Open this URL in a browser to authorize the app:\n');
99
+ console.log(authorizationUrl);
100
+ console.log(`\nWaiting for the redirect on ${REDIRECT_URI} ...`);
101
+ console.log(`(Make sure "${REDIRECT_URI}" is registered as a redirect URI on this app in the cTrader Open API portal.)`);
102
+ const code = await waitForAuthorizationCode(REDIRECT_PORT);
103
+ const token = await oauthClient.exchangeAuthorizationCode({ code, redirectUri: REDIRECT_URI });
104
+ await writeStoredToken(token);
105
+ return token;
106
+ }
107
+ // Runs on a short-lived transport just to discover which demo account is linked to this
108
+ // token — SpotwareClient itself needs a ctidTraderAccountId up front, so this has to happen
109
+ // before it can be constructed.
110
+ async function discoverDemoAccountId(clientId, clientSecret, accessToken) {
111
+ const transport = new transport_1.SpotwareTransport({ host: transport_1.SpotwareHost.DEMO });
112
+ transport.on('error', (error) => console.error('Discovery transport error:', error.message));
113
+ await transport.connect();
114
+ const authenticator = new auth_1.SpotwareSocketAuthenticator(transport);
115
+ await authenticator.authenticateApplication(clientId, clientSecret);
116
+ console.log('Listing accounts linked to this token...');
117
+ const accounts = await authenticator.listAccounts(accessToken);
118
+ console.table(accounts.map((account) => ({
119
+ ctidTraderAccountId: account.ctidTraderAccountId,
120
+ isLive: account.isLive ?? false,
121
+ traderLogin: account.traderLogin
122
+ })));
123
+ const demoAccount = accounts.find((account) => !account.isLive);
124
+ if (!demoAccount) {
125
+ throw new Error('No demo account is linked to this token. Link a demo account via cTrader before running this script.');
126
+ }
127
+ await transport.disconnect();
128
+ return demoAccount.ctidTraderAccountId;
129
+ }
130
+ /**
131
+ * Runs the full one-time setup shared by every example script: OAuth (browser flow or cached
132
+ * token refresh), demo account discovery, and a connected, authenticated SpotwareClient. Each
133
+ * example script can then focus purely on the module it's demonstrating.
134
+ */
135
+ async function createAuthenticatedClient() {
136
+ const clientId = requireEnv('SPOTWARE__CLIENT_ID');
137
+ const clientSecret = requireEnv('SPOTWARE__CLIENT_SECRET');
138
+ const oauthClient = new auth_1.SpotwareOAuthClient({ clientId, clientSecret });
139
+ const token = await obtainToken(oauthClient);
140
+ const ctidTraderAccountId = await discoverDemoAccountId(clientId, clientSecret, token.accessToken);
141
+ console.log(`\nConnecting SpotwareClient for demo account ${ctidTraderAccountId}...`);
142
+ const transport = new transport_1.SpotwareTransport({ host: transport_1.SpotwareHost.DEMO });
143
+ const client = new client_1.SpotwareClient({ transport, oauthClient, clientId, clientSecret, ctidTraderAccountId, token });
144
+ transport.on('reconnecting', (attempt, delayMs) => console.log(`Reconnecting (attempt ${attempt}) in ${delayMs}ms...`));
145
+ client.on('authenticated', () => console.log('Authenticated (application + account).'));
146
+ client.on('tokenRefreshed', (refreshed) => {
147
+ console.log('Access token refreshed.');
148
+ void writeStoredToken(refreshed);
149
+ });
150
+ client.on('error', (error) => console.error('Client error:', error.message));
151
+ await client.connect();
152
+ return client;
153
+ }
154
+ //# sourceMappingURL=create-authenticated-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-authenticated-client.js","sourceRoot":"","sources":["../../../src/example/shared/create-authenticated-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trading-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-example.d.ts","sourceRoot":"","sources":["../../src/example/trading-example.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const market_data_1 = require("../market-data");
4
+ const trading_1 = require("../trading");
5
+ const types_1 = require("../types");
6
+ const create_authenticated_client_1 = require("./shared/create-authenticated-client");
7
+ const SYMBOL_NAME = process.argv[2] ?? 'EURUSD';
8
+ // Small enough to be a plausible minimum size on a demo account, without assuming a specific
9
+ // broker's actual minimum — if it's rejected, the OrderErrorEvent rejection prints clearly.
10
+ const ORDER_VOLUME_UNITS = 1_000;
11
+ function waitForBid(marketData, symbolId) {
12
+ return new Promise((resolve, reject) => {
13
+ const timeout = setTimeout(() => {
14
+ marketData.off('price', onPrice);
15
+ reject(new Error('Timed out waiting for a price update'));
16
+ }, 10_000);
17
+ const onPrice = (update) => {
18
+ if (update.symbolId !== symbolId || update.bid === undefined) {
19
+ return;
20
+ }
21
+ clearTimeout(timeout);
22
+ marketData.off('price', onPrice);
23
+ resolve(update.bid);
24
+ };
25
+ marketData.on('price', onPrice);
26
+ });
27
+ }
28
+ async function main() {
29
+ const client = await (0, create_authenticated_client_1.createAuthenticatedClient)();
30
+ const trading = new trading_1.SpotwareTrading(client);
31
+ // Only need the symbol catalog here, not price streaming for its own sake — this is the
32
+ // same public SpotwareSymbolCatalog a consumer could use standalone.
33
+ const marketData = new market_data_1.SpotwareMarketData(client);
34
+ console.log('\nOpen positions:');
35
+ const { positions, orders } = await trading.getOpenPositionsAndOrders();
36
+ console.table(positions.map((position) => ({
37
+ positionId: position.positionId,
38
+ symbolId: position.tradeData?.symbolId,
39
+ side: position.tradeData?.tradeSide,
40
+ volume: position.tradeData?.volume
41
+ })));
42
+ console.log('Pending orders:');
43
+ console.table(orders.map((order) => ({ orderId: order.orderId, status: order.orderStatus, type: order.orderType })));
44
+ const symbol = await marketData.symbols.findByName(SYMBOL_NAME);
45
+ if (!symbol) {
46
+ throw new Error(`Symbol "${SYMBOL_NAME}" was not found for this account`);
47
+ }
48
+ console.log(`\nFetching a reference price for ${symbol.symbolName}...`);
49
+ const bidPromise = waitForBid(marketData, symbol.symbolId);
50
+ await marketData.subscribe(symbol.symbolId);
51
+ const bid = await bidPromise;
52
+ await marketData.unsubscribe(symbol.symbolId);
53
+ // 10% below the current bid: a BUY limit there is virtually guaranteed to stay pending
54
+ // rather than fill, so placing and cancelling it is safe to run against a real demo account.
55
+ const limitPrice = Number((bid * 0.9).toFixed(5));
56
+ console.log(`Current bid: ${bid}. Placing a BUY limit order at ${limitPrice} (won't fill)...`);
57
+ const execution = await trading.placeLimitOrder({
58
+ symbolId: symbol.symbolId,
59
+ tradeSide: types_1.ProtoOATradeSide.BUY,
60
+ volume: ORDER_VOLUME_UNITS,
61
+ limitPrice,
62
+ comment: 'ctrader-x trading example — safe to cancel'
63
+ });
64
+ const orderId = execution.order?.orderId;
65
+ console.log(`Order placed (executionType=${execution.executionType}), orderId=${orderId}`);
66
+ if (orderId === undefined) {
67
+ throw new Error('No orderId was returned for the placed order');
68
+ }
69
+ console.log('Cancelling it...');
70
+ const cancellation = await trading.cancelOrder(orderId);
71
+ console.log(`Cancelled (executionType=${cancellation.executionType}).`);
72
+ await client.disconnect();
73
+ }
74
+ main().catch((error) => {
75
+ console.error(error);
76
+ process.exit(1);
77
+ });
78
+ //# sourceMappingURL=trading-example.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trading-example.js","sourceRoot":"","sources":["../../src/example/trading-example.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './auth';
2
+ export * from './client';
3
+ export * from './market-data';
4
+ export * from './trading';
5
+ export * from './transport';
6
+ export * from './types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auth"), exports);
18
+ __exportStar(require("./client"), exports);
19
+ __exportStar(require("./market-data"), exports);
20
+ __exportStar(require("./trading"), exports);
21
+ __exportStar(require("./transport"), exports);
22
+ __exportStar(require("./types"), exports);
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,2CAAyB;AACzB,gDAA8B;AAC9B,4CAA0B;AAC1B,8CAA4B;AAC5B,0CAAwB"}
@@ -0,0 +1,3 @@
1
+ export * from './spotware-market-data';
2
+ export * from './spotware-symbol-catalog';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/market-data/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./spotware-market-data"), exports);
18
+ __exportStar(require("./spotware-symbol-catalog"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/market-data/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC;AACvC,4DAA0C"}
@@ -0,0 +1,31 @@
1
+ import type { SpotwareClient } from '../client';
2
+ import { TypedEventEmitter, type EventMap } from '../shared/typed-event-emitter';
3
+ import { SpotwareSymbolCatalog } from './spotware-symbol-catalog';
4
+ export interface ISpotwarePriceUpdate {
5
+ symbolId: number;
6
+ bid?: number;
7
+ ask?: number;
8
+ timestamp?: number;
9
+ }
10
+ export interface ISpotwareMarketDataEvents extends EventMap {
11
+ price: [update: ISpotwarePriceUpdate];
12
+ error: [error: Error];
13
+ }
14
+ /**
15
+ * Subscribes to spot prices via `client` and exposes them as a clean 'price' event, decimal
16
+ * bid/ask already converted. Re-subscribes to everything currently subscribed whenever
17
+ * `client` re-authenticates (including after a reconnect), since a fresh TCP connection has
18
+ * no memory of prior subscriptions.
19
+ */
20
+ export declare class SpotwareMarketData extends TypedEventEmitter<ISpotwareMarketDataEvents> {
21
+ readonly symbols: SpotwareSymbolCatalog;
22
+ private readonly client;
23
+ private readonly subscribedSymbolIds;
24
+ constructor(client: SpotwareClient, symbolCatalog?: SpotwareSymbolCatalog);
25
+ subscribe(symbol: number | string): Promise<void>;
26
+ unsubscribe(symbol: number | string): Promise<void>;
27
+ private resolveSymbolId;
28
+ private handleMessage;
29
+ private resubscribeAll;
30
+ }
31
+ //# sourceMappingURL=spotware-market-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-market-data.d.ts","sourceRoot":"","sources":["../../src/market-data/spotware-market-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,yBAA0B,SAAQ,QAAQ;IACvD,KAAK,EAAE,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;IAChF,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;gBAE7C,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC,EAAE,qBAAqB;IASnE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAa3C,eAAe;IAa7B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,cAAc;CAgBzB"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpotwareMarketData = void 0;
4
+ const spotware_scale_1 = require("../shared/spotware-scale");
5
+ const typed_event_emitter_1 = require("../shared/typed-event-emitter");
6
+ const types_1 = require("../types");
7
+ const spotware_symbol_catalog_1 = require("./spotware-symbol-catalog");
8
+ /**
9
+ * Subscribes to spot prices via `client` and exposes them as a clean 'price' event, decimal
10
+ * bid/ask already converted. Re-subscribes to everything currently subscribed whenever
11
+ * `client` re-authenticates (including after a reconnect), since a fresh TCP connection has
12
+ * no memory of prior subscriptions.
13
+ */
14
+ class SpotwareMarketData extends typed_event_emitter_1.TypedEventEmitter {
15
+ symbols;
16
+ client;
17
+ subscribedSymbolIds = new Set();
18
+ constructor(client, symbolCatalog) {
19
+ super();
20
+ this.client = client;
21
+ this.symbols = symbolCatalog ?? new spotware_symbol_catalog_1.SpotwareSymbolCatalog(client);
22
+ this.client.on('message', (message) => this.handleMessage(message));
23
+ this.client.on('authenticated', () => this.resubscribeAll());
24
+ }
25
+ async subscribe(symbol) {
26
+ const symbolId = await this.resolveSymbolId(symbol);
27
+ await this.client.send(types_1.ProtoOAPayloadType.PROTO_OA_SUBSCRIBE_SPOTS_REQ, types_1.ProtoOASubscribeSpotsReq.encode(types_1.ProtoOASubscribeSpotsReq.fromPartial({ ctidTraderAccountId: this.client.ctidTraderAccountId, symbolId: [symbolId] })).finish());
28
+ this.subscribedSymbolIds.add(symbolId);
29
+ }
30
+ async unsubscribe(symbol) {
31
+ const symbolId = await this.resolveSymbolId(symbol);
32
+ await this.client.send(types_1.ProtoOAPayloadType.PROTO_OA_UNSUBSCRIBE_SPOTS_REQ, types_1.ProtoOAUnsubscribeSpotsReq.encode(types_1.ProtoOAUnsubscribeSpotsReq.fromPartial({ ctidTraderAccountId: this.client.ctidTraderAccountId, symbolId: [symbolId] })).finish());
33
+ this.subscribedSymbolIds.delete(symbolId);
34
+ }
35
+ async resolveSymbolId(symbol) {
36
+ if (typeof symbol === 'number') {
37
+ return symbol;
38
+ }
39
+ const found = await this.symbols.findByName(symbol);
40
+ if (!found) {
41
+ throw new Error(`Unknown symbol "${symbol}"`);
42
+ }
43
+ return found.symbolId;
44
+ }
45
+ handleMessage(message) {
46
+ if (message.payloadType !== types_1.ProtoOAPayloadType.PROTO_OA_SPOT_EVENT) {
47
+ return;
48
+ }
49
+ const event = types_1.ProtoOASpotEvent.decode(message.payload ?? new Uint8Array());
50
+ this.emit('price', {
51
+ symbolId: event.symbolId,
52
+ bid: event.bid === undefined ? undefined : event.bid / spotware_scale_1.SPOTWARE_PRICE_SCALE,
53
+ ask: event.ask === undefined ? undefined : event.ask / spotware_scale_1.SPOTWARE_PRICE_SCALE,
54
+ timestamp: event.timestamp
55
+ });
56
+ }
57
+ resubscribeAll() {
58
+ if (this.subscribedSymbolIds.size === 0) {
59
+ return;
60
+ }
61
+ const symbolId = [...this.subscribedSymbolIds];
62
+ this.client
63
+ .send(types_1.ProtoOAPayloadType.PROTO_OA_SUBSCRIBE_SPOTS_REQ, types_1.ProtoOASubscribeSpotsReq.encode(types_1.ProtoOASubscribeSpotsReq.fromPartial({ ctidTraderAccountId: this.client.ctidTraderAccountId, symbolId })).finish())
64
+ .catch((error) => this.emit('error', error));
65
+ }
66
+ }
67
+ exports.SpotwareMarketData = SpotwareMarketData;
68
+ //# sourceMappingURL=spotware-market-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-market-data.js","sourceRoot":"","sources":["../../src/market-data/spotware-market-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { SpotwareClient } from '../client';
2
+ import { ProtoOALightSymbol } from '../types';
3
+ /**
4
+ * Fetches and caches the account's symbol list, and resolves a ticker name (e.g. "EURUSD")
5
+ * to the numeric symbolId every other request actually needs. Public on its own — trading
6
+ * will want the same lookups later — and used internally by SpotwareMarketData so callers
7
+ * can subscribe by name without touching this class directly.
8
+ */
9
+ export declare class SpotwareSymbolCatalog {
10
+ private readonly client;
11
+ private symbolsPromise;
12
+ constructor(client: SpotwareClient);
13
+ getAll(): Promise<ProtoOALightSymbol[]>;
14
+ findByName(symbolName: string): Promise<ProtoOALightSymbol | undefined>;
15
+ findById(symbolId: number): Promise<ProtoOALightSymbol | undefined>;
16
+ refresh(): Promise<ProtoOALightSymbol[]>;
17
+ private fetchSymbols;
18
+ }
19
+ //# sourceMappingURL=spotware-symbol-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-symbol-catalog.d.ts","sourceRoot":"","sources":["../../src/market-data/spotware-symbol-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAoE,MAAM,UAAU,CAAC;AAEhH;;;;;GAKG;AACH,qBAAa,qBAAqB;IAGlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,cAAc,CAA4C;gBAErC,MAAM,EAAE,cAAc;IAE7C,MAAM,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAQvC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAOvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAOzE,OAAO,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAM1B,YAAY;CAgB7B"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpotwareSymbolCatalog = void 0;
4
+ const types_1 = require("../types");
5
+ /**
6
+ * Fetches and caches the account's symbol list, and resolves a ticker name (e.g. "EURUSD")
7
+ * to the numeric symbolId every other request actually needs. Public on its own — trading
8
+ * will want the same lookups later — and used internally by SpotwareMarketData so callers
9
+ * can subscribe by name without touching this class directly.
10
+ */
11
+ class SpotwareSymbolCatalog {
12
+ client;
13
+ symbolsPromise;
14
+ constructor(client) {
15
+ this.client = client;
16
+ }
17
+ async getAll() {
18
+ if (!this.symbolsPromise) {
19
+ this.symbolsPromise = this.fetchSymbols();
20
+ }
21
+ return this.symbolsPromise;
22
+ }
23
+ async findByName(symbolName) {
24
+ const normalized = symbolName.trim().toUpperCase();
25
+ const symbols = await this.getAll();
26
+ return symbols.find((symbol) => symbol.symbolName?.toUpperCase() === normalized);
27
+ }
28
+ async findById(symbolId) {
29
+ const symbols = await this.getAll();
30
+ return symbols.find((symbol) => symbol.symbolId === symbolId);
31
+ }
32
+ // Forces a re-fetch, e.g. if symbols were added or archived since the last load.
33
+ refresh() {
34
+ this.symbolsPromise = this.fetchSymbols();
35
+ return this.symbolsPromise;
36
+ }
37
+ async fetchSymbols() {
38
+ try {
39
+ const request = types_1.ProtoOASymbolsListReq.fromPartial({ ctidTraderAccountId: this.client.ctidTraderAccountId });
40
+ const response = await this.client.send(types_1.ProtoOAPayloadType.PROTO_OA_SYMBOLS_LIST_REQ, types_1.ProtoOASymbolsListReq.encode(request).finish());
41
+ return types_1.ProtoOASymbolsListRes.decode(response.payload ?? new Uint8Array()).symbol;
42
+ }
43
+ catch (error) {
44
+ // Don't cache a failure — the next call should retry instead of returning a
45
+ // permanently broken rejected promise.
46
+ this.symbolsPromise = undefined;
47
+ throw error;
48
+ }
49
+ }
50
+ }
51
+ exports.SpotwareSymbolCatalog = SpotwareSymbolCatalog;
52
+ //# sourceMappingURL=spotware-symbol-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-symbol-catalog.js","sourceRoot":"","sources":["../../src/market-data/spotware-symbol-catalog.ts"],"names":[],"mappings":";;;AACA,oCAAgH;AAEhH;;;;;GAKG;AACH,MAAa,qBAAqB;IAGD;IAFrB,cAAc,CAA4C;IAElE,YAA6B,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;IAEvD,KAAK,CAAC,MAAM;QACR,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC9C,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QAC/B,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,UAAU,CAAC,CAAC;IACrF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,iFAAiF;IACjF,OAAO;QACH,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAE1C,OAAO,IAAI,CAAC,cAAc,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,6BAAqB,CAAC,WAAW,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;YAC5G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACnC,0BAAkB,CAAC,yBAAyB,EAC5C,6BAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CACjD,CAAC;YAEF,OAAO,6BAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACrF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,4EAA4E;YAC5E,uCAAuC;YACvC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;CACJ;AAjDD,sDAiDC"}
@@ -0,0 +1,5 @@
1
+ export declare class Sleep {
2
+ static s(time: number): Promise<void>;
3
+ static ms(time: number): Promise<void>;
4
+ }
5
+ //# sourceMappingURL=sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/shared/sleep.ts"],"names":[],"mappings":"AAAA,qBAAa,KAAK;IACd,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM;IAIrB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM;CAOzB"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Sleep = void 0;
4
+ class Sleep {
5
+ static s(time) {
6
+ return this.ms(time * 1000);
7
+ }
8
+ static ms(time) {
9
+ return new Promise((resolve) => {
10
+ setTimeout(() => {
11
+ resolve();
12
+ }, time);
13
+ });
14
+ }
15
+ }
16
+ exports.Sleep = Sleep;
17
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../src/shared/sleep.ts"],"names":[],"mappings":";;;AAAA,MAAa,KAAK;IACd,MAAM,CAAC,CAAC,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,IAAY;QAClB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjC,UAAU,CAAC,GAAG,EAAE;gBACZ,OAAO,EAAE,CAAC;YACd,CAAC,EAAE,IAAI,CAAC,CAAC;QACb,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAZD,sBAYC"}
@@ -0,0 +1,3 @@
1
+ export declare const SPOTWARE_PRICE_SCALE = 100000;
2
+ export declare const SPOTWARE_VOLUME_SCALE = 100;
3
+ //# sourceMappingURL=spotware-scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-scale.d.ts","sourceRoot":"","sources":["../../src/shared/spotware-scale.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAG5C,eAAO,MAAM,qBAAqB,MAAM,CAAC"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SPOTWARE_VOLUME_SCALE = exports.SPOTWARE_PRICE_SCALE = void 0;
4
+ // Spot prices (bid/ask/sessionClose) and relative stop-loss/take-profit are transmitted as
5
+ // fixed-point integers: 123000 means 1.23. Not every price field uses this scale — order-level
6
+ // absolute prices (limitPrice, stopPrice, stopLoss, takeProfit) are plain decimals instead, per
7
+ // their own doc comments in the generated types. Confirmed against Spotware's own OpenApiPy
8
+ // sample, which assigns a plain float to limitPrice with no conversion.
9
+ exports.SPOTWARE_PRICE_SCALE = 100_000;
10
+ // Volumes are transmitted in cents of a unit: 1000 means 10.00 units.
11
+ exports.SPOTWARE_VOLUME_SCALE = 100;
12
+ //# sourceMappingURL=spotware-scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotware-scale.js","sourceRoot":"","sources":["../../src/shared/spotware-scale.ts"],"names":[],"mappings":";;;AAAA,2FAA2F;AAC3F,+FAA+F;AAC/F,gGAAgG;AAChG,4FAA4F;AAC5F,wEAAwE;AAC3D,QAAA,oBAAoB,GAAG,OAAO,CAAC;AAE5C,sEAAsE;AACzD,QAAA,qBAAqB,GAAG,GAAG,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type EventMap = Record<string, unknown[]>;
2
+ /**
3
+ * Wraps Node's EventEmitter instead of extending it, so `emit` stays protected:
4
+ * consumers can only listen, only the owning class can trigger events.
5
+ */
6
+ export declare class TypedEventEmitter<TEvents extends EventMap> {
7
+ private readonly emitter;
8
+ on<TEvent extends keyof TEvents & string>(event: TEvent, listener: (...args: TEvents[TEvent]) => void): this;
9
+ once<TEvent extends keyof TEvents & string>(event: TEvent, listener: (...args: TEvents[TEvent]) => void): this;
10
+ off<TEvent extends keyof TEvents & string>(event: TEvent, listener: (...args: TEvents[TEvent]) => void): this;
11
+ protected emit<TEvent extends keyof TEvents & string>(event: TEvent, ...args: TEvents[TEvent]): boolean;
12
+ }
13
+ //# sourceMappingURL=typed-event-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-event-emitter.d.ts","sourceRoot":"","sources":["../../src/shared/typed-event-emitter.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjD;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,OAAO,SAAS,QAAQ;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,EAAE,CAAC,MAAM,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI;IAK5G,IAAI,CAAC,MAAM,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI;IAK9G,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,IAAI;IAK7G,SAAS,CAAC,IAAI,CAAC,MAAM,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO;CAG1G"}