@flexemarkets/fm-sdk 0.1.3 → 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/README.md +16 -19
- package/dist/client.d.ts +33 -12
- package/dist/client.js +56 -25
- package/dist/client.js.map +1 -1
- package/dist/{market-view.d.ts → desk.d.ts} +83 -34
- package/dist/{market-view.js → desk.js} +99 -47
- package/dist/desk.js.map +1 -0
- package/dist/index.d.ts +8 -7
- package/dist/index.js +15 -6
- package/dist/index.js.map +1 -1
- package/dist/order-utils.d.ts +27 -2
- package/dist/order-utils.js +51 -2
- package/dist/order-utils.js.map +1 -1
- package/dist/orderbook.d.ts +17 -8
- package/dist/orderbook.js +37 -11
- package/dist/orderbook.js.map +1 -1
- package/dist/snapshot.d.ts +1 -1
- package/dist/stomp.d.ts +36 -4
- package/dist/stomp.js +90 -2
- package/dist/stomp.js.map +1 -1
- package/dist/ticker.js +20 -44
- package/dist/ticker.js.map +1 -1
- package/dist/trades.d.ts +77 -15
- package/dist/trades.js +83 -33
- package/dist/trades.js.map +1 -1
- package/dist/types.d.ts +25 -4
- package/dist/types.js +28 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/market-view.js.map +0 -1
package/dist/ticker.js
CHANGED
|
@@ -5,8 +5,6 @@
|
|
|
5
5
|
* Port of python/ticker.py.
|
|
6
6
|
*/
|
|
7
7
|
import { Flexemarkets } from "./client.js";
|
|
8
|
-
import { OrderBooks } from "./orderbook.js";
|
|
9
|
-
import { MarketplaceTrades } from "./trades.js";
|
|
10
8
|
import { SESSION_STATE_CLOSED } from "./types.js";
|
|
11
9
|
const TRADE_DISPLAY_COUNT = 5;
|
|
12
10
|
function price(value) {
|
|
@@ -26,7 +24,7 @@ function tradePrices(prices, count) {
|
|
|
26
24
|
.map((p) => `$${(p / 100).toFixed(2)}`)
|
|
27
25
|
.join(" ");
|
|
28
26
|
}
|
|
29
|
-
function display(
|
|
27
|
+
function display(desk, session, endpointUrl = "") {
|
|
30
28
|
const state = session?.state ?? "---";
|
|
31
29
|
const lines = [];
|
|
32
30
|
lines.push("\x1b[2J\x1b[H"); // clear screen, cursor home
|
|
@@ -35,30 +33,17 @@ function display(books, trades, session, endpointUrl = "") {
|
|
|
35
33
|
lines.push("");
|
|
36
34
|
lines.push(` ${"Symbol".padStart(6)} ${"Bid".padStart(6)} ${"Ask".padStart(6)} ${"Spread".padStart(6)} Last trades`);
|
|
37
35
|
lines.push(` ${"------".padStart(6)} ${"------".padStart(6)} ${"------".padStart(6)} ${"------".padStart(6)} -----------`);
|
|
38
|
-
const sorted = [...books
|
|
36
|
+
const sorted = [...desk.books()].sort((a, b) => a.marketId - b.marketId);
|
|
39
37
|
for (const book of sorted) {
|
|
40
38
|
const bid = book.bestBuyPrice();
|
|
41
39
|
const ask = book.bestSellPrice();
|
|
42
40
|
const symbol = book.symbol ?? "?";
|
|
43
|
-
const recent =
|
|
41
|
+
const recent = desk.tape(book.marketId)?.mostRecentPrices() ?? [];
|
|
44
42
|
lines.push(` ${symbol.padStart(6)} ${price(bid)} ${price(ask)} ${spread(bid, ask)} ${tradePrices(recent, TRADE_DISPLAY_COUNT)}`);
|
|
45
43
|
}
|
|
46
44
|
lines.push("");
|
|
47
45
|
process.stdout.write(lines.join("\n"));
|
|
48
46
|
}
|
|
49
|
-
function isOrdersUpdate(event) {
|
|
50
|
-
return typeof event === "object" && event !== null && event.kind === "orders-update";
|
|
51
|
-
}
|
|
52
|
-
function isSession(event) {
|
|
53
|
-
return (typeof event === "object" &&
|
|
54
|
-
!Array.isArray(event) &&
|
|
55
|
-
"state" in event &&
|
|
56
|
-
"marketplaceId" in event &&
|
|
57
|
-
"allocationId" in event);
|
|
58
|
-
}
|
|
59
|
-
function isStreamDropped(event) {
|
|
60
|
-
return typeof event === "object" && "kind" in event && event.kind === "stream-dropped";
|
|
61
|
-
}
|
|
62
47
|
async function main() {
|
|
63
48
|
// Parse CLI args
|
|
64
49
|
const args = process.argv.slice(2);
|
|
@@ -77,36 +62,27 @@ async function main() {
|
|
|
77
62
|
const marketplaceId = fm.endpointMarketplaceId;
|
|
78
63
|
const markets = await fm.markets(marketplaceId);
|
|
79
64
|
markets.sort((a, b) => a.id - b.id);
|
|
80
|
-
|
|
81
|
-
|
|
65
|
+
// A desk keeps the books and the tape for us: seeded from the REST
|
|
66
|
+
// snapshot, kept current from the same delta stream, and reseeded on a
|
|
67
|
+
// sequence gap. That is the whole reason this example no longer holds
|
|
68
|
+
// aggregators of its own.
|
|
69
|
+
const desk = await fm.desk(marketplaceId);
|
|
82
70
|
const endpointUrl = fm.endpointUrl;
|
|
83
71
|
let session = null;
|
|
84
|
-
display(
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
session = event;
|
|
94
|
-
redraw = true;
|
|
95
|
-
if (event.state === SESSION_STATE_CLOSED) {
|
|
96
|
-
display(books, marketTrades, session, endpointUrl);
|
|
97
|
-
console.log("Session closed.");
|
|
98
|
-
fm.close();
|
|
99
|
-
process.exit(0);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else if (isStreamDropped(event)) {
|
|
103
|
-
process.stderr.write(`\nConnection lost: ${event.exception.message}\n`);
|
|
104
|
-
fm.reconnect();
|
|
105
|
-
}
|
|
106
|
-
if (redraw) {
|
|
107
|
-
display(books, marketTrades, session, endpointUrl);
|
|
72
|
+
display(desk, session, endpointUrl);
|
|
73
|
+
desk.onSessionChange((s) => {
|
|
74
|
+
session = s;
|
|
75
|
+
display(desk, session, endpointUrl);
|
|
76
|
+
if (s.state === SESSION_STATE_CLOSED) {
|
|
77
|
+
console.log("Session closed.");
|
|
78
|
+
desk.close();
|
|
79
|
+
fm.close();
|
|
80
|
+
process.exit(0);
|
|
108
81
|
}
|
|
109
82
|
});
|
|
83
|
+
for (const market of markets) {
|
|
84
|
+
desk.onBookChange(market.id, () => display(desk, session, endpointUrl));
|
|
85
|
+
}
|
|
110
86
|
// Keep alive — listen for Ctrl+C
|
|
111
87
|
process.on("SIGINT", () => {
|
|
112
88
|
console.log("\nStopped.");
|
package/dist/ticker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ticker.js","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ticker.js","sourceRoot":"","sources":["../src/ticker.ts"],"names":[],"mappings":"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"}
|
package/dist/trades.d.ts
CHANGED
|
@@ -1,40 +1,102 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trade history maintained from WebSocket order events.
|
|
3
3
|
*
|
|
4
|
-
* Port of fm.trades (Python) / fm.
|
|
4
|
+
* Port of fm.trades (Python) / fm.Trade and fm.Tape (Java).
|
|
5
5
|
*/
|
|
6
6
|
import type { Market, Order } from "./types.js";
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* One trade: the resting order, the order that crossed it, and the numbers
|
|
9
|
+
* each side contributes.
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
11
|
+
* A trade is not a distinct thing on the wire. The exchange expresses one as a
|
|
12
|
+
* pair of orders referring to each other, so every number a caller wants has to
|
|
13
|
+
* be read off one side or the other — and *which* side is the part that is easy
|
|
14
|
+
* to get wrong. Both sides are kept here, and the derived fields record the
|
|
15
|
+
* choice rather than leaving each caller to make it again:
|
|
16
|
+
*
|
|
17
|
+
* - `price` and `units` come from `resting`, which carries the terms the trade
|
|
18
|
+
* happened on.
|
|
19
|
+
* - `at` comes from `aggressor`, because the trade happened when the incoming
|
|
20
|
+
* order arrived, not when the quote it took was posted.
|
|
21
|
+
*
|
|
22
|
+
* The pairing rule is the one `TradesSummary` in fm-manager has always used: an
|
|
23
|
+
* order that is a consumed limit whose consumer is also a limit is one side of
|
|
24
|
+
* a match, and {@link isResting} says which side. Before this type existed the
|
|
25
|
+
* tape kept only the resting order, so "who took this trade" answered with the
|
|
26
|
+
* maker — a real participant, at a real price, in a complete-looking line that
|
|
27
|
+
* named the wrong person.
|
|
28
|
+
*/
|
|
29
|
+
export interface Trade {
|
|
30
|
+
resting: Order;
|
|
31
|
+
aggressor: Order;
|
|
32
|
+
price: number;
|
|
33
|
+
units: number;
|
|
34
|
+
at: Date | null;
|
|
35
|
+
}
|
|
36
|
+
/** A trade from its two sides, taking each derived field off the side that
|
|
37
|
+
* carries it. */
|
|
38
|
+
export declare function tradeOf(resting: Order, aggressor: Order): Trade;
|
|
39
|
+
/**
|
|
40
|
+
* Bounded FIFO queue of executed trades for a single market, newest last.
|
|
41
|
+
*
|
|
42
|
+
* Updated incrementally from WebSocket ORDERS-UPDATE events, and seeded from
|
|
43
|
+
* the `/v1/orders/recent-trades` snapshot. Keeps the most recent `capacity`
|
|
44
|
+
* trades.
|
|
45
|
+
*
|
|
46
|
+
* Each batch is sorted by the time the aggressor arrived before it is appended,
|
|
47
|
+
* which is what makes "newest last" true rather than merely intended. Up to and
|
|
48
|
+
* including fm-server 4.3.1 the snapshot Desk seeds and re-seeds from — on
|
|
49
|
+
* open, on a sequence gap, and after a reconnect — arrived newest *first*, so a
|
|
50
|
+
* tape that appended in array order held its trades backwards and the caller
|
|
51
|
+
* asking for the latest one got the oldest it had retained. Later servers send
|
|
52
|
+
* it oldest-first; sorting here is what makes the tape's own contract
|
|
53
|
+
* independent of which one answered.
|
|
12
54
|
*/
|
|
13
|
-
export declare class
|
|
55
|
+
export declare class Tape {
|
|
14
56
|
readonly market: Market;
|
|
15
57
|
readonly capacity: number;
|
|
16
58
|
private readonly _container;
|
|
17
59
|
constructor(market: Market, capacity?: number);
|
|
18
60
|
get marketId(): number;
|
|
19
61
|
size(): number;
|
|
20
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Apply an orders update, and return the trades it added — oldest first, and
|
|
64
|
+
* empty for the many updates that move the book without trading. What
|
|
65
|
+
* Desk hands to an `onTrade` handler.
|
|
66
|
+
*/
|
|
67
|
+
update(orders: Order[]): Trade[];
|
|
21
68
|
private _append;
|
|
22
|
-
mostRecentTrades():
|
|
69
|
+
mostRecentTrades(): Trade[];
|
|
70
|
+
/** The most recent trade — what a caller asking "what just happened" wants.
|
|
71
|
+
* `null` when nothing has traded yet. */
|
|
72
|
+
last(): Trade | null;
|
|
23
73
|
mostRecentPrices(): number[];
|
|
24
|
-
drain():
|
|
25
|
-
/** Empty the trade tape — used by
|
|
74
|
+
drain(): Trade[];
|
|
75
|
+
/** Empty the trade tape — used by Desk's gap-recovery flow. */
|
|
26
76
|
clear(): void;
|
|
27
77
|
}
|
|
28
78
|
/**
|
|
29
|
-
* Container of
|
|
79
|
+
* Container of Tape instances, one per market.
|
|
30
80
|
*/
|
|
31
|
-
export declare class
|
|
81
|
+
export declare class TapeIndex {
|
|
32
82
|
private readonly _trades;
|
|
33
83
|
constructor(markets: Market[], capacity?: number);
|
|
34
|
-
|
|
84
|
+
/**
|
|
85
|
+
* Apply an orders update to every tape, and return the trades each market
|
|
86
|
+
* gained, keyed by market id, with markets that gained none left out — which
|
|
87
|
+
* is most of them on most updates.
|
|
88
|
+
*
|
|
89
|
+
* Desk dispatches `onTrade` from this rather than diffing tape sizes,
|
|
90
|
+
* since a full tape drops its oldest as it takes a new one and the size does
|
|
91
|
+
* not move.
|
|
92
|
+
*/
|
|
93
|
+
update(orders: Order[]): Map<number, Trade[]>;
|
|
35
94
|
mostRecentPrices(): number[][];
|
|
36
|
-
collection():
|
|
37
|
-
|
|
38
|
-
|
|
95
|
+
collection(): Tape[];
|
|
96
|
+
/** That market's tape, or null when the market is not in this marketplace —
|
|
97
|
+
* the lookup Desk needs, where an unknown id is an answer rather than
|
|
98
|
+
* a crash on the next property read. */
|
|
99
|
+
get(marketId: number): Tape | null;
|
|
100
|
+
/** Empty every per-market trade tape — see {@link Tape.clear}. */
|
|
39
101
|
clear(): void;
|
|
40
102
|
}
|
package/dist/trades.js
CHANGED
|
@@ -1,16 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Trade history maintained from WebSocket order events.
|
|
3
3
|
*
|
|
4
|
-
* Port of fm.trades (Python) / fm.
|
|
4
|
+
* Port of fm.trades (Python) / fm.Trade and fm.Tape (Java).
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { findOrder, isConsumed, isLimit, isResting, isSymbol } from "./order-utils.js";
|
|
7
|
+
/** A trade from its two sides, taking each derived field off the side that
|
|
8
|
+
* carries it. */
|
|
9
|
+
export function tradeOf(resting, aggressor) {
|
|
10
|
+
return {
|
|
11
|
+
resting,
|
|
12
|
+
aggressor,
|
|
13
|
+
price: resting.price,
|
|
14
|
+
units: resting.units,
|
|
15
|
+
at: aggressor.lastModifiedDate,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
7
18
|
/**
|
|
8
|
-
* Bounded FIFO queue of executed trades for a single market.
|
|
19
|
+
* Bounded FIFO queue of executed trades for a single market, newest last.
|
|
20
|
+
*
|
|
21
|
+
* Updated incrementally from WebSocket ORDERS-UPDATE events, and seeded from
|
|
22
|
+
* the `/v1/orders/recent-trades` snapshot. Keeps the most recent `capacity`
|
|
23
|
+
* trades.
|
|
9
24
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
25
|
+
* Each batch is sorted by the time the aggressor arrived before it is appended,
|
|
26
|
+
* which is what makes "newest last" true rather than merely intended. Up to and
|
|
27
|
+
* including fm-server 4.3.1 the snapshot Desk seeds and re-seeds from — on
|
|
28
|
+
* open, on a sequence gap, and after a reconnect — arrived newest *first*, so a
|
|
29
|
+
* tape that appended in array order held its trades backwards and the caller
|
|
30
|
+
* asking for the latest one got the oldest it had retained. Later servers send
|
|
31
|
+
* it oldest-first; sorting here is what makes the tape's own contract
|
|
32
|
+
* independent of which one answered.
|
|
12
33
|
*/
|
|
13
|
-
export class
|
|
34
|
+
export class Tape {
|
|
14
35
|
market;
|
|
15
36
|
capacity;
|
|
16
37
|
_container = [];
|
|
@@ -27,32 +48,34 @@ export class Trades {
|
|
|
27
48
|
return this._container.length;
|
|
28
49
|
}
|
|
29
50
|
// -- update from WebSocket events ------------------------------------------
|
|
51
|
+
/**
|
|
52
|
+
* Apply an orders update, and return the trades it added — oldest first, and
|
|
53
|
+
* empty for the many updates that move the book without trading. What
|
|
54
|
+
* Desk hands to an `onTrade` handler.
|
|
55
|
+
*/
|
|
30
56
|
update(orders) {
|
|
31
|
-
const
|
|
57
|
+
const found = [];
|
|
32
58
|
for (const order of orders) {
|
|
33
59
|
if (!isSymbol(this.market.symbol, order))
|
|
34
60
|
continue;
|
|
35
|
-
if (
|
|
61
|
+
if (!isLimit(order) || !isConsumed(order))
|
|
62
|
+
continue;
|
|
63
|
+
const aggressor = findOrder(orders, order.consumer);
|
|
64
|
+
if (aggressor === null || !isLimit(aggressor))
|
|
36
65
|
continue;
|
|
37
|
-
if (
|
|
66
|
+
if (!isResting(orders, order))
|
|
38
67
|
continue;
|
|
39
|
-
|
|
40
|
-
consumers.set(order.id, order);
|
|
41
|
-
const consumer = consumers.get(order.consumer);
|
|
42
|
-
if (consumer !== undefined) {
|
|
43
|
-
// The resting order is the one with the older original ID
|
|
44
|
-
if (order.original < consumer.original) {
|
|
45
|
-
this._append(order);
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
this._append(consumer);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
68
|
+
found.push(tradeOf(order, aggressor));
|
|
52
69
|
}
|
|
70
|
+
// Stable since ES2019, so trades the server did not stamp keep the order
|
|
71
|
+
// it delivered them in rather than being shuffled among themselves.
|
|
72
|
+
found.sort((a, b) => time(a) - time(b));
|
|
73
|
+
for (const trade of found)
|
|
74
|
+
this._append(trade);
|
|
75
|
+
return found;
|
|
53
76
|
}
|
|
54
|
-
_append(
|
|
55
|
-
this._container.push(
|
|
77
|
+
_append(trade) {
|
|
78
|
+
this._container.push(trade);
|
|
56
79
|
while (this._container.length > this.capacity) {
|
|
57
80
|
this._container.shift();
|
|
58
81
|
}
|
|
@@ -61,33 +84,53 @@ export class Trades {
|
|
|
61
84
|
mostRecentTrades() {
|
|
62
85
|
return [...this._container];
|
|
63
86
|
}
|
|
87
|
+
/** The most recent trade — what a caller asking "what just happened" wants.
|
|
88
|
+
* `null` when nothing has traded yet. */
|
|
89
|
+
last() {
|
|
90
|
+
return this._container.length > 0
|
|
91
|
+
? this._container[this._container.length - 1]
|
|
92
|
+
: null;
|
|
93
|
+
}
|
|
64
94
|
mostRecentPrices() {
|
|
65
|
-
return this._container.map((
|
|
95
|
+
return this._container.map((t) => t.price);
|
|
66
96
|
}
|
|
67
97
|
drain() {
|
|
68
98
|
const trades = [...this._container];
|
|
69
99
|
this._container.length = 0;
|
|
70
100
|
return trades;
|
|
71
101
|
}
|
|
72
|
-
/** Empty the trade tape — used by
|
|
102
|
+
/** Empty the trade tape — used by Desk's gap-recovery flow. */
|
|
73
103
|
clear() {
|
|
74
104
|
this._container.length = 0;
|
|
75
105
|
}
|
|
76
106
|
}
|
|
77
107
|
/**
|
|
78
|
-
* Container of
|
|
108
|
+
* Container of Tape instances, one per market.
|
|
79
109
|
*/
|
|
80
|
-
export class
|
|
110
|
+
export class TapeIndex {
|
|
81
111
|
_trades = new Map();
|
|
82
112
|
constructor(markets, capacity = 100) {
|
|
83
113
|
for (const m of markets) {
|
|
84
|
-
this._trades.set(m.id, new
|
|
114
|
+
this._trades.set(m.id, new Tape(m, capacity));
|
|
85
115
|
}
|
|
86
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Apply an orders update to every tape, and return the trades each market
|
|
119
|
+
* gained, keyed by market id, with markets that gained none left out — which
|
|
120
|
+
* is most of them on most updates.
|
|
121
|
+
*
|
|
122
|
+
* Desk dispatches `onTrade` from this rather than diffing tape sizes,
|
|
123
|
+
* since a full tape drops its oldest as it takes a new one and the size does
|
|
124
|
+
* not move.
|
|
125
|
+
*/
|
|
87
126
|
update(orders) {
|
|
88
|
-
|
|
89
|
-
|
|
127
|
+
const added = new Map();
|
|
128
|
+
for (const [marketId, tape] of this._trades) {
|
|
129
|
+
const fresh = tape.update(orders);
|
|
130
|
+
if (fresh.length > 0)
|
|
131
|
+
added.set(marketId, fresh);
|
|
90
132
|
}
|
|
133
|
+
return added;
|
|
91
134
|
}
|
|
92
135
|
mostRecentPrices() {
|
|
93
136
|
return [...this._trades.values()]
|
|
@@ -97,13 +140,20 @@ export class MarketplaceTrades {
|
|
|
97
140
|
collection() {
|
|
98
141
|
return [...this._trades.values()];
|
|
99
142
|
}
|
|
143
|
+
/** That market's tape, or null when the market is not in this marketplace —
|
|
144
|
+
* the lookup Desk needs, where an unknown id is an answer rather than
|
|
145
|
+
* a crash on the next property read. */
|
|
100
146
|
get(marketId) {
|
|
101
|
-
return this._trades.get(marketId);
|
|
147
|
+
return this._trades.get(marketId) ?? null;
|
|
102
148
|
}
|
|
103
|
-
/** Empty every per-market trade tape — see {@link
|
|
149
|
+
/** Empty every per-market trade tape — see {@link Tape.clear}. */
|
|
104
150
|
clear() {
|
|
105
151
|
for (const t of this._trades.values())
|
|
106
152
|
t.clear();
|
|
107
153
|
}
|
|
108
154
|
}
|
|
155
|
+
/** Epoch millis for sorting, with unstamped trades last. */
|
|
156
|
+
function time(trade) {
|
|
157
|
+
return trade.at === null ? Number.POSITIVE_INFINITY : trade.at.getTime();
|
|
158
|
+
}
|
|
109
159
|
//# sourceMappingURL=trades.js.map
|
package/dist/trades.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trades.js","sourceRoot":"","sources":["../src/trades.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"trades.js","sourceRoot":"","sources":["../src/trades.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -189,9 +189,9 @@ export interface Session {
|
|
|
189
189
|
* The invalid case still cannot be written -- `"BYU"` is a type error -- which
|
|
190
190
|
* is what the old `ORDER_SIDE_BUY` constant could only suggest.
|
|
191
191
|
*/
|
|
192
|
-
export type
|
|
192
|
+
export type OrderSide = "BUY" | "SELL";
|
|
193
193
|
/** The members, for callers who prefer a name to a literal. */
|
|
194
|
-
export declare const
|
|
194
|
+
export declare const OrderSide: {
|
|
195
195
|
readonly BUY: "BUY";
|
|
196
196
|
readonly SELL: "SELL";
|
|
197
197
|
};
|
|
@@ -216,7 +216,7 @@ export declare const OrderType: {
|
|
|
216
216
|
* Refusing an unrecognised value would cost the caller a whole response -- an
|
|
217
217
|
* order list, a holdings snapshot -- over one field they may not read.
|
|
218
218
|
*/
|
|
219
|
-
export declare function toSide(value: string | null | undefined):
|
|
219
|
+
export declare function toSide(value: string | null | undefined): OrderSide | null;
|
|
220
220
|
/** Lenient for the same reason; the server has emitted `"MARKET"`. */
|
|
221
221
|
export declare function toOrderType(value: string | null | undefined): OrderType | null;
|
|
222
222
|
export interface Order {
|
|
@@ -225,7 +225,7 @@ export interface Order {
|
|
|
225
225
|
supplier: number;
|
|
226
226
|
consumer: number | null;
|
|
227
227
|
type: OrderType | null;
|
|
228
|
-
side:
|
|
228
|
+
side: OrderSide | null;
|
|
229
229
|
units: number;
|
|
230
230
|
price: number;
|
|
231
231
|
ownerId: number | null;
|
|
@@ -238,6 +238,27 @@ export interface Order {
|
|
|
238
238
|
createdDate: Date | null;
|
|
239
239
|
lastModifiedDate: Date | null;
|
|
240
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* The best human label a person record carries: the trimmed full name, or the
|
|
243
|
+
* email when there is no name.
|
|
244
|
+
*
|
|
245
|
+
* Every consumer of `users()` was writing this, because none of the three
|
|
246
|
+
* fields it reads can be relied on alone — `firstName` and `lastName` are each
|
|
247
|
+
* optional, and a person with neither still has to appear somewhere in a
|
|
248
|
+
* report.
|
|
249
|
+
*
|
|
250
|
+
* Deliberately not `"Name <email>"`: that is a presentation choice, and a
|
|
251
|
+
* caller who wants it can compose one from this and `email`.
|
|
252
|
+
*
|
|
253
|
+
* A function rather than a method because `Person` is a plain wire interface
|
|
254
|
+
* here — Java puts this on the record and Python on the dataclass, which is
|
|
255
|
+
* each language's own idiom for the same thing.
|
|
256
|
+
*
|
|
257
|
+
* @returns the full name, else the email, else null — and null only for a
|
|
258
|
+
* record carrying neither, which fm-server does not produce since email is
|
|
259
|
+
* the account key.
|
|
260
|
+
*/
|
|
261
|
+
export declare function displayName(person: Person): string | null;
|
|
241
262
|
export interface ClientConnection {
|
|
242
263
|
marketplaceId: number;
|
|
243
264
|
connectionId: number;
|
package/dist/types.js
CHANGED
|
@@ -78,7 +78,7 @@ export const SESSION_STATE_OPEN = "OPEN";
|
|
|
78
78
|
export const SESSION_STATE_PAUSED = "PAUSED";
|
|
79
79
|
export const SESSION_STATE_CLOSED = "CLOSED";
|
|
80
80
|
/** The members, for callers who prefer a name to a literal. */
|
|
81
|
-
export const
|
|
81
|
+
export const OrderSide = {
|
|
82
82
|
BUY: "BUY",
|
|
83
83
|
SELL: "SELL",
|
|
84
84
|
};
|
|
@@ -103,4 +103,31 @@ export function toOrderType(value) {
|
|
|
103
103
|
const upper = value?.trim().toUpperCase();
|
|
104
104
|
return upper === "LIMIT" || upper === "CANCEL" ? upper : null;
|
|
105
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* The best human label a person record carries: the trimmed full name, or the
|
|
108
|
+
* email when there is no name.
|
|
109
|
+
*
|
|
110
|
+
* Every consumer of `users()` was writing this, because none of the three
|
|
111
|
+
* fields it reads can be relied on alone — `firstName` and `lastName` are each
|
|
112
|
+
* optional, and a person with neither still has to appear somewhere in a
|
|
113
|
+
* report.
|
|
114
|
+
*
|
|
115
|
+
* Deliberately not `"Name <email>"`: that is a presentation choice, and a
|
|
116
|
+
* caller who wants it can compose one from this and `email`.
|
|
117
|
+
*
|
|
118
|
+
* A function rather than a method because `Person` is a plain wire interface
|
|
119
|
+
* here — Java puts this on the record and Python on the dataclass, which is
|
|
120
|
+
* each language's own idiom for the same thing.
|
|
121
|
+
*
|
|
122
|
+
* @returns the full name, else the email, else null — and null only for a
|
|
123
|
+
* record carrying neither, which fm-server does not produce since email is
|
|
124
|
+
* the account key.
|
|
125
|
+
*/
|
|
126
|
+
export function displayName(person) {
|
|
127
|
+
const name = `${(person.firstName ?? "").trim()} ${(person.lastName ?? "").trim()}`.trim();
|
|
128
|
+
if (name)
|
|
129
|
+
return name;
|
|
130
|
+
const email = (person.email ?? "").trim();
|
|
131
|
+
return email ? email : null;
|
|
132
|
+
}
|
|
106
133
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAoFlC;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,OAAgB,EAAE,QAAgB;IAC5D,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAyC;IACzE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC;AAmCD,+DAA+D;AAC/D,MAAM,UAAU,QAAQ;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,KAAa;IACrD,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,OAAe,EAAE,OAAe,EAAE,IAAY;IACrF,IAAI,IAAI,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAElE,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACtE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACvD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,KAAa;IACtD,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,KAAa;IACrD,OAAO,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;AACnF,CAAC;AAUD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AACzC,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AA2B7C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/dist/market-view.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"market-view.js","sourceRoot":"","sources":["../src/market-view.ts"],"names":[],"mappings":"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"}
|