@yuants/app-virtual-exchange 0.1.1 → 0.2.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/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { readSecret, writeSecret } from '@yuants/secret';
3
3
  import { escapeSQL, requestSQL } from '@yuants/sql';
4
4
  import { defer, mergeMap, retry, timer } from 'rxjs';
5
5
  const terminal = Terminal.fromNodeEnv();
6
- const mapAccountIdToCredential = new Map();
6
+ const mapCredentialIdToCredential = new Map();
7
7
  // 1. RegisterExchangeCredential
8
8
  terminal.server.provideService('VirtualExchange/RegisterExchangeCredential', {
9
9
  type: 'object',
@@ -34,6 +34,9 @@ terminal.server.provideService('VirtualExchange/ListExchangeCredential', {}, asy
34
34
  }
35
35
  return { res: { code: 0, message: 'OK', data: credentials } };
36
36
  });
37
+ terminal.server.provideService('VirtualExchange/ListCredentials', {}, async () => {
38
+ return { res: { code: 0, message: 'OK', data: [...mapCredentialIdToCredential.keys()] } };
39
+ });
37
40
  // 9. Background listWatch
38
41
  const updateIndex = async () => {
39
42
  const secrets = await requestSQL(terminal, `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(terminal.keyPair.public_key)}`);
@@ -41,12 +44,11 @@ const updateIndex = async () => {
41
44
  try {
42
45
  const decrypted = await readSecret(terminal, secret);
43
46
  const credential = JSON.parse(new TextDecoder().decode(decrypted));
44
- // Call ListAccounts to get account_ids
45
- const res = await terminal.client.requestForResponse('ListAccounts', { credential });
47
+ // Call GetCredentialId to get credential id
48
+ const res = await terminal.client.requestForResponse('GetCredentialId', { credential });
46
49
  if (res.code === 0 && res.data) {
47
- for (const account of res.data) {
48
- mapAccountIdToCredential.set(account.account_id, credential);
49
- }
50
+ const credentialId = res.data;
51
+ mapCredentialIdToCredential.set(credentialId, credential);
50
52
  }
51
53
  }
52
54
  catch (e) {
@@ -58,37 +60,53 @@ const updateIndex = async () => {
58
60
  timer(0, 60000)
59
61
  .pipe(mergeMap(() => defer(updateIndex).pipe(retry({ delay: 5000 }))))
60
62
  .subscribe();
61
- // 7. QueryAccounts
62
- terminal.server.provideService('VirtualExchange/QueryAccounts', {}, async () => {
63
- return { res: { code: 0, message: 'OK', data: Array.from(mapAccountIdToCredential.keys()) } };
64
- });
65
63
  // 8. QueryAccountInfo
66
- terminal.server.provideService('VirtualExchange/QueryAccountInfo', {
64
+ terminal.server.provideService('VirtualExchange/QueryPositions', {
67
65
  type: 'object',
68
- required: ['account_id'],
66
+ required: ['credential_id'],
69
67
  properties: {
70
- account_id: { type: 'string' },
68
+ credential_id: { type: 'string' },
69
+ product_id: { type: 'string' },
71
70
  },
72
71
  }, async (msg) => {
73
- const credential = mapAccountIdToCredential.get(msg.req.account_id);
72
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
74
73
  if (!credential) {
75
- return { res: { code: 404, message: 'Account not found' } };
74
+ return { res: { code: 404, message: 'Credential not found' } };
76
75
  }
77
- const res = await terminal.client.requestForResponse('GetAccountInfo', { credential, account_id: msg.req.account_id });
76
+ const res = await terminal.client.requestForResponse('QueryPositions', { credential, product_id: msg.req.product_id });
77
+ return { res };
78
+ });
79
+ terminal.server.provideService('VirtualExchange/QueryOrders', {
80
+ type: 'object',
81
+ required: ['credential_id'],
82
+ properties: {
83
+ credential_id: { type: 'string' },
84
+ product_id: { type: 'string' },
85
+ },
86
+ }, async (msg) => {
87
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
88
+ if (!credential) {
89
+ return { res: { code: 404, message: 'Credential not found' } };
90
+ }
91
+ const res = await terminal.client.requestForResponse('QueryOrders', {
92
+ credential,
93
+ product_id: msg.req.product_id,
94
+ });
78
95
  return { res };
79
96
  });
80
97
  // 10. Proxy Orders
81
98
  // SubmitOrder
82
99
  terminal.server.provideService('VirtualExchange/SubmitOrder', {
83
100
  type: 'object',
84
- required: ['order'],
101
+ required: ['order', 'credential_id'],
85
102
  properties: {
86
103
  order: { type: 'object' },
104
+ credential_id: { type: 'string' },
87
105
  },
88
106
  }, async (msg) => {
89
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
107
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
90
108
  if (!credential) {
91
- return { res: { code: 404, message: 'Account not found' } };
109
+ return { res: { code: 404, message: 'Credential not found' } };
92
110
  }
93
111
  const res = await terminal.client.requestForResponse('SubmitOrder', { credential, order: msg.req.order });
94
112
  return { res };
@@ -96,14 +114,15 @@ terminal.server.provideService('VirtualExchange/SubmitOrder', {
96
114
  // ModifyOrder
97
115
  terminal.server.provideService('VirtualExchange/ModifyOrder', {
98
116
  type: 'object',
99
- required: ['order'],
117
+ required: ['order', 'credential_id'],
100
118
  properties: {
101
119
  order: { type: 'object' },
120
+ credential_id: { type: 'string' },
102
121
  },
103
122
  }, async (msg) => {
104
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
123
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
105
124
  if (!credential) {
106
- return { res: { code: 404, message: 'Account not found' } };
125
+ return { res: { code: 404, message: 'Credential not found' } };
107
126
  }
108
127
  const res = await terminal.client.requestForResponse('ModifyOrder', { credential, order: msg.req.order });
109
128
  return { res };
@@ -111,34 +130,18 @@ terminal.server.provideService('VirtualExchange/ModifyOrder', {
111
130
  // CancelOrder
112
131
  terminal.server.provideService('VirtualExchange/CancelOrder', {
113
132
  type: 'object',
114
- required: ['order'],
133
+ required: ['order', 'credential_id'],
115
134
  properties: {
116
135
  order: { type: 'object' },
136
+ credential_id: { type: 'string' },
117
137
  },
118
138
  }, async (msg) => {
119
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
139
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
120
140
  if (!credential) {
121
- return { res: { code: 404, message: 'Account not found' } };
141
+ return { res: { code: 404, message: 'Credential not found' } };
122
142
  }
123
143
  const res = await terminal.client.requestForResponse('CancelOrder', { credential, order: msg.req.order });
124
144
  return { res };
125
145
  });
126
146
  // ListOrders
127
- terminal.server.provideService('VirtualExchange/ListOrders', {
128
- type: 'object',
129
- required: ['account_id'],
130
- properties: {
131
- account_id: { type: 'string' },
132
- },
133
- }, async (msg) => {
134
- const credential = mapAccountIdToCredential.get(msg.req.account_id);
135
- if (!credential) {
136
- return { res: { code: 404, message: 'Account not found' } };
137
- }
138
- const res = await terminal.client.requestForResponse('ListOrders', {
139
- credential,
140
- account_id: msg.req.account_id,
141
- });
142
- return { res };
143
- });
144
147
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAW,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAErD,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;AAOxC,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExE,gCAAgC;AAChC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,4CAA4C,EAC5C;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACxE,MAAM,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,UAAU,CAAC,CAAC;IACtG,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AAC7C,CAAC,CACF,CAAC;AAEF,4BAA4B;AAC5B,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,wCAAwC,EACxC,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,QAAQ,EACR,iFAAiF,SAAS,CACxF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAC5B,EAAE,CACJ,CAAC;IACF,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC9B;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;SAC9C;KACF;IACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;AAChE,CAAC,CACF,CAAC;AAEF,0BAA0B;AAC1B,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IAC7B,MAAM,OAAO,GAAG,MAAM,UAAU,CAC9B,QAAQ,EACR,iFAAiF,SAAS,CACxF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAC5B,EAAE,CACJ,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAwB,CAAC;YAE1F,uCAAuC;YACvC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAElC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC9B,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;oBAC9B,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;iBAC9D;aACF;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;SAC9C;KACF;AACH,CAAC,CAAC;AAEF,+BAA+B;AAC/B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;KACZ,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACrE,SAAS,EAAE,CAAC;AAEf,mBAAmB;AACnB,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAiB,+BAA+B,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;IAC7F,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,kCAAkC,EAClC;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,gBAAgB,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,mBAAmB;AACnB,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,aAAa;AACb,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,4BAA4B,EAC5B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,YAAY,EAAE;QACd,UAAU;QACV,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC","sourcesContent":["import { IAccountInfo } from '@yuants/data-account';\nimport { IOrder, ITypedCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ISecret, readSecret, writeSecret } from '@yuants/secret';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { defer, mergeMap, retry, timer } from 'rxjs';\n\nconst terminal = Terminal.fromNodeEnv();\n\ninterface IExchangeCredential {\n type: string;\n payload: any;\n}\n\nconst mapAccountIdToCredential = new Map<string, IExchangeCredential>();\n\n// 1. RegisterExchangeCredential\nterminal.server.provideService<IExchangeCredential, void>(\n 'VirtualExchange/RegisterExchangeCredential',\n {\n type: 'object',\n required: ['type', 'payload'],\n properties: {\n type: { type: 'string' },\n payload: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = msg.req;\n const secretData = new TextEncoder().encode(JSON.stringify(credential));\n await writeSecret(terminal, terminal.keyPair.public_key, { type: 'exchange_credential' }, secretData);\n return { res: { code: 0, message: 'OK' } };\n },\n);\n\n// 2. ListExchangeCredential\nterminal.server.provideService<void, IExchangeCredential[]>(\n 'VirtualExchange/ListExchangeCredential',\n {},\n async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n const credentials: IExchangeCredential[] = [];\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted));\n credentials.push(credential);\n } catch (e) {\n console.error('Failed to decrypt secret', e);\n }\n }\n return { res: { code: 0, message: 'OK', data: credentials } };\n },\n);\n\n// 9. Background listWatch\nconst updateIndex = async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted)) as IExchangeCredential;\n\n // Call ListAccounts to get account_ids\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any> },\n Array<{ account_id: string }>\n >('ListAccounts', { credential });\n\n if (res.code === 0 && res.data) {\n for (const account of res.data) {\n mapAccountIdToCredential.set(account.account_id, credential);\n }\n }\n } catch (e) {\n console.error('Failed to process secret', e);\n }\n }\n};\n\n// Run updateIndex periodically\ntimer(0, 60000)\n .pipe(mergeMap(() => defer(updateIndex).pipe(retry({ delay: 5000 }))))\n .subscribe();\n\n// 7. QueryAccounts\nterminal.server.provideService<void, string[]>('VirtualExchange/QueryAccounts', {}, async () => {\n return { res: { code: 0, message: 'OK', data: Array.from(mapAccountIdToCredential.keys()) } };\n});\n\n// 8. QueryAccountInfo\nterminal.server.provideService<{ account_id: string }, IAccountInfo>(\n 'VirtualExchange/QueryAccountInfo',\n {\n type: 'object',\n required: ['account_id'],\n properties: {\n account_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; account_id: string },\n IAccountInfo\n >('GetAccountInfo', { credential, account_id: msg.req.account_id });\n return { res };\n },\n);\n\n// 10. Proxy Orders\n// SubmitOrder\nterminal.server.provideService<{ order: IOrder }, { order_id: string }>(\n 'VirtualExchange/SubmitOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n { order_id: string }\n >('SubmitOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ModifyOrder\nterminal.server.provideService<{ order: IOrder }, void>(\n 'VirtualExchange/ModifyOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('ModifyOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// CancelOrder\nterminal.server.provideService<{ order: IOrder }, void>(\n 'VirtualExchange/CancelOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('CancelOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ListOrders\nterminal.server.provideService<{ account_id: string }, { orders: IOrder[] }>(\n 'VirtualExchange/ListOrders',\n {\n type: 'object',\n required: ['account_id'],\n properties: {\n account_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; account_id: string },\n { orders: IOrder[] }\n >('ListOrders', {\n credential,\n account_id: msg.req.account_id,\n });\n return { res };\n },\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IAccountInfo } from '@yuants/data-account';\nimport { IOrder, ITypedCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ISecret, readSecret, writeSecret } from '@yuants/secret';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { defer, mergeMap, retry, timer } from 'rxjs';\n\nconst terminal = Terminal.fromNodeEnv();\n\ninterface IExchangeCredential {\n type: string;\n payload: any;\n}\n\nconst mapCredentialIdToCredential = new Map<string, IExchangeCredential>();\n\n// 1. RegisterExchangeCredential\nterminal.server.provideService<IExchangeCredential, void>(\n 'VirtualExchange/RegisterExchangeCredential',\n {\n type: 'object',\n required: ['type', 'payload'],\n properties: {\n type: { type: 'string' },\n payload: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = msg.req;\n const secretData = new TextEncoder().encode(JSON.stringify(credential));\n await writeSecret(terminal, terminal.keyPair.public_key, { type: 'exchange_credential' }, secretData);\n return { res: { code: 0, message: 'OK' } };\n },\n);\n\n// 2. ListExchangeCredential\nterminal.server.provideService<void, IExchangeCredential[]>(\n 'VirtualExchange/ListExchangeCredential',\n {},\n async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n const credentials: IExchangeCredential[] = [];\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted));\n credentials.push(credential);\n } catch (e) {\n console.error('Failed to decrypt secret', e);\n }\n }\n return { res: { code: 0, message: 'OK', data: credentials } };\n },\n);\n\nterminal.server.provideService<void, string[]>('VirtualExchange/ListCredentials', {}, async () => {\n return { res: { code: 0, message: 'OK', data: [...mapCredentialIdToCredential.keys()] } };\n});\n\n// 9. Background listWatch\nconst updateIndex = async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted)) as IExchangeCredential;\n\n // Call GetCredentialId to get credential id\n const res = await terminal.client.requestForResponse<{ credential: ITypedCredential<any> }, string>(\n 'GetCredentialId',\n { credential },\n );\n\n if (res.code === 0 && res.data) {\n const credentialId = res.data;\n mapCredentialIdToCredential.set(credentialId, credential);\n }\n } catch (e) {\n console.error('Failed to process secret', e);\n }\n }\n};\n\n// Run updateIndex periodically\ntimer(0, 60000)\n .pipe(mergeMap(() => defer(updateIndex).pipe(retry({ delay: 5000 }))))\n .subscribe();\n\n// 8. QueryAccountInfo\nterminal.server.provideService<{ credential_id: string; product_id?: string }, IAccountInfo>(\n 'VirtualExchange/QueryPositions',\n {\n type: 'object',\n required: ['credential_id'],\n properties: {\n credential_id: { type: 'string' },\n product_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; product_id?: string },\n IAccountInfo\n >('QueryPositions', { credential, product_id: msg.req.product_id });\n return { res };\n },\n);\n\nterminal.server.provideService<{ credential_id: string; product_id?: string }, { orders: IOrder[] }>(\n 'VirtualExchange/QueryOrders',\n {\n type: 'object',\n required: ['credential_id'],\n properties: {\n credential_id: { type: 'string' },\n product_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; product_id?: string },\n { orders: IOrder[] }\n >('QueryOrders', {\n credential,\n product_id: msg.req.product_id,\n });\n return { res };\n },\n);\n\n// 10. Proxy Orders\n// SubmitOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, { order_id: string }>(\n 'VirtualExchange/SubmitOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n { order_id: string }\n >('SubmitOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ModifyOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, void>(\n 'VirtualExchange/ModifyOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('ModifyOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// CancelOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, void>(\n 'VirtualExchange/CancelOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('CancelOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ListOrders\n"]}
package/lib/index.js CHANGED
@@ -5,7 +5,7 @@ const secret_1 = require("@yuants/secret");
5
5
  const sql_1 = require("@yuants/sql");
6
6
  const rxjs_1 = require("rxjs");
7
7
  const terminal = protocol_1.Terminal.fromNodeEnv();
8
- const mapAccountIdToCredential = new Map();
8
+ const mapCredentialIdToCredential = new Map();
9
9
  // 1. RegisterExchangeCredential
10
10
  terminal.server.provideService('VirtualExchange/RegisterExchangeCredential', {
11
11
  type: 'object',
@@ -36,6 +36,9 @@ terminal.server.provideService('VirtualExchange/ListExchangeCredential', {}, asy
36
36
  }
37
37
  return { res: { code: 0, message: 'OK', data: credentials } };
38
38
  });
39
+ terminal.server.provideService('VirtualExchange/ListCredentials', {}, async () => {
40
+ return { res: { code: 0, message: 'OK', data: [...mapCredentialIdToCredential.keys()] } };
41
+ });
39
42
  // 9. Background listWatch
40
43
  const updateIndex = async () => {
41
44
  const secrets = await (0, sql_1.requestSQL)(terminal, `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${(0, sql_1.escapeSQL)(terminal.keyPair.public_key)}`);
@@ -43,12 +46,11 @@ const updateIndex = async () => {
43
46
  try {
44
47
  const decrypted = await (0, secret_1.readSecret)(terminal, secret);
45
48
  const credential = JSON.parse(new TextDecoder().decode(decrypted));
46
- // Call ListAccounts to get account_ids
47
- const res = await terminal.client.requestForResponse('ListAccounts', { credential });
49
+ // Call GetCredentialId to get credential id
50
+ const res = await terminal.client.requestForResponse('GetCredentialId', { credential });
48
51
  if (res.code === 0 && res.data) {
49
- for (const account of res.data) {
50
- mapAccountIdToCredential.set(account.account_id, credential);
51
- }
52
+ const credentialId = res.data;
53
+ mapCredentialIdToCredential.set(credentialId, credential);
52
54
  }
53
55
  }
54
56
  catch (e) {
@@ -60,37 +62,53 @@ const updateIndex = async () => {
60
62
  (0, rxjs_1.timer)(0, 60000)
61
63
  .pipe((0, rxjs_1.mergeMap)(() => (0, rxjs_1.defer)(updateIndex).pipe((0, rxjs_1.retry)({ delay: 5000 }))))
62
64
  .subscribe();
63
- // 7. QueryAccounts
64
- terminal.server.provideService('VirtualExchange/QueryAccounts', {}, async () => {
65
- return { res: { code: 0, message: 'OK', data: Array.from(mapAccountIdToCredential.keys()) } };
66
- });
67
65
  // 8. QueryAccountInfo
68
- terminal.server.provideService('VirtualExchange/QueryAccountInfo', {
66
+ terminal.server.provideService('VirtualExchange/QueryPositions', {
69
67
  type: 'object',
70
- required: ['account_id'],
68
+ required: ['credential_id'],
71
69
  properties: {
72
- account_id: { type: 'string' },
70
+ credential_id: { type: 'string' },
71
+ product_id: { type: 'string' },
73
72
  },
74
73
  }, async (msg) => {
75
- const credential = mapAccountIdToCredential.get(msg.req.account_id);
74
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
76
75
  if (!credential) {
77
- return { res: { code: 404, message: 'Account not found' } };
76
+ return { res: { code: 404, message: 'Credential not found' } };
78
77
  }
79
- const res = await terminal.client.requestForResponse('GetAccountInfo', { credential, account_id: msg.req.account_id });
78
+ const res = await terminal.client.requestForResponse('QueryPositions', { credential, product_id: msg.req.product_id });
79
+ return { res };
80
+ });
81
+ terminal.server.provideService('VirtualExchange/QueryOrders', {
82
+ type: 'object',
83
+ required: ['credential_id'],
84
+ properties: {
85
+ credential_id: { type: 'string' },
86
+ product_id: { type: 'string' },
87
+ },
88
+ }, async (msg) => {
89
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
90
+ if (!credential) {
91
+ return { res: { code: 404, message: 'Credential not found' } };
92
+ }
93
+ const res = await terminal.client.requestForResponse('QueryOrders', {
94
+ credential,
95
+ product_id: msg.req.product_id,
96
+ });
80
97
  return { res };
81
98
  });
82
99
  // 10. Proxy Orders
83
100
  // SubmitOrder
84
101
  terminal.server.provideService('VirtualExchange/SubmitOrder', {
85
102
  type: 'object',
86
- required: ['order'],
103
+ required: ['order', 'credential_id'],
87
104
  properties: {
88
105
  order: { type: 'object' },
106
+ credential_id: { type: 'string' },
89
107
  },
90
108
  }, async (msg) => {
91
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
109
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
92
110
  if (!credential) {
93
- return { res: { code: 404, message: 'Account not found' } };
111
+ return { res: { code: 404, message: 'Credential not found' } };
94
112
  }
95
113
  const res = await terminal.client.requestForResponse('SubmitOrder', { credential, order: msg.req.order });
96
114
  return { res };
@@ -98,14 +116,15 @@ terminal.server.provideService('VirtualExchange/SubmitOrder', {
98
116
  // ModifyOrder
99
117
  terminal.server.provideService('VirtualExchange/ModifyOrder', {
100
118
  type: 'object',
101
- required: ['order'],
119
+ required: ['order', 'credential_id'],
102
120
  properties: {
103
121
  order: { type: 'object' },
122
+ credential_id: { type: 'string' },
104
123
  },
105
124
  }, async (msg) => {
106
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
125
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
107
126
  if (!credential) {
108
- return { res: { code: 404, message: 'Account not found' } };
127
+ return { res: { code: 404, message: 'Credential not found' } };
109
128
  }
110
129
  const res = await terminal.client.requestForResponse('ModifyOrder', { credential, order: msg.req.order });
111
130
  return { res };
@@ -113,34 +132,18 @@ terminal.server.provideService('VirtualExchange/ModifyOrder', {
113
132
  // CancelOrder
114
133
  terminal.server.provideService('VirtualExchange/CancelOrder', {
115
134
  type: 'object',
116
- required: ['order'],
135
+ required: ['order', 'credential_id'],
117
136
  properties: {
118
137
  order: { type: 'object' },
138
+ credential_id: { type: 'string' },
119
139
  },
120
140
  }, async (msg) => {
121
- const credential = mapAccountIdToCredential.get(msg.req.order.account_id);
141
+ const credential = mapCredentialIdToCredential.get(msg.req.credential_id);
122
142
  if (!credential) {
123
- return { res: { code: 404, message: 'Account not found' } };
143
+ return { res: { code: 404, message: 'Credential not found' } };
124
144
  }
125
145
  const res = await terminal.client.requestForResponse('CancelOrder', { credential, order: msg.req.order });
126
146
  return { res };
127
147
  });
128
148
  // ListOrders
129
- terminal.server.provideService('VirtualExchange/ListOrders', {
130
- type: 'object',
131
- required: ['account_id'],
132
- properties: {
133
- account_id: { type: 'string' },
134
- },
135
- }, async (msg) => {
136
- const credential = mapAccountIdToCredential.get(msg.req.account_id);
137
- if (!credential) {
138
- return { res: { code: 404, message: 'Account not found' } };
139
- }
140
- const res = await terminal.client.requestForResponse('ListOrders', {
141
- credential,
142
- account_id: msg.req.account_id,
143
- });
144
- return { res };
145
- });
146
149
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAEA,+CAA4C;AAC5C,2CAAkE;AAClE,qCAAoD;AACpD,+BAAqD;AAErD,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAOxC,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAA+B,CAAC;AAExE,gCAAgC;AAChC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,4CAA4C,EAC5C;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC5B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACxE,MAAM,IAAA,oBAAW,EAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,EAAE,UAAU,CAAC,CAAC;IACtG,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AAC7C,CAAC,CACF,CAAC;AAEF,4BAA4B;AAC5B,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,wCAAwC,EACxC,EAAE,EACF,KAAK,IAAI,EAAE;IACT,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,EAC9B,QAAQ,EACR,iFAAiF,IAAA,eAAS,EACxF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAC5B,EAAE,CACJ,CAAC;IACF,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACnE,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC9B;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;SAC9C;KACF;IACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;AAChE,CAAC,CACF,CAAC;AAEF,0BAA0B;AAC1B,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;IAC7B,MAAM,OAAO,GAAG,MAAM,IAAA,gBAAU,EAC9B,QAAQ,EACR,iFAAiF,IAAA,eAAS,EACxF,QAAQ,CAAC,OAAO,CAAC,UAAU,CAC5B,EAAE,CACJ,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,IAAA,mBAAU,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAwB,CAAC;YAE1F,uCAAuC;YACvC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAElC,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE;gBAC9B,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE;oBAC9B,wBAAwB,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;iBAC9D;aACF;SACF;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;SAC9C;KACF;AACH,CAAC,CAAC;AAEF,+BAA+B;AAC/B,IAAA,YAAK,EAAC,CAAC,EAAE,KAAK,CAAC;KACZ,IAAI,CAAC,IAAA,eAAQ,EAAC,GAAG,EAAE,CAAC,IAAA,YAAK,EAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAA,YAAK,EAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;KACrE,SAAS,EAAE,CAAC;AAEf,mBAAmB;AACnB,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAiB,+BAA+B,EAAE,EAAE,EAAE,KAAK,IAAI,EAAE;IAC7F,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;AAChG,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,kCAAkC,EAClC;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,gBAAgB,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACpE,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,mBAAmB;AACnB,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,cAAc;AACd,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,6BAA6B,EAC7B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC1B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC;AAEF,aAAa;AACb,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,4BAA4B,EAC5B;IACE,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,YAAY,CAAC;IACxB,UAAU,EAAE;QACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B;CACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;IACZ,MAAM,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,CAAC;KAC7D;IACD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,kBAAkB,CAGlD,YAAY,EAAE;QACd,UAAU;QACV,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU;KAC/B,CAAC,CAAC;IACH,OAAO,EAAE,GAAG,EAAE,CAAC;AACjB,CAAC,CACF,CAAC","sourcesContent":["import { IAccountInfo } from '@yuants/data-account';\nimport { IOrder, ITypedCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ISecret, readSecret, writeSecret } from '@yuants/secret';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { defer, mergeMap, retry, timer } from 'rxjs';\n\nconst terminal = Terminal.fromNodeEnv();\n\ninterface IExchangeCredential {\n type: string;\n payload: any;\n}\n\nconst mapAccountIdToCredential = new Map<string, IExchangeCredential>();\n\n// 1. RegisterExchangeCredential\nterminal.server.provideService<IExchangeCredential, void>(\n 'VirtualExchange/RegisterExchangeCredential',\n {\n type: 'object',\n required: ['type', 'payload'],\n properties: {\n type: { type: 'string' },\n payload: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = msg.req;\n const secretData = new TextEncoder().encode(JSON.stringify(credential));\n await writeSecret(terminal, terminal.keyPair.public_key, { type: 'exchange_credential' }, secretData);\n return { res: { code: 0, message: 'OK' } };\n },\n);\n\n// 2. ListExchangeCredential\nterminal.server.provideService<void, IExchangeCredential[]>(\n 'VirtualExchange/ListExchangeCredential',\n {},\n async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n const credentials: IExchangeCredential[] = [];\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted));\n credentials.push(credential);\n } catch (e) {\n console.error('Failed to decrypt secret', e);\n }\n }\n return { res: { code: 0, message: 'OK', data: credentials } };\n },\n);\n\n// 9. Background listWatch\nconst updateIndex = async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted)) as IExchangeCredential;\n\n // Call ListAccounts to get account_ids\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any> },\n Array<{ account_id: string }>\n >('ListAccounts', { credential });\n\n if (res.code === 0 && res.data) {\n for (const account of res.data) {\n mapAccountIdToCredential.set(account.account_id, credential);\n }\n }\n } catch (e) {\n console.error('Failed to process secret', e);\n }\n }\n};\n\n// Run updateIndex periodically\ntimer(0, 60000)\n .pipe(mergeMap(() => defer(updateIndex).pipe(retry({ delay: 5000 }))))\n .subscribe();\n\n// 7. QueryAccounts\nterminal.server.provideService<void, string[]>('VirtualExchange/QueryAccounts', {}, async () => {\n return { res: { code: 0, message: 'OK', data: Array.from(mapAccountIdToCredential.keys()) } };\n});\n\n// 8. QueryAccountInfo\nterminal.server.provideService<{ account_id: string }, IAccountInfo>(\n 'VirtualExchange/QueryAccountInfo',\n {\n type: 'object',\n required: ['account_id'],\n properties: {\n account_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; account_id: string },\n IAccountInfo\n >('GetAccountInfo', { credential, account_id: msg.req.account_id });\n return { res };\n },\n);\n\n// 10. Proxy Orders\n// SubmitOrder\nterminal.server.provideService<{ order: IOrder }, { order_id: string }>(\n 'VirtualExchange/SubmitOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n { order_id: string }\n >('SubmitOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ModifyOrder\nterminal.server.provideService<{ order: IOrder }, void>(\n 'VirtualExchange/ModifyOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('ModifyOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// CancelOrder\nterminal.server.provideService<{ order: IOrder }, void>(\n 'VirtualExchange/CancelOrder',\n {\n type: 'object',\n required: ['order'],\n properties: {\n order: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.order.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('CancelOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ListOrders\nterminal.server.provideService<{ account_id: string }, { orders: IOrder[] }>(\n 'VirtualExchange/ListOrders',\n {\n type: 'object',\n required: ['account_id'],\n properties: {\n account_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapAccountIdToCredential.get(msg.req.account_id);\n if (!credential) {\n return { res: { code: 404, message: 'Account not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; account_id: string },\n { orders: IOrder[] }\n >('ListOrders', {\n credential,\n account_id: msg.req.account_id,\n });\n return { res };\n },\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { IAccountInfo } from '@yuants/data-account';\nimport { IOrder, ITypedCredential } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { ISecret, readSecret, writeSecret } from '@yuants/secret';\nimport { escapeSQL, requestSQL } from '@yuants/sql';\nimport { defer, mergeMap, retry, timer } from 'rxjs';\n\nconst terminal = Terminal.fromNodeEnv();\n\ninterface IExchangeCredential {\n type: string;\n payload: any;\n}\n\nconst mapCredentialIdToCredential = new Map<string, IExchangeCredential>();\n\n// 1. RegisterExchangeCredential\nterminal.server.provideService<IExchangeCredential, void>(\n 'VirtualExchange/RegisterExchangeCredential',\n {\n type: 'object',\n required: ['type', 'payload'],\n properties: {\n type: { type: 'string' },\n payload: { type: 'object' },\n },\n },\n async (msg) => {\n const credential = msg.req;\n const secretData = new TextEncoder().encode(JSON.stringify(credential));\n await writeSecret(terminal, terminal.keyPair.public_key, { type: 'exchange_credential' }, secretData);\n return { res: { code: 0, message: 'OK' } };\n },\n);\n\n// 2. ListExchangeCredential\nterminal.server.provideService<void, IExchangeCredential[]>(\n 'VirtualExchange/ListExchangeCredential',\n {},\n async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n const credentials: IExchangeCredential[] = [];\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted));\n credentials.push(credential);\n } catch (e) {\n console.error('Failed to decrypt secret', e);\n }\n }\n return { res: { code: 0, message: 'OK', data: credentials } };\n },\n);\n\nterminal.server.provideService<void, string[]>('VirtualExchange/ListCredentials', {}, async () => {\n return { res: { code: 0, message: 'OK', data: [...mapCredentialIdToCredential.keys()] } };\n});\n\n// 9. Background listWatch\nconst updateIndex = async () => {\n const secrets = await requestSQL<ISecret[]>(\n terminal,\n `select * from secret where tags->>'type' = 'exchange_credential' and reader = ${escapeSQL(\n terminal.keyPair.public_key,\n )}`,\n );\n for (const secret of secrets) {\n try {\n const decrypted = await readSecret(terminal, secret);\n const credential = JSON.parse(new TextDecoder().decode(decrypted)) as IExchangeCredential;\n\n // Call GetCredentialId to get credential id\n const res = await terminal.client.requestForResponse<{ credential: ITypedCredential<any> }, string>(\n 'GetCredentialId',\n { credential },\n );\n\n if (res.code === 0 && res.data) {\n const credentialId = res.data;\n mapCredentialIdToCredential.set(credentialId, credential);\n }\n } catch (e) {\n console.error('Failed to process secret', e);\n }\n }\n};\n\n// Run updateIndex periodically\ntimer(0, 60000)\n .pipe(mergeMap(() => defer(updateIndex).pipe(retry({ delay: 5000 }))))\n .subscribe();\n\n// 8. QueryAccountInfo\nterminal.server.provideService<{ credential_id: string; product_id?: string }, IAccountInfo>(\n 'VirtualExchange/QueryPositions',\n {\n type: 'object',\n required: ['credential_id'],\n properties: {\n credential_id: { type: 'string' },\n product_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; product_id?: string },\n IAccountInfo\n >('QueryPositions', { credential, product_id: msg.req.product_id });\n return { res };\n },\n);\n\nterminal.server.provideService<{ credential_id: string; product_id?: string }, { orders: IOrder[] }>(\n 'VirtualExchange/QueryOrders',\n {\n type: 'object',\n required: ['credential_id'],\n properties: {\n credential_id: { type: 'string' },\n product_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; product_id?: string },\n { orders: IOrder[] }\n >('QueryOrders', {\n credential,\n product_id: msg.req.product_id,\n });\n return { res };\n },\n);\n\n// 10. Proxy Orders\n// SubmitOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, { order_id: string }>(\n 'VirtualExchange/SubmitOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n { order_id: string }\n >('SubmitOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ModifyOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, void>(\n 'VirtualExchange/ModifyOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('ModifyOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// CancelOrder\nterminal.server.provideService<{ order: IOrder; credential_id: string }, void>(\n 'VirtualExchange/CancelOrder',\n {\n type: 'object',\n required: ['order', 'credential_id'],\n properties: {\n order: { type: 'object' },\n credential_id: { type: 'string' },\n },\n },\n async (msg) => {\n const credential = mapCredentialIdToCredential.get(msg.req.credential_id);\n if (!credential) {\n return { res: { code: 404, message: 'Credential not found' } };\n }\n const res = await terminal.client.requestForResponse<\n { credential: ITypedCredential<any>; order: IOrder },\n void\n >('CancelOrder', { credential, order: msg.req.order });\n return { res };\n },\n);\n\n// ListOrders\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuants/app-virtual-exchange",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "main": "lib/index.js",
5
5
  "files": [
6
6
  "dist",
@@ -1,13 +1,13 @@
1
1
  {
2
- "apps/virtual-exchange/CHANGELOG.json": "8033344e4607e6354c35ed3f68ba1ce56445bca2",
3
- "apps/virtual-exchange/CHANGELOG.md": "baaf1ed3cd03d00604eac50c421f88d4d577dd4c",
2
+ "apps/virtual-exchange/CHANGELOG.json": "2cd374d6d4056bd811d5d5203b1d42bb384ca5c3",
3
+ "apps/virtual-exchange/CHANGELOG.md": "b6255a27348857b64bff46895baada2240aefc99",
4
4
  "apps/virtual-exchange/api-extractor.json": "62f4fd324425b9a235f0c117975967aab09ced0c",
5
5
  "apps/virtual-exchange/config/jest.config.json": "4bb17bde3ee911163a3edb36a6eb71491d80b1bd",
6
6
  "apps/virtual-exchange/config/rig.json": "f6c7b5537dc77a3170ba9f008bae3b6c3ee11956",
7
7
  "apps/virtual-exchange/config/typescript.json": "854907e8a821f2050f6533368db160c649c25348",
8
8
  "apps/virtual-exchange/etc/app-virtual-exchange.api.md": "6cb40ec1fa2d40a31a7b0dd3f02b8b24a4d7c4de",
9
- "apps/virtual-exchange/package.json": "0d23c9918dc935add9fc7d657de6dab4ec09a36f",
10
- "apps/virtual-exchange/src/index.ts": "916b89869cd0bfe28837676d853e75136fe5a875",
9
+ "apps/virtual-exchange/package.json": "b88aa74b5095fe55485fe08ccd30ecc511c283ba",
10
+ "apps/virtual-exchange/src/index.ts": "8bc86fc3fdf97602be9772127fcec48f5edb5c6c",
11
11
  "apps/virtual-exchange/tsconfig.json": "22f94ca28b507f8ddcc21b9053158eefd3f726a9",
12
12
  "apps/virtual-exchange/.rush/temp/shrinkwrap-deps.json": "8c5c8eb58b6b8757344017c67c08f71d4e6dd4d7",
13
13
  "libraries/protocol/temp/package-deps.json": "00d9a96a90bfc0e57ef3b9547151f2970a600402",