Skip to content

Commit a79382f

Browse files
authored
Read current strategy status concurrently (#28)
1 parent 4b7141d commit a79382f

2 files changed

Lines changed: 46 additions & 6 deletions

File tree

tests/strategy_switch_worker_validation.mjs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,38 @@ assert.deepEqual(accountOptions.longbridge[0].supported_domains, ["us_equity", "
132132
assert.deepEqual(accountOptions.longbridge[1].supported_domains, ["us_equity", "hk_equity"]);
133133
assert.deepEqual(accountOptions.ibkr[0].supported_domains, ["us_equity", "hk_equity"]);
134134

135+
const originalFetch = globalThis.fetch;
136+
globalThis.fetch = async (url) => {
137+
const requestUrl = String(url);
138+
if (requestUrl.endsWith("/CLOUD_RUN_SERVICE_TARGETS_JSON")) {
139+
return new Response("", { status: 404 });
140+
}
141+
if (requestUrl.endsWith("/RUNTIME_TARGET_JSON")) {
142+
return new Response(JSON.stringify({
143+
value: JSON.stringify({
144+
platform_id: "schwab",
145+
strategy_profile: "soxl_soxx_trend_income",
146+
dry_run_only: false,
147+
account_scope: "schwab",
148+
service_name: "charles-schwab-quant-service",
149+
execution_mode: "live",
150+
}),
151+
}), { status: 200, headers: { "Content-Type": "application/json" } });
152+
}
153+
return new Response("", { status: 404 });
154+
};
155+
try {
156+
const currentStrategies = await __test.loadCurrentStrategies(
157+
{ schwab: accountOptions.schwab },
158+
{ RUNTIME_SETTINGS_DISPATCH_TOKEN: "test-token" },
159+
);
160+
assert.equal(currentStrategies.schwab.default.strategy_profile, "soxl_soxx_trend_income");
161+
assert.equal(currentStrategies.schwab.default.execution_mode, "live");
162+
assert.equal(currentStrategies.schwab.default.source, "RUNTIME_TARGET_JSON");
163+
} finally {
164+
globalThis.fetch = originalFetch;
165+
}
166+
135167
const longbridgeHk = __test.assertConfiguredAccount(
136168
{
137169
platform: "longbridge",

web/strategy-switch-console/worker.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -480,24 +480,31 @@ async function loadCurrentStrategies(accountOptions, env) {
480480
};
481481

482482
const currentStrategies = {};
483-
for (const platform of SUPPORTED_PLATFORMS) {
483+
const platformResults = await Promise.all(SUPPORTED_PLATFORMS.map(async (platform) => {
484484
const options = Array.isArray(accountOptions[platform]) ? accountOptions[platform] : [];
485-
if (!options.length) continue;
485+
if (!options.length) return [platform, {}];
486486
const repository = PLATFORM_REPOSITORIES[platform];
487-
if (!repository) continue;
488-
const platformStrategies = {};
487+
if (!repository) return [platform, {}];
489488

490-
for (const option of options) {
489+
const optionResults = await Promise.all(options.map(async (option) => {
491490
const current = await resolveCurrentStrategyForAccount({
492491
platform,
493492
option,
494493
optionsCount: options.length,
495494
repository,
496495
readVariable,
497496
});
498-
if (current) platformStrategies[option.key] = current;
497+
return [option.key, current];
498+
}));
499+
500+
const platformStrategies = {};
501+
for (const [key, current] of optionResults) {
502+
if (current) platformStrategies[key] = current;
499503
}
504+
return [platform, platformStrategies];
505+
}));
500506

507+
for (const [platform, platformStrategies] of platformResults) {
501508
if (Object.keys(platformStrategies).length) currentStrategies[platform] = platformStrategies;
502509
}
503510
return currentStrategies;
@@ -1503,6 +1510,7 @@ export const __test = {
15031510
assertConfiguredAccount,
15041511
assertStrategyAllowedForAccount,
15051512
inferAccountSupportedDomains,
1513+
loadCurrentStrategies,
15061514
normalizeAccountOptionsPayload,
15071515
normalizeStrategyProfilesPayload,
15081516
requireSameOrigin,

0 commit comments

Comments
 (0)