@vuu-ui/vuu-data-test 0.13.12 → 0.13.14
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/cjs/Table.js +4 -2
- package/cjs/Table.js.map +1 -1
- package/cjs/TickingArrayDataSource.js +6 -0
- package/cjs/TickingArrayDataSource.js.map +1 -1
- package/cjs/simul/reference-data/parent-child-orders.js +92 -65
- package/cjs/simul/reference-data/parent-child-orders.js.map +1 -1
- package/cjs/simul/reference-data/prices.js +22 -2
- package/cjs/simul/reference-data/prices.js.map +1 -1
- package/cjs/simul/simul-module.js +36 -0
- package/cjs/simul/simul-module.js.map +1 -1
- package/cjs/simul/simul-schemas.js +9 -5
- package/cjs/simul/simul-schemas.js.map +1 -1
- package/esm/Table.js +4 -2
- package/esm/Table.js.map +1 -1
- package/esm/TickingArrayDataSource.js +6 -0
- package/esm/TickingArrayDataSource.js.map +1 -1
- package/esm/simul/reference-data/parent-child-orders.js +91 -64
- package/esm/simul/reference-data/parent-child-orders.js.map +1 -1
- package/esm/simul/reference-data/prices.js +22 -2
- package/esm/simul/reference-data/prices.js.map +1 -1
- package/esm/simul/simul-module.js +37 -1
- package/esm/simul/simul-module.js.map +1 -1
- package/esm/simul/simul-schemas.js +9 -5
- package/esm/simul/simul-schemas.js.map +1 -1
- package/package.json +6 -6
- package/types/Table.d.ts +1 -1
- package/types/TickingArrayDataSource.d.ts +2 -0
- package/types/simul/reference-data/parent-child-orders.d.ts +2 -4
- package/types/simul/reference-data/prices.d.ts +7 -1
package/cjs/Table.js
CHANGED
|
@@ -41,12 +41,14 @@ class Table extends vuuUtils.EventEmitter {
|
|
|
41
41
|
get schema() {
|
|
42
42
|
return __privateGet(this, _schema);
|
|
43
43
|
}
|
|
44
|
-
insert(row) {
|
|
44
|
+
insert(row, emitEvent = true) {
|
|
45
45
|
const index = __privateGet(this, _data).length;
|
|
46
46
|
__privateGet(this, _data).push(row);
|
|
47
47
|
const key = row[__privateGet(this, _indexOfKey)];
|
|
48
48
|
__privateGet(this, _index).set(key, index);
|
|
49
|
-
|
|
49
|
+
if (emitEvent) {
|
|
50
|
+
this.emit("insert", row);
|
|
51
|
+
}
|
|
50
52
|
}
|
|
51
53
|
findByKey(key) {
|
|
52
54
|
const index = __privateGet(this, _index).get(key) ?? -1;
|
package/cjs/Table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sources":["../src/Table.ts"],"sourcesContent":["import { SchemaColumn, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (row: VuuRowDataItemType[]) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (row: VuuRowDataItemType[], columnName?: string) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n insert(row: VuuRowDataItemType[]) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n this.emit(\"insert\", row);\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n\nconst getServerDataType = (\n columnName: string,\n { columns: cols1, table: t1 }: TableSchema,\n { columns: cols2, table: t2 }: TableSchema,\n) => {\n const col1 = cols1.find((col) => col.name === columnName);\n const col2 = cols2.find((col) => col.name === columnName);\n if (col1 && col2) {\n if (col1.serverDataType === col2.serverDataType) {\n return col1.serverDataType;\n } else {\n throw Error(\n `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`,\n );\n }\n } else if (col1) {\n return col1.serverDataType;\n } else if (col2) {\n return col2.serverDataType;\n } else {\n throw Error(`WTF how is this possible`);\n }\n};\n\n// Just copies source tables, then registers update listeners.\n// Not terribly efficient, but good enough for showcase\nexport const joinTables = (\n joinTable: VuuTable,\n table1: Table,\n table2: Table,\n joinColumn: string,\n) => {\n const { map: m1, schema: schema1 } = table1;\n const { map: m2, schema: schema2 } = table2;\n const k1 = m1[joinColumn];\n const k2 = m2[joinColumn];\n\n const combinedColumns = new Set(\n [...schema1.columns, ...schema2.columns].map((col) => col.name).sort(),\n );\n\n const combinedSchema: TableSchema = {\n key: joinColumn,\n table: joinTable,\n columns: Array.from(combinedColumns).map<SchemaColumn>((columnName) => ({\n name: columnName,\n serverDataType: getServerDataType(columnName, schema1, schema2),\n })),\n };\n\n const data: VuuRowDataItemType[][] = [];\n const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);\n // const start = performance.now();\n for (const row of table1.data) {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n\n data.push(out);\n }\n }\n // const end = performance.now();\n // console.log(`took ${end - start} ms to create join table ${joinTable.table}`);\n\n const newTable = new Table(combinedSchema, data, combinedColumnMap);\n\n table1.on(\"insert\", (row) => {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n newTable.insert(out);\n }\n });\n\n table2.on(\"update\", (row) => {\n const keyValue = row[k2] as string;\n const targetRow = newTable.findByKey(keyValue);\n if (targetRow) {\n const updatedRow = targetRow.slice();\n for (const { name } of table2.schema.columns) {\n if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {\n updatedRow[combinedColumnMap[name]] = row[m2[name]];\n }\n }\n newTable.updateRow(updatedRow);\n }\n });\n\n return newTable;\n};\n"],"names":["EventEmitter","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../src/Table.ts"],"sourcesContent":["import { SchemaColumn, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (row: VuuRowDataItemType[]) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (row: VuuRowDataItemType[], columnName?: string) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n insert(row: VuuRowDataItemType[], emitEvent = true) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n if (emitEvent) {\n this.emit(\"insert\", row);\n }\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n\nconst getServerDataType = (\n columnName: string,\n { columns: cols1, table: t1 }: TableSchema,\n { columns: cols2, table: t2 }: TableSchema,\n) => {\n const col1 = cols1.find((col) => col.name === columnName);\n const col2 = cols2.find((col) => col.name === columnName);\n if (col1 && col2) {\n if (col1.serverDataType === col2.serverDataType) {\n return col1.serverDataType;\n } else {\n throw Error(\n `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`,\n );\n }\n } else if (col1) {\n return col1.serverDataType;\n } else if (col2) {\n return col2.serverDataType;\n } else {\n throw Error(`WTF how is this possible`);\n }\n};\n\n// Just copies source tables, then registers update listeners.\n// Not terribly efficient, but good enough for showcase\nexport const joinTables = (\n joinTable: VuuTable,\n table1: Table,\n table2: Table,\n joinColumn: string,\n) => {\n const { map: m1, schema: schema1 } = table1;\n const { map: m2, schema: schema2 } = table2;\n const k1 = m1[joinColumn];\n const k2 = m2[joinColumn];\n\n const combinedColumns = new Set(\n [...schema1.columns, ...schema2.columns].map((col) => col.name).sort(),\n );\n\n const combinedSchema: TableSchema = {\n key: joinColumn,\n table: joinTable,\n columns: Array.from(combinedColumns).map<SchemaColumn>((columnName) => ({\n name: columnName,\n serverDataType: getServerDataType(columnName, schema1, schema2),\n })),\n };\n\n const data: VuuRowDataItemType[][] = [];\n const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);\n // const start = performance.now();\n for (const row of table1.data) {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n\n data.push(out);\n }\n }\n // const end = performance.now();\n // console.log(`took ${end - start} ms to create join table ${joinTable.table}`);\n\n const newTable = new Table(combinedSchema, data, combinedColumnMap);\n\n table1.on(\"insert\", (row) => {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n newTable.insert(out);\n }\n });\n\n table2.on(\"update\", (row) => {\n const keyValue = row[k2] as string;\n const targetRow = newTable.findByKey(keyValue);\n if (targetRow) {\n const updatedRow = targetRow.slice();\n for (const { name } of table2.schema.columns) {\n if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {\n updatedRow[combinedColumnMap[name]] = row[m2[name]];\n }\n }\n newTable.updateRow(updatedRow);\n }\n });\n\n return newTable;\n};\n"],"names":["EventEmitter","row"],"mappings":"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"}
|
|
@@ -194,6 +194,12 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
194
194
|
});
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
|
+
freeze() {
|
|
198
|
+
super.freeze();
|
|
199
|
+
}
|
|
200
|
+
unfreeze() {
|
|
201
|
+
super.unfreeze();
|
|
202
|
+
}
|
|
197
203
|
}
|
|
198
204
|
_menuRpcServices = new WeakMap();
|
|
199
205
|
_pendingVisualLink = new WeakMap();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceVisualLinkCreatedMessage,\n SelectionItem,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuRpcMenuRequest,\n LinkDescriptorWithLabel,\n RpcNamedParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuRpcResponse,\n VuuRpcMenuResponse,\n VuuRpcRequest,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isViewportRpcRequest,\n isVuuMenuRpcRequest,\n metadataKeys,\n Range,\n} from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport type VisualLinkHandler = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n) => Promise<DataSourceVisualLinkCreatedMessage | void>;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n getVisualLinks?: (tableName: string) => LinkDescriptorWithLabel[] | undefined;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n}\n\ntype LinkSubscription = {\n sourceColumnName?: string;\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n\n constructor({\n data,\n getVisualLinks,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n\n this.#menuRpcServices = menuRpcServices;\n this.#pendingVisualLink = visualLink;\n this.#rpcServices = rpcServices;\n this.#sessionTables = sessionTables;\n this.#table = table;\n this.#visualLinkService = visualLinkService;\n this.#getVisualLinks = getVisualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n\n return subscription;\n }\n\n unsubscribe() {\n super.unsubscribe();\n this.#table = undefined;\n }\n\n set range(range: Range) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n super.links = links;\n }\n\n get links() {\n return this.#getVisualLinks?.(this.table.table);\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n [],\n );\n }\n\n applyEdit(\n rowKey: string,\n columnName: string,\n value: VuuRowDataItemType,\n ): Promise<true> {\n this.#table?.update(rowKey, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends VuuRpcResponse = VuuRpcResponse>(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<T> {\n if (isViewportRpcRequest(rpcRequest)) {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService && isViewportRpcRequest(rpcRequest)) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n return rpcService.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n throw Error(`no implementation for PRC service ${rpcRequest.type}`);\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\"> & {\n namedParams?: RpcNamedParams;\n },\n ): Promise<VuuRpcResponse> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as VuuRpcMenuRequest).rpcName,\n );\n\n if (isVuuMenuRpcRequest(rpcRequest)) {\n return rpcService?.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<VuuRpcMenuResponse>;\n }\n\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\",\n );\n }\n }\n\n get visualLink() {\n return this._config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._config = {\n ...this._config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n childColumnName: fromColumn,\n type: \"CREATE_VISUAL_LINK\",\n parentVpId: parentClientVpId,\n parentColumnName: toColumn,\n }).then((response) => {\n this.emit(\n \"visual-link-created\",\n response as DataSourceVisualLinkCreatedMessage,\n );\n });\n }\n } else {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n type: \"REMOVE_VISUAL_LINK\",\n }).then((/* response */) => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n}\n"],"names":["metadataKeys","ArrayDataSource","isViewportRpcRequest","isVuuMenuRpcRequest","makeSuggestions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceVisualLinkCreatedMessage,\n SelectionItem,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuRpcMenuRequest,\n LinkDescriptorWithLabel,\n RpcNamedParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuRpcResponse,\n VuuRpcMenuResponse,\n VuuRpcRequest,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isViewportRpcRequest,\n isVuuMenuRpcRequest,\n metadataKeys,\n Range,\n} from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport type VisualLinkHandler = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n) => Promise<DataSourceVisualLinkCreatedMessage | void>;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n getVisualLinks?: (tableName: string) => LinkDescriptorWithLabel[] | undefined;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n}\n\ntype LinkSubscription = {\n sourceColumnName?: string;\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n\n constructor({\n data,\n getVisualLinks,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n\n this.#menuRpcServices = menuRpcServices;\n this.#pendingVisualLink = visualLink;\n this.#rpcServices = rpcServices;\n this.#sessionTables = sessionTables;\n this.#table = table;\n this.#visualLinkService = visualLinkService;\n this.#getVisualLinks = getVisualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n\n return subscription;\n }\n\n unsubscribe() {\n super.unsubscribe();\n this.#table = undefined;\n }\n\n set range(range: Range) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n super.links = links;\n }\n\n get links() {\n return this.#getVisualLinks?.(this.table.table);\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n [],\n );\n }\n\n applyEdit(\n rowKey: string,\n columnName: string,\n value: VuuRowDataItemType,\n ): Promise<true> {\n this.#table?.update(rowKey, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends VuuRpcResponse = VuuRpcResponse>(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<T> {\n if (isViewportRpcRequest(rpcRequest)) {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService && isViewportRpcRequest(rpcRequest)) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n return rpcService.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n throw Error(`no implementation for PRC service ${rpcRequest.type}`);\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\"> & {\n namedParams?: RpcNamedParams;\n },\n ): Promise<VuuRpcResponse> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as VuuRpcMenuRequest).rpcName,\n );\n\n if (isVuuMenuRpcRequest(rpcRequest)) {\n return rpcService?.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<VuuRpcMenuResponse>;\n }\n\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\",\n );\n }\n }\n\n get visualLink() {\n return this._config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._config = {\n ...this._config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n childColumnName: fromColumn,\n type: \"CREATE_VISUAL_LINK\",\n parentVpId: parentClientVpId,\n parentColumnName: toColumn,\n }).then((response) => {\n this.emit(\n \"visual-link-created\",\n response as DataSourceVisualLinkCreatedMessage,\n );\n });\n }\n } else {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n type: \"REMOVE_VISUAL_LINK\",\n }).then((/* response */) => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n\n freeze() {\n super.freeze();\n }\n\n unfreeze() {\n super.unfreeze();\n }\n}\n"],"names":["metadataKeys","ArrayDataSource","isViewportRpcRequest","isVuuMenuRpcRequest","makeSuggestions"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
3
4
|
var dataUtils = require('../../data-utils.js');
|
|
4
5
|
var Table = require('../../Table.js');
|
|
5
6
|
var simulSchemas = require('../simul-schemas.js');
|
|
@@ -9,19 +10,30 @@ var orderStatus = require('./orderStatus.js');
|
|
|
9
10
|
var sides = require('./sides.js');
|
|
10
11
|
var algos = require('./algos.js');
|
|
11
12
|
|
|
12
|
-
const childOrderData = [];
|
|
13
|
-
const parentOrderData = [];
|
|
14
13
|
const instrumentMap = Table.buildDataColumnMap(simulSchemas.schemas, "instruments");
|
|
15
|
-
const PARENT_ORDER_COUNT =
|
|
16
|
-
const CHILD_ORDER_COUNT =
|
|
14
|
+
const PARENT_ORDER_COUNT = 5e3;
|
|
15
|
+
const CHILD_ORDER_COUNT = 2e4;
|
|
17
16
|
const avgChildOrderPerOrder = Math.round(
|
|
18
17
|
CHILD_ORDER_COUNT / PARENT_ORDER_COUNT
|
|
19
18
|
);
|
|
20
19
|
const childMaxMultiple = 10;
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
const clock = new vuuUtils.Clock().goBack(120, "minutes");
|
|
21
|
+
console.log(`starting order generation at ${clock}`);
|
|
22
|
+
const parentOrdersTable = new Table.Table(
|
|
23
|
+
simulSchemas.schemas.parentOrders,
|
|
24
|
+
[],
|
|
25
|
+
Table.buildDataColumnMap(simulSchemas.schemas, "parentOrders")
|
|
26
|
+
);
|
|
27
|
+
const childOrdersTable = new Table.Table(
|
|
28
|
+
simulSchemas.schemas.childOrders,
|
|
29
|
+
[],
|
|
30
|
+
Table.buildDataColumnMap(simulSchemas.schemas, "childOrders")
|
|
31
|
+
);
|
|
32
|
+
let parentOrderCount = 0;
|
|
33
|
+
let childOrderCount = 0;
|
|
34
|
+
let notifyNewOrders = false;
|
|
35
|
+
function createParentAndChildOrders() {
|
|
36
|
+
parentOrderCount += 1;
|
|
25
37
|
const instrument = instruments.instrumentsData[dataUtils.random(0, instruments.instrumentsData.length - 1)];
|
|
26
38
|
const orderQuantity = 1e3 * dataUtils.random(1, 100);
|
|
27
39
|
const orderStatus$1 = orderStatus.orderStatus[dataUtils.random(0, orderStatus.orderStatus.length - 1)];
|
|
@@ -32,91 +44,106 @@ for (let i = 0; i < PARENT_ORDER_COUNT; i++) {
|
|
|
32
44
|
const averagePrice = 0;
|
|
33
45
|
const ccy = "GBP";
|
|
34
46
|
const exchange = instrument[instrumentMap.exchange];
|
|
35
|
-
const parentOrderIdAsInt =
|
|
36
|
-
const parentOrderId =
|
|
37
|
-
const lastUpdate = now;
|
|
47
|
+
const parentOrderIdAsInt = parentOrderCount;
|
|
48
|
+
const parentOrderId = parentOrderCount.toString().padStart(10, "0");
|
|
38
49
|
const price = 100;
|
|
39
50
|
const quantity = orderQuantity;
|
|
40
51
|
const ric = instrument[instrumentMap.ric];
|
|
41
52
|
const side = sides.sides[dataUtils.random(0, sides.sides.length - 1)];
|
|
42
53
|
const status = orderStatus$1;
|
|
43
54
|
const volLimit = 100;
|
|
44
|
-
const
|
|
55
|
+
const lastUpdate = clock.now;
|
|
56
|
+
const created = clock.now;
|
|
57
|
+
const numberOfChildOrders = dataUtils.random(
|
|
45
58
|
0,
|
|
46
59
|
avgChildOrderPerOrder * dataUtils.random(1, childMaxMultiple)
|
|
47
60
|
);
|
|
48
61
|
let remainingQty = orderQuantity;
|
|
49
|
-
for (let j = 0; j <
|
|
62
|
+
for (let j = 0; j < numberOfChildOrders; j++) {
|
|
63
|
+
childOrderCount += 1;
|
|
50
64
|
const childOrderQuantity = Math.round(remainingQty / (childOrderCount - j));
|
|
51
65
|
remainingQty -= childOrderQuantity;
|
|
52
66
|
const childOrderStatus = orderStatus.orderStatus[dataUtils.random(0, orderStatus.orderStatus.length - 1)];
|
|
53
67
|
const childFilledQty = orderStatus$1 === "FILLED" ? childOrderQuantity : childOrderStatus === "NEW" ? 0 : childOrderQuantity - dataUtils.random(100, childOrderQuantity);
|
|
54
68
|
const childOpenQty = childOrderQuantity - childFilledQty;
|
|
55
69
|
const averagePrice2 = 0;
|
|
56
|
-
const childIdAsInt =
|
|
57
|
-
const childId =
|
|
70
|
+
const childIdAsInt = childOrderCount;
|
|
71
|
+
const childId = childOrderCount.toString().padStart(10, "0");
|
|
58
72
|
const lastUpdate2 = 0;
|
|
59
73
|
const price2 = 100;
|
|
60
74
|
const strategy = 0;
|
|
61
|
-
|
|
75
|
+
childOrdersTable.insert(
|
|
76
|
+
[
|
|
77
|
+
account,
|
|
78
|
+
averagePrice2,
|
|
79
|
+
ccy,
|
|
80
|
+
exchange,
|
|
81
|
+
childFilledQty,
|
|
82
|
+
childId,
|
|
83
|
+
childIdAsInt,
|
|
84
|
+
childOpenQty,
|
|
85
|
+
parentOrderId,
|
|
86
|
+
price2,
|
|
87
|
+
childOrderQuantity,
|
|
88
|
+
ric,
|
|
89
|
+
side,
|
|
90
|
+
childOrderStatus,
|
|
91
|
+
strategy,
|
|
92
|
+
volLimit,
|
|
93
|
+
lastUpdate2,
|
|
94
|
+
created
|
|
95
|
+
],
|
|
96
|
+
notifyNewOrders
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
parentOrdersTable.insert(
|
|
100
|
+
[
|
|
62
101
|
account,
|
|
63
|
-
|
|
102
|
+
algo,
|
|
103
|
+
averagePrice,
|
|
64
104
|
ccy,
|
|
105
|
+
childOrderCount,
|
|
65
106
|
exchange,
|
|
66
|
-
|
|
67
|
-
childId,
|
|
68
|
-
childIdAsInt,
|
|
69
|
-
lastUpdate2,
|
|
70
|
-
childOpenQty,
|
|
107
|
+
filledQty,
|
|
71
108
|
parentOrderId,
|
|
72
|
-
|
|
73
|
-
|
|
109
|
+
parentOrderIdAsInt,
|
|
110
|
+
openQty,
|
|
111
|
+
price,
|
|
112
|
+
quantity,
|
|
74
113
|
ric,
|
|
75
114
|
side,
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
115
|
+
status,
|
|
116
|
+
volLimit,
|
|
117
|
+
lastUpdate,
|
|
118
|
+
created
|
|
119
|
+
],
|
|
120
|
+
notifyNewOrders
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
function createInitialOrders() {
|
|
124
|
+
const start = performance.now();
|
|
125
|
+
for (let i = 0; i < PARENT_ORDER_COUNT; i++) {
|
|
126
|
+
clock.advance(dataUtils.random(0, 100));
|
|
127
|
+
createParentAndChildOrders();
|
|
81
128
|
}
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
ccy,
|
|
87
|
-
childOrderCount,
|
|
88
|
-
exchange,
|
|
89
|
-
filledQty,
|
|
90
|
-
parentOrderId,
|
|
91
|
-
parentOrderIdAsInt,
|
|
92
|
-
lastUpdate,
|
|
93
|
-
openQty,
|
|
94
|
-
price,
|
|
95
|
-
quantity,
|
|
96
|
-
ric,
|
|
97
|
-
side,
|
|
98
|
-
status,
|
|
99
|
-
volLimit
|
|
100
|
-
];
|
|
101
|
-
parentOrderData.push(row);
|
|
129
|
+
const end = performance.now();
|
|
130
|
+
console.log(
|
|
131
|
+
`took ${end - start} to create ${parentOrdersTable.data.length} orders and ${childOrdersTable.data.length} child orders, last order created at ${clock}`
|
|
132
|
+
);
|
|
102
133
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
simulSchemas.schemas.childOrders,
|
|
114
|
-
childOrderData,
|
|
115
|
-
Table.buildDataColumnMap(simulSchemas.schemas, "childOrders")
|
|
116
|
-
);
|
|
134
|
+
let newOrderInterval = void 0;
|
|
135
|
+
function startGeneratingNewOrders() {
|
|
136
|
+
newOrderInterval = setInterval(createParentAndChildOrders, 100);
|
|
137
|
+
}
|
|
138
|
+
function stopGeneratingNewOrders() {
|
|
139
|
+
clearInterval(newOrderInterval);
|
|
140
|
+
}
|
|
141
|
+
createInitialOrders();
|
|
142
|
+
clock.showCurrentTime = true;
|
|
143
|
+
notifyNewOrders = true;
|
|
117
144
|
|
|
118
|
-
exports.childOrderData = childOrderData;
|
|
119
145
|
exports.childOrdersTable = childOrdersTable;
|
|
120
|
-
exports.parentOrderData = parentOrderData;
|
|
121
146
|
exports.parentOrdersTable = parentOrdersTable;
|
|
147
|
+
exports.startGeneratingNewOrders = startGeneratingNewOrders;
|
|
148
|
+
exports.stopGeneratingNewOrders = stopGeneratingNewOrders;
|
|
122
149
|
//# sourceMappingURL=parent-child-orders.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parent-child-orders.js","sources":["../../../src/simul/reference-data/parent-child-orders.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"parent-child-orders.js","sources":["../../../src/simul/reference-data/parent-child-orders.ts"],"sourcesContent":["import { Clock } from \"@vuu-ui/vuu-utils\";\nimport { random } from \"../../data-utils\";\nimport { buildDataColumnMap, Table } from \"../../Table\";\nimport { schemas } from \"../simul-schemas\";\nimport { accounts } from \"./accounts\";\nimport { instrumentsData } from \"./instruments\";\nimport { orderStatus as statusValues } from \"./orderStatus\";\nimport { sides } from \"./sides\";\nimport { algos } from \"./algos\";\n\nconst instrumentMap = buildDataColumnMap(schemas, \"instruments\");\n\n// const PARENT_ORDER_COUNT = 75_000;\nconst PARENT_ORDER_COUNT = 5_000;\nconst CHILD_ORDER_COUNT = 20_000;\n// const CHILD_ORDER_COUNT = 200_000;\n\nconst avgChildOrderPerOrder = Math.round(\n CHILD_ORDER_COUNT / PARENT_ORDER_COUNT,\n);\nconst childMaxMultiple = 10;\n\nconst clock = new Clock().goBack(120, \"minutes\");\nconsole.log(`starting order generation at ${clock}`);\n\nexport const parentOrdersTable = new Table(\n schemas.parentOrders,\n [],\n buildDataColumnMap(schemas, \"parentOrders\"),\n);\n\nexport const childOrdersTable = new Table(\n schemas.childOrders,\n [],\n buildDataColumnMap(schemas, \"childOrders\"),\n);\n\nlet parentOrderCount = 0;\nlet childOrderCount = 0;\nlet notifyNewOrders = false;\n\nfunction createParentAndChildOrders() {\n parentOrderCount += 1;\n const instrument = instrumentsData[random(0, instrumentsData.length - 1)];\n const orderQuantity = 1000 * random(1, 100);\n const orderStatus = statusValues[random(0, statusValues.length - 1)];\n const filledQty =\n orderStatus === \"FILLED\"\n ? orderQuantity\n : orderStatus === \"NEW\"\n ? 0\n : orderQuantity - random(100, orderQuantity);\n const openQty = orderQuantity - filledQty;\n const account = accounts[random(0, accounts.length - 1)];\n const algo = algos[random(0, algos.length - 1)];\n const averagePrice = 0;\n const ccy = \"GBP\";\n const exchange = instrument[instrumentMap.exchange];\n const parentOrderIdAsInt = parentOrderCount;\n const parentOrderId = parentOrderCount.toString().padStart(10, \"0\");\n const price = 100;\n const quantity = orderQuantity;\n const ric = instrument[instrumentMap.ric];\n const side = sides[random(0, sides.length - 1)];\n const status = orderStatus;\n const volLimit = 100;\n const lastUpdate = clock.now;\n const created = clock.now;\n\n const numberOfChildOrders = random(\n 0,\n avgChildOrderPerOrder * random(1, childMaxMultiple),\n );\n\n let remainingQty = orderQuantity;\n for (let j = 0; j < numberOfChildOrders; j++) {\n childOrderCount += 1;\n\n const childOrderQuantity = Math.round(remainingQty / (childOrderCount - j));\n remainingQty -= childOrderQuantity;\n const childOrderStatus = statusValues[random(0, statusValues.length - 1)];\n const childFilledQty =\n orderStatus === \"FILLED\"\n ? childOrderQuantity\n : childOrderStatus === \"NEW\"\n ? 0\n : childOrderQuantity - random(100, childOrderQuantity);\n const childOpenQty = childOrderQuantity - childFilledQty;\n const averagePrice = 0;\n const childIdAsInt = childOrderCount;\n const childId = childOrderCount.toString().padStart(10, \"0\");\n const lastUpdate = 0;\n const price = 100;\n const strategy = 0;\n\n childOrdersTable.insert(\n [\n account,\n averagePrice,\n ccy,\n exchange,\n childFilledQty,\n childId,\n childIdAsInt,\n childOpenQty,\n parentOrderId,\n price,\n childOrderQuantity,\n ric,\n side,\n childOrderStatus,\n strategy,\n volLimit,\n lastUpdate,\n created,\n ],\n notifyNewOrders,\n );\n }\n\n parentOrdersTable.insert(\n [\n account,\n algo,\n averagePrice,\n ccy,\n childOrderCount,\n exchange,\n filledQty,\n parentOrderId,\n parentOrderIdAsInt,\n openQty,\n price,\n quantity,\n ric,\n side,\n status,\n volLimit,\n lastUpdate,\n created,\n ],\n notifyNewOrders,\n );\n}\n\nfunction createInitialOrders() {\n const start = performance.now();\n for (let i = 0; i < PARENT_ORDER_COUNT; i++) {\n clock.advance(random(0, 100));\n createParentAndChildOrders();\n }\n const end = performance.now();\n console.log(\n `took ${end - start} to create ${parentOrdersTable.data.length} orders and ${childOrdersTable.data.length} child orders, last order created at ${clock}`,\n );\n}\n\nlet newOrderInterval: undefined | ReturnType<typeof setInterval> = undefined;\n\nexport function startGeneratingNewOrders() {\n newOrderInterval = setInterval(createParentAndChildOrders, 100);\n}\n\nexport function stopGeneratingNewOrders() {\n clearInterval(newOrderInterval);\n}\n\ncreateInitialOrders();\n\nclock.showCurrentTime = true;\nnotifyNewOrders = true;\n\n// startGeneratingNewOrders();\n"],"names":["buildDataColumnMap","schemas","Clock","Table","instrumentsData","random","orderStatus","statusValues","accounts","algos","sides","averagePrice","lastUpdate","price"],"mappings":";;;;;;;;;;;;AAUA,MAAM,aAAA,GAAgBA,wBAAmB,CAAAC,oBAAA,EAAS,aAAa,CAAA;AAG/D,MAAM,kBAAqB,GAAA,GAAA;AAC3B,MAAM,iBAAoB,GAAA,GAAA;AAG1B,MAAM,wBAAwB,IAAK,CAAA,KAAA;AAAA,EACjC,iBAAoB,GAAA;AACtB,CAAA;AACA,MAAM,gBAAmB,GAAA,EAAA;AAEzB,MAAM,QAAQ,IAAIC,cAAA,EAAQ,CAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAC/C,OAAQ,CAAA,GAAA,CAAI,CAAgC,6BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAE5C,MAAM,oBAAoB,IAAIC,WAAA;AAAA,EACnCF,oBAAQ,CAAA,YAAA;AAAA,EACR,EAAC;AAAA,EACDD,wBAAA,CAAmBC,sBAAS,cAAc;AAC5C;AAEO,MAAM,mBAAmB,IAAIE,WAAA;AAAA,EAClCF,oBAAQ,CAAA,WAAA;AAAA,EACR,EAAC;AAAA,EACDD,wBAAA,CAAmBC,sBAAS,aAAa;AAC3C;AAEA,IAAI,gBAAmB,GAAA,CAAA;AACvB,IAAI,eAAkB,GAAA,CAAA;AACtB,IAAI,eAAkB,GAAA,KAAA;AAEtB,SAAS,0BAA6B,GAAA;AACpC,EAAoB,gBAAA,IAAA,CAAA;AACpB,EAAA,MAAM,aAAaG,2BAAgB,CAAAC,gBAAA,CAAO,GAAGD,2BAAgB,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AACxE,EAAA,MAAM,aAAgB,GAAA,GAAA,GAAOC,gBAAO,CAAA,CAAA,EAAG,GAAG,CAAA;AAC1C,EAAA,MAAMC,gBAAcC,uBAAa,CAAAF,gBAAA,CAAO,GAAGE,uBAAa,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AACnE,EAAM,MAAA,SAAA,GACJD,aAAgB,KAAA,QAAA,GACZ,aACA,GAAAA,aAAA,KAAgB,QACd,CACA,GAAA,aAAA,GAAgBD,gBAAO,CAAA,GAAA,EAAK,aAAa,CAAA;AACjD,EAAA,MAAM,UAAU,aAAgB,GAAA,SAAA;AAChC,EAAA,MAAM,UAAUG,iBAAS,CAAAH,gBAAA,CAAO,GAAGG,iBAAS,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AACvD,EAAA,MAAM,OAAOC,WAAM,CAAAJ,gBAAA,CAAO,GAAGI,WAAM,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AAC9C,EAAA,MAAM,YAAe,GAAA,CAAA;AACrB,EAAA,MAAM,GAAM,GAAA,KAAA;AACZ,EAAM,MAAA,QAAA,GAAW,UAAW,CAAA,aAAA,CAAc,QAAQ,CAAA;AAClD,EAAA,MAAM,kBAAqB,GAAA,gBAAA;AAC3B,EAAA,MAAM,gBAAgB,gBAAiB,CAAA,QAAA,EAAW,CAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAClE,EAAA,MAAM,KAAQ,GAAA,GAAA;AACd,EAAA,MAAM,QAAW,GAAA,aAAA;AACjB,EAAM,MAAA,GAAA,GAAM,UAAW,CAAA,aAAA,CAAc,GAAG,CAAA;AACxC,EAAA,MAAM,OAAOC,WAAM,CAAAL,gBAAA,CAAO,GAAGK,WAAM,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAS,GAAAJ,aAAA;AACf,EAAA,MAAM,QAAW,GAAA,GAAA;AACjB,EAAA,MAAM,aAAa,KAAM,CAAA,GAAA;AACzB,EAAA,MAAM,UAAU,KAAM,CAAA,GAAA;AAEtB,EAAA,MAAM,mBAAsB,GAAAD,gBAAA;AAAA,IAC1B,CAAA;AAAA,IACA,qBAAA,GAAwBA,gBAAO,CAAA,CAAA,EAAG,gBAAgB;AAAA,GACpD;AAEA,EAAA,IAAI,YAAe,GAAA,aAAA;AACnB,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,mBAAA,EAAqB,CAAK,EAAA,EAAA;AAC5C,IAAmB,eAAA,IAAA,CAAA;AAEnB,IAAA,MAAM,kBAAqB,GAAA,IAAA,CAAK,KAAM,CAAA,YAAA,IAAgB,kBAAkB,CAAE,CAAA,CAAA;AAC1E,IAAgB,YAAA,IAAA,kBAAA;AAChB,IAAA,MAAM,mBAAmBE,uBAAa,CAAAF,gBAAA,CAAO,GAAGE,uBAAa,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA;AACxE,IAAM,MAAA,cAAA,GACJD,aAAgB,KAAA,QAAA,GACZ,kBACA,GAAA,gBAAA,KAAqB,QACnB,CACA,GAAA,kBAAA,GAAqBD,gBAAO,CAAA,GAAA,EAAK,kBAAkB,CAAA;AAC3D,IAAA,MAAM,eAAe,kBAAqB,GAAA,cAAA;AAC1C,IAAA,MAAMM,aAAe,GAAA,CAAA;AACrB,IAAA,MAAM,YAAe,GAAA,eAAA;AACrB,IAAA,MAAM,UAAU,eAAgB,CAAA,QAAA,EAAW,CAAA,QAAA,CAAS,IAAI,GAAG,CAAA;AAC3D,IAAA,MAAMC,WAAa,GAAA,CAAA;AACnB,IAAA,MAAMC,MAAQ,GAAA,GAAA;AACd,IAAA,MAAM,QAAW,GAAA,CAAA;AAEjB,IAAiB,gBAAA,CAAA,MAAA;AAAA,MACf;AAAA,QACE,OAAA;AAAA,QACAF,aAAAA;AAAA,QACA,GAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA;AAAA,QACA,OAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACAE,MAAAA;AAAA,QACA,kBAAA;AAAA,QACA,GAAA;AAAA,QACA,IAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACAD,WAAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAAA;AAGF,EAAkB,iBAAA,CAAA,MAAA;AAAA,IAChB;AAAA,MACE,OAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA;AAAA,MACA,GAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,mBAAsB,GAAA;AAC7B,EAAM,MAAA,KAAA,GAAQ,YAAY,GAAI,EAAA;AAC9B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,kBAAA,EAAoB,CAAK,EAAA,EAAA;AAC3C,IAAA,KAAA,CAAM,OAAQ,CAAAP,gBAAA,CAAO,CAAG,EAAA,GAAG,CAAC,CAAA;AAC5B,IAA2B,0BAAA,EAAA;AAAA;AAE7B,EAAM,MAAA,GAAA,GAAM,YAAY,GAAI,EAAA;AAC5B,EAAQ,OAAA,CAAA,GAAA;AAAA,IACN,CAAQ,KAAA,EAAA,GAAA,GAAM,KAAK,CAAA,WAAA,EAAc,iBAAkB,CAAA,IAAA,CAAK,MAAM,CAAA,YAAA,EAAe,gBAAiB,CAAA,IAAA,CAAK,MAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA;AAAA,GACxJ;AACF;AAEA,IAAI,gBAA+D,GAAA,KAAA,CAAA;AAE5D,SAAS,wBAA2B,GAAA;AACzC,EAAmB,gBAAA,GAAA,WAAA,CAAY,4BAA4B,GAAG,CAAA;AAChE;AAEO,SAAS,uBAA0B,GAAA;AACxC,EAAA,aAAA,CAAc,gBAAgB,CAAA;AAChC;AAEA,mBAAoB,EAAA;AAEpB,KAAA,CAAM,eAAkB,GAAA,IAAA;AACxB,eAAkB,GAAA,IAAA;;;;;;;"}
|
|
@@ -14,6 +14,9 @@ const pricesUpdateGenerator = new UpdateGenerator.BaseUpdateGenerator({
|
|
|
14
14
|
ask,
|
|
15
15
|
askSize
|
|
16
16
|
});
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const lastUpdate = now;
|
|
19
|
+
const created = now;
|
|
17
20
|
const requiredInstrumentFields = ["ric", "price"];
|
|
18
21
|
const pricesData = instruments.instrumentsData.map((instrument) => {
|
|
19
22
|
const { ric, price: priceSeed } = requiredInstrumentFields.reduce(
|
|
@@ -30,7 +33,22 @@ const pricesData = instruments.instrumentsData.map((instrument) => {
|
|
|
30
33
|
const open = priceSeed + dataUtils.random(0, 1) / 10;
|
|
31
34
|
const phase = "C";
|
|
32
35
|
const scenario = "close";
|
|
33
|
-
|
|
36
|
+
const lastUpdate2 = now;
|
|
37
|
+
const created2 = now;
|
|
38
|
+
return [
|
|
39
|
+
ask2,
|
|
40
|
+
askSize2,
|
|
41
|
+
bid2,
|
|
42
|
+
bidSize2,
|
|
43
|
+
close,
|
|
44
|
+
last,
|
|
45
|
+
open,
|
|
46
|
+
phase,
|
|
47
|
+
ric,
|
|
48
|
+
scenario,
|
|
49
|
+
lastUpdate2,
|
|
50
|
+
created2
|
|
51
|
+
];
|
|
34
52
|
});
|
|
35
53
|
for (const [, , , lastTrade, ric] of constituents) {
|
|
36
54
|
const priceSeed = parseFloat(String(lastTrade));
|
|
@@ -55,7 +73,9 @@ for (const [, , , lastTrade, ric] of constituents) {
|
|
|
55
73
|
open,
|
|
56
74
|
phase,
|
|
57
75
|
ric,
|
|
58
|
-
scenario
|
|
76
|
+
scenario,
|
|
77
|
+
lastUpdate,
|
|
78
|
+
created
|
|
59
79
|
]);
|
|
60
80
|
}
|
|
61
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prices.js","sources":["../../../src/simul/reference-data/prices.ts"],"sourcesContent":["import { buildDataColumnMap, Table } from \"../../Table\";\nimport { BaseUpdateGenerator } from \"../../UpdateGenerator\";\nimport { schemas } from \"../simul-schemas\";\nimport { instrumentsData, InstrumentColumnMap } from \"./instruments\";\nimport { random } from \"../../data-utils\";\nimport basketConstituentData from \"../../basket/reference-data/constituents\";\n\ntype ask = number;\ntype askSize = number;\ntype bid = number;\ntype bidSize = number;\ntype close = number;\ntype last = number;\ntype open = number;\ntype phase = \"C\";\ntype ric = string;\ntype scenario = \"close\";\n\nexport type PricesDataRow = [\n ask,\n askSize,\n bid,\n bidSize,\n close,\n last,\n open,\n phase,\n ric,\n scenario
|
|
1
|
+
{"version":3,"file":"prices.js","sources":["../../../src/simul/reference-data/prices.ts"],"sourcesContent":["import { buildDataColumnMap, Table } from \"../../Table\";\nimport { BaseUpdateGenerator } from \"../../UpdateGenerator\";\nimport { schemas } from \"../simul-schemas\";\nimport { instrumentsData, InstrumentColumnMap } from \"./instruments\";\nimport { random } from \"../../data-utils\";\nimport basketConstituentData from \"../../basket/reference-data/constituents\";\n\ntype ask = number;\ntype askSize = number;\ntype bid = number;\ntype bidSize = number;\ntype close = number;\ntype last = number;\ntype open = number;\ntype phase = \"C\";\ntype ric = string;\ntype scenario = \"close\";\ntype lastUpdate = number;\ntype created = number;\n\nexport type PricesDataRow = [\n ask,\n askSize,\n bid,\n bidSize,\n close,\n last,\n open,\n phase,\n ric,\n scenario,\n lastUpdate,\n created,\n];\n\nconst { bid, bidSize, ask, askSize } = buildDataColumnMap(schemas, \"prices\");\nconst pricesUpdateGenerator = new BaseUpdateGenerator({\n bid,\n bidSize,\n ask,\n askSize,\n});\n\nconst now = Date.now();\nconst lastUpdate = now;\nconst created = now;\n\n// const start = performance.now();\n// Create 100_000 Instruments\nconst requiredInstrumentFields = [\"ric\", \"price\"] as const;\nconst pricesData: Array<PricesDataRow> = instrumentsData.map((instrument) => {\n const { ric, price: priceSeed } = requiredInstrumentFields.reduce(\n (obj, f) => ({ ...obj, [f]: instrument[InstrumentColumnMap[f]] }),\n {} as { ric: string; price: number },\n );\n const spread = random(0, 10);\n\n const ask = priceSeed + spread / 2;\n const askSize = random(1000, 3000);\n const bid = priceSeed - spread / 2;\n const bidSize = random(1000, 3000);\n const close = priceSeed + random(0, 1) / 10;\n const last = priceSeed + random(0, 1) / 10;\n const open = priceSeed + random(0, 1) / 10;\n const phase = \"C\";\n const scenario = \"close\";\n const lastUpdate = now;\n const created = now;\n return [\n ask,\n askSize,\n bid,\n bidSize,\n close,\n last,\n open,\n phase,\n ric,\n scenario,\n lastUpdate,\n created,\n ];\n});\n\n// prettier-ignore\nfor (const [,,,lastTrade,ric] of basketConstituentData) {\n const priceSeed = parseFloat(String(lastTrade));\n if (!isNaN(priceSeed)) {\n const spread = random(0, 10);\n const ask = priceSeed + spread / 2;\n const askSize = random(1000, 3000);\n const bid = priceSeed - spread / 2;\n const bidSize = random(1000, 3000);\n const close = priceSeed + random(0, 1) / 10;\n const last = priceSeed + random(0, 1) / 10;\n const open = priceSeed + random(0, 1) / 10;\n const phase = \"C\";\n const scenario = \"close\";\n pricesData.push([\n ask,\n askSize,\n bid,\n bidSize,\n close,\n last,\n open,\n phase,\n ric as string,\n scenario,\n lastUpdate,\n created\n ]);\n }\n}\n\n// const end = performance.now();\n// console.log(`generating 100,000 prices took ${end - start} ms`);\n\nexport const pricesTable = new Table(\n schemas.prices,\n pricesData,\n buildDataColumnMap(schemas, \"prices\"),\n pricesUpdateGenerator,\n);\n\nexport { pricesData };\n"],"names":["buildDataColumnMap","schemas","BaseUpdateGenerator","instrumentsData","InstrumentColumnMap","random","ask","askSize","bid","bidSize","lastUpdate","created","basketConstituentData","Table"],"mappings":"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"}
|
|
@@ -104,6 +104,32 @@ const cancelOrder = async (rpcRequest) => {
|
|
|
104
104
|
throw Error("cancelOrder invalid rpcRequest");
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
|
+
const startOrders = async () => {
|
|
108
|
+
parentChildOrders.startGeneratingNewOrders();
|
|
109
|
+
return {
|
|
110
|
+
type: "VIEW_PORT_RPC_REPONSE",
|
|
111
|
+
action: {
|
|
112
|
+
type: "VP_RPC_SUCCESS"
|
|
113
|
+
},
|
|
114
|
+
method: "???",
|
|
115
|
+
namedParams: {},
|
|
116
|
+
params: [],
|
|
117
|
+
vpId: ""
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
const stopOrders = async () => {
|
|
121
|
+
parentChildOrders.stopGeneratingNewOrders();
|
|
122
|
+
return {
|
|
123
|
+
type: "VIEW_PORT_RPC_REPONSE",
|
|
124
|
+
action: {
|
|
125
|
+
type: "VP_RPC_SUCCESS"
|
|
126
|
+
},
|
|
127
|
+
method: "???",
|
|
128
|
+
namedParams: {},
|
|
129
|
+
params: [],
|
|
130
|
+
vpId: ""
|
|
131
|
+
};
|
|
132
|
+
};
|
|
107
133
|
const services = {
|
|
108
134
|
...undefinedTables,
|
|
109
135
|
orders: [
|
|
@@ -111,6 +137,16 @@ const services = {
|
|
|
111
137
|
rpcName: "CANCEL_ORDER",
|
|
112
138
|
service: cancelOrder
|
|
113
139
|
}
|
|
140
|
+
],
|
|
141
|
+
parentOrders: [
|
|
142
|
+
{
|
|
143
|
+
rpcName: "startGeneratingNewOrders",
|
|
144
|
+
service: startOrders
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
rpcName: "stopGeneratingNewOrders",
|
|
148
|
+
service: stopOrders
|
|
149
|
+
}
|
|
114
150
|
]
|
|
115
151
|
};
|
|
116
152
|
const simulModule = new SimulModule.SimulModule({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simul-module.js","sources":["../../src/simul/simul-module.ts"],"sourcesContent":["import {\n ClientToServerMenuRowRPC,\n VuuLink,\n VuuMenu,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isVuuMenuRpcRequest } from \"@vuu-ui/vuu-utils\";\nimport { Table, joinTables } from \"../Table\";\nimport { RpcService, ServiceHandler } from \"../VuuModule\";\nimport { SimulModule } from \"./SimulModule\";\nimport { instrumentsTable } from \"./reference-data/instruments\";\nimport { instrumentsExtendedTable } from \"./reference-data/instruments-extended\";\nimport { ordersTable } from \"./reference-data/orders\";\nimport { pricesTable } from \"./reference-data/prices\";\nimport {\n parentOrdersTable,\n childOrdersTable,\n} from \"./reference-data/parent-child-orders\";\nimport { schemas, type SimulTableName } from \"./simul-schemas\";\n\nconst undefinedTables = {\n childOrders: undefined,\n instruments: undefined,\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: undefined,\n parentOrders: undefined,\n prices: undefined,\n};\n\nconst tables: Record<SimulTableName, Table> = {\n childOrders: childOrdersTable,\n instruments: instrumentsTable,\n instrumentsExtended: instrumentsExtendedTable,\n instrumentPrices: joinTables(\n { module: \"SIMUL\", table: \"instrumentPrices\" },\n instrumentsTable,\n pricesTable,\n \"ric\",\n ),\n orders: ordersTable,\n parentOrders: parentOrdersTable,\n prices: pricesTable,\n};\n\nconst vuuLinks: Record<SimulTableName, VuuLink[] | undefined> = {\n ...undefinedTables,\n childOrders: [\n { fromColumn: \"parentOrderId\", toColumn: \"id\", toTable: \"parentOrders\" },\n ],\n parentOrders: [\n { fromColumn: \"ric\", toColumn: \"ric\", toTable: \"instruments\" },\n ],\n};\n\nconst menus: Record<SimulTableName, VuuMenu | undefined> = {\n childOrders: undefined,\n instruments: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Instruments To Order\",\n rpcName: \"ADD_INSTRUMENTS_TO_ORDER\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Row\",\n rpcName: \"EDIT_ROW\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Rows\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n },\n ],\n },\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: {\n name: \"ROOT\",\n menus: [\n {\n context: \"row\",\n filter: `status in [\"New\",\"Partial Exec\"]`,\n name: \"Cancel Order\",\n rpcName: \"CANCEL_ORDER\",\n },\n ],\n },\n parentOrders: undefined,\n prices: undefined,\n};\n\nconst cancelOrder: ServiceHandler = async (rpcRequest) => {\n if (isVuuMenuRpcRequest(rpcRequest)) {\n const { rowKey, vpId } = rpcRequest as ClientToServerMenuRowRPC;\n const table = tables.orders;\n const row = table.findByKey(rowKey);\n row[table.map.status] = \"Cancelled\";\n table.updateRow(row);\n\n return {\n action: {\n type: \"SHOW_NOTIFICATION_ACTION\",\n message: `Order id: ${rowKey}`,\n title: \"Order cancelled\",\n },\n rpcName: \"CANCEL_ORDER\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n };\n } else {\n throw Error(\"cancelOrder invalid rpcRequest\");\n }\n};\n\nconst services: Record<SimulTableName, RpcService[] | undefined> = {\n ...undefinedTables,\n orders: [\n {\n rpcName: \"CANCEL_ORDER\",\n service: cancelOrder,\n },\n ],\n};\n\nexport const simulModule = new SimulModule({\n menus,\n name: \"SIMUL\",\n schemas,\n services,\n tables,\n vuuLinks,\n});\n"],"names":["childOrdersTable","instrumentsTable","instrumentsExtendedTable","joinTables","pricesTable","ordersTable","parentOrdersTable","isVuuMenuRpcRequest","SimulModule","schemas"],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"simul-module.js","sources":["../../src/simul/simul-module.ts"],"sourcesContent":["import {\n ClientToServerMenuRowRPC,\n VuuLink,\n VuuMenu,\n VuuRpcViewportResponse,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isVuuMenuRpcRequest } from \"@vuu-ui/vuu-utils\";\nimport { Table, joinTables } from \"../Table\";\nimport { RpcService, ServiceHandler } from \"../VuuModule\";\nimport { SimulModule } from \"./SimulModule\";\nimport { instrumentsTable } from \"./reference-data/instruments\";\nimport { instrumentsExtendedTable } from \"./reference-data/instruments-extended\";\nimport { ordersTable } from \"./reference-data/orders\";\nimport { pricesTable } from \"./reference-data/prices\";\nimport {\n parentOrdersTable,\n childOrdersTable,\n startGeneratingNewOrders,\n stopGeneratingNewOrders,\n} from \"./reference-data/parent-child-orders\";\nimport { schemas, type SimulTableName } from \"./simul-schemas\";\n\nconst undefinedTables = {\n childOrders: undefined,\n instruments: undefined,\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: undefined,\n parentOrders: undefined,\n prices: undefined,\n};\n\nconst tables: Record<SimulTableName, Table> = {\n childOrders: childOrdersTable,\n instruments: instrumentsTable,\n instrumentsExtended: instrumentsExtendedTable,\n instrumentPrices: joinTables(\n { module: \"SIMUL\", table: \"instrumentPrices\" },\n instrumentsTable,\n pricesTable,\n \"ric\",\n ),\n orders: ordersTable,\n parentOrders: parentOrdersTable,\n prices: pricesTable,\n};\n\nconst vuuLinks: Record<SimulTableName, VuuLink[] | undefined> = {\n ...undefinedTables,\n childOrders: [\n { fromColumn: \"parentOrderId\", toColumn: \"id\", toTable: \"parentOrders\" },\n ],\n parentOrders: [\n { fromColumn: \"ric\", toColumn: \"ric\", toTable: \"instruments\" },\n ],\n};\n\nconst menus: Record<SimulTableName, VuuMenu | undefined> = {\n childOrders: undefined,\n instruments: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Instruments To Order\",\n rpcName: \"ADD_INSTRUMENTS_TO_ORDER\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Row\",\n rpcName: \"EDIT_ROW\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Rows\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n },\n ],\n },\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: {\n name: \"ROOT\",\n menus: [\n {\n context: \"row\",\n filter: `status in [\"New\",\"Partial Exec\"]`,\n name: \"Cancel Order\",\n rpcName: \"CANCEL_ORDER\",\n },\n ],\n },\n parentOrders: undefined,\n prices: undefined,\n};\n\nconst cancelOrder: ServiceHandler = async (rpcRequest) => {\n if (isVuuMenuRpcRequest(rpcRequest)) {\n const { rowKey, vpId } = rpcRequest as ClientToServerMenuRowRPC;\n const table = tables.orders;\n const row = table.findByKey(rowKey);\n row[table.map.status] = \"Cancelled\";\n table.updateRow(row);\n\n return {\n action: {\n type: \"SHOW_NOTIFICATION_ACTION\",\n message: `Order id: ${rowKey}`,\n title: \"Order cancelled\",\n },\n rpcName: \"CANCEL_ORDER\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n };\n } else {\n throw Error(\"cancelOrder invalid rpcRequest\");\n }\n};\n\nconst startOrders = async () => {\n startGeneratingNewOrders();\n return {\n type: \"VIEW_PORT_RPC_REPONSE\",\n action: {\n type: \"VP_RPC_SUCCESS\",\n },\n method: \"???\",\n namedParams: {},\n params: [],\n vpId: \"\",\n } as VuuRpcViewportResponse;\n};\nconst stopOrders = async () => {\n stopGeneratingNewOrders();\n return {\n type: \"VIEW_PORT_RPC_REPONSE\",\n action: {\n type: \"VP_RPC_SUCCESS\",\n },\n method: \"???\",\n namedParams: {},\n params: [],\n vpId: \"\",\n } as VuuRpcViewportResponse;\n};\n\nconst services: Record<SimulTableName, RpcService[] | undefined> = {\n ...undefinedTables,\n orders: [\n {\n rpcName: \"CANCEL_ORDER\",\n service: cancelOrder,\n },\n ],\n parentOrders: [\n {\n rpcName: \"startGeneratingNewOrders\",\n service: startOrders,\n },\n {\n rpcName: \"stopGeneratingNewOrders\",\n service: stopOrders,\n },\n ],\n};\n\nexport const simulModule = new SimulModule({\n menus,\n name: \"SIMUL\",\n schemas,\n services,\n tables,\n vuuLinks,\n});\n"],"names":["childOrdersTable","instrumentsTable","instrumentsExtendedTable","joinTables","pricesTable","ordersTable","parentOrdersTable","isVuuMenuRpcRequest","startGeneratingNewOrders","stopGeneratingNewOrders","SimulModule","schemas"],"mappings":";;;;;;;;;;;;AAsBA,MAAM,eAAkB,GAAA;AAAA,EACtB,WAAa,EAAA,KAAA,CAAA;AAAA,EACb,WAAa,EAAA,KAAA,CAAA;AAAA,EACb,mBAAqB,EAAA,KAAA,CAAA;AAAA,EACrB,gBAAkB,EAAA,KAAA,CAAA;AAAA,EAClB,MAAQ,EAAA,KAAA,CAAA;AAAA,EACR,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,MAAQ,EAAA,KAAA;AACV,CAAA;AAEA,MAAM,MAAwC,GAAA;AAAA,EAC5C,WAAa,EAAAA,kCAAA;AAAA,EACb,WAAa,EAAAC,4BAAA;AAAA,EACb,mBAAqB,EAAAC,4CAAA;AAAA,EACrB,gBAAkB,EAAAC,gBAAA;AAAA,IAChB,EAAE,MAAA,EAAQ,OAAS,EAAA,KAAA,EAAO,kBAAmB,EAAA;AAAA,IAC7CF,4BAAA;AAAA,IACAG,kBAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAQ,EAAAC,kBAAA;AAAA,EACR,YAAc,EAAAC,mCAAA;AAAA,EACd,MAAQ,EAAAF;AACV,CAAA;AAEA,MAAM,QAA0D,GAAA;AAAA,EAC9D,GAAG,eAAA;AAAA,EACH,WAAa,EAAA;AAAA,IACX,EAAE,UAAY,EAAA,eAAA,EAAiB,QAAU,EAAA,IAAA,EAAM,SAAS,cAAe;AAAA,GACzE;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,EAAE,UAAY,EAAA,KAAA,EAAO,QAAU,EAAA,KAAA,EAAO,SAAS,aAAc;AAAA;AAEjE,CAAA;AAEA,MAAM,KAAqD,GAAA;AAAA,EACzD,WAAa,EAAA,KAAA,CAAA;AAAA,EACb,WAAa,EAAA;AAAA,IACX,IAAM,EAAA,MAAA;AAAA,IACN,KAAO,EAAA;AAAA,MACL;AAAA,QACE,OAAS,EAAA,eAAA;AAAA,QACT,MAAQ,EAAA,EAAA;AAAA,QACR,IAAM,EAAA,0BAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACX;AAAA,MACA;AAAA,QACE,OAAS,EAAA,eAAA;AAAA,QACT,MAAQ,EAAA,EAAA;AAAA,QACR,IAAM,EAAA,UAAA;AAAA,QACN,OAAS,EAAA;AAAA,OACX;AAAA,MACA;AAAA,QACE,OAAS,EAAA,eAAA;AAAA,QACT,MAAQ,EAAA,EAAA;AAAA,QACR,IAAM,EAAA,WAAA;AAAA,QACN,OAAS,EAAA;AAAA;AACX;AACF,GACF;AAAA,EACA,mBAAqB,EAAA,KAAA,CAAA;AAAA,EACrB,gBAAkB,EAAA,KAAA,CAAA;AAAA,EAClB,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,MAAA;AAAA,IACN,KAAO,EAAA;AAAA,MACL;AAAA,QACE,OAAS,EAAA,KAAA;AAAA,QACT,MAAQ,EAAA,CAAA,gCAAA,CAAA;AAAA,QACR,IAAM,EAAA,cAAA;AAAA,QACN,OAAS,EAAA;AAAA;AACX;AACF,GACF;AAAA,EACA,YAAc,EAAA,KAAA,CAAA;AAAA,EACd,MAAQ,EAAA,KAAA;AACV,CAAA;AAEA,MAAM,WAAA,GAA8B,OAAO,UAAe,KAAA;AACxD,EAAI,IAAAG,4BAAA,CAAoB,UAAU,CAAG,EAAA;AACnC,IAAM,MAAA,EAAE,MAAQ,EAAA,IAAA,EAAS,GAAA,UAAA;AACzB,IAAA,MAAM,QAAQ,MAAO,CAAA,MAAA;AACrB,IAAM,MAAA,GAAA,GAAM,KAAM,CAAA,SAAA,CAAU,MAAM,CAAA;AAClC,IAAI,GAAA,CAAA,KAAA,CAAM,GAAI,CAAA,MAAM,CAAI,GAAA,WAAA;AACxB,IAAA,KAAA,CAAM,UAAU,GAAG,CAAA;AAEnB,IAAO,OAAA;AAAA,MACL,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,0BAAA;AAAA,QACN,OAAA,EAAS,aAAa,MAAM,CAAA,CAAA;AAAA,QAC5B,KAAO,EAAA;AAAA,OACT;AAAA,MACA,OAAS,EAAA,cAAA;AAAA,MACT,IAAM,EAAA,qBAAA;AAAA,MACN;AAAA,KACF;AAAA,GACK,MAAA;AACL,IAAA,MAAM,MAAM,gCAAgC,CAAA;AAAA;AAEhD,CAAA;AAEA,MAAM,cAAc,YAAY;AAC9B,EAAyBC,0CAAA,EAAA;AACzB,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,uBAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,IAAM,EAAA;AAAA,KACR;AAAA,IACA,MAAQ,EAAA,KAAA;AAAA,IACR,aAAa,EAAC;AAAA,IACd,QAAQ,EAAC;AAAA,IACT,IAAM,EAAA;AAAA,GACR;AACF,CAAA;AACA,MAAM,aAAa,YAAY;AAC7B,EAAwBC,yCAAA,EAAA;AACxB,EAAO,OAAA;AAAA,IACL,IAAM,EAAA,uBAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,IAAM,EAAA;AAAA,KACR;AAAA,IACA,MAAQ,EAAA,KAAA;AAAA,IACR,aAAa,EAAC;AAAA,IACd,QAAQ,EAAC;AAAA,IACT,IAAM,EAAA;AAAA,GACR;AACF,CAAA;AAEA,MAAM,QAA6D,GAAA;AAAA,EACjE,GAAG,eAAA;AAAA,EACH,MAAQ,EAAA;AAAA,IACN;AAAA,MACE,OAAS,EAAA,cAAA;AAAA,MACT,OAAS,EAAA;AAAA;AACX,GACF;AAAA,EACA,YAAc,EAAA;AAAA,IACZ;AAAA,MACE,OAAS,EAAA,0BAAA;AAAA,MACT,OAAS,EAAA;AAAA,KACX;AAAA,IACA;AAAA,MACE,OAAS,EAAA,yBAAA;AAAA,MACT,OAAS,EAAA;AAAA;AACX;AAEJ,CAAA;AAEa,MAAA,WAAA,GAAc,IAAIC,uBAAY,CAAA;AAAA,EACzC,KAAA;AAAA,EACA,IAAM,EAAA,OAAA;AAAA,WACNC,oBAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC;;;;"}
|