@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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MarketView — always-current view of a single marketplace, hiding
2
+ * Desk — always-current state for a single marketplace, hiding
3
3
  * transport details (WebSocket subscribe, snapshot+delta
4
4
  * reconciliation, sequence-gap recovery, reconnect) behind a small
5
5
  * read-side surface. Mirrors the Java + Python SDKs; same staged
@@ -10,17 +10,18 @@
10
10
  * snapshot seed, no sharing, no reconnect — those land in Phase 2.
11
11
  */
12
12
  import type { Flexemarkets } from "./client.js";
13
- import { OrderBook } from "./orderbook.js";
13
+ import { Book } from "./orderbook.js";
14
+ import { type Trade, type Tape } from "./trades.js";
14
15
  import type { Holding, Market, Order, Session } from "./types.js";
15
16
  /**
16
- * Handle returned by `MarketView.on*` listener registrations. Call
17
+ * Handle returned by `Desk.on*` listener registrations. Call
17
18
  * to unregister. Idempotent — multiple calls are no-ops.
18
19
  */
19
20
  export type Subscription = () => void;
20
21
  /**
21
- * Fires when MarketView detects a sequence-gap in the ORDERS-UPDATE
22
+ * Fires when Desk detects a sequence-gap in the ORDERS-UPDATE
22
23
  * WS stream — one or more frames were dropped between client and
23
- * fm-server. After a gap, MarketView re-runs the REST snapshot
24
+ * fm-server. After a gap, Desk re-runs the REST snapshot
24
25
  * recovery flow before applying further deltas; the gap event is the
25
26
  * signal callers can wire into their own observability stack instead
26
27
  * of relying on the SDK's default console.warn.
@@ -31,26 +32,46 @@ export interface GapEvent {
31
32
  readonly receivedSeq: number;
32
33
  }
33
34
  /**
34
- * Fires when MarketView reacts to a StreamDropped — either after
35
+ * Fires when Desk reacts to a StreamDropped — either after
35
36
  * the reconnect + resnapshot completes successfully, or after the
36
- * attempt has failed and the view is left stale.
37
+ * attempt has failed and the desk is left stale.
37
38
  */
38
- export interface ReconnectEvent {
39
+ export interface DeskRecovery {
39
40
  readonly marketplaceId: number;
40
41
  readonly success: boolean;
41
42
  readonly reason: string | null;
42
43
  }
43
- export interface MarketView {
44
- /** The marketplace this view tracks. */
44
+ export interface Desk {
45
+ /** The marketplace this desk tracks. */
45
46
  readonly marketplaceId: number;
46
- /** Markets in this marketplace, captured at observe-time. */
47
+ /** Markets in this marketplace, captured when the desk was opened. */
47
48
  readonly markets: Market[];
48
49
  /**
49
50
  * Always-current order book for `marketId`. Reads are atomic; a
50
51
  * caller never sees a half-applied delta. Returns null if
51
52
  * `marketId` isn't in this marketplace.
52
53
  */
53
- orderBook(marketId: number): OrderBook | null;
54
+ book(marketId: number): Book | null;
55
+ /**
56
+ * Always-current trade tape for `marketId`, most recent last. Returns null
57
+ * if `marketId` isn't in this marketplace.
58
+ *
59
+ * Maintained alongside {@link book}: seeded from the server's recent
60
+ * trades when the desk opens, then kept current from the same delta stream.
61
+ * Each `Trade` on it carries both sides of its match — the resting
62
+ * order that was taken and the aggressor that took it.
63
+ */
64
+ tape(marketId: number): Tape | null;
65
+ /**
66
+ * Every book this desk keeps, one per market.
67
+ *
68
+ * The whole-marketplace read that {@link book} answers one market at a time.
69
+ * A caller scanning for the best opportunity across markets wants this
70
+ * rather than {@link markets} zipped against {@link book}.
71
+ */
72
+ books(): Book[];
73
+ /** Every tape this desk keeps, one per market. */
74
+ tapes(): Tape[];
54
75
  /**
55
76
  * Most-recent session update observed. Null until the first
56
77
  * SESSION-UPDATE frame lands.
@@ -67,11 +88,30 @@ export interface MarketView {
67
88
  * Register a handler that fires when the order book for
68
89
  * `marketId` changes. The handler receives the post-update book.
69
90
  */
70
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
91
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
92
+ /**
93
+ * Register a handler that fires for each trade on `marketId`.
94
+ *
95
+ * The missing member of the family {@link onBookChange} and
96
+ * {@link onSessionChange} belong to. Without it, "tell me when a trade
97
+ * happens" is asked as "tell me when the book changed, then let me look" —
98
+ * which answers a different question, since a book changes on every resting
99
+ * order and most changes are not trades.
100
+ *
101
+ * Fires **once per trade**, oldest first, rather than coalescing a batch the
102
+ * way {@link onBookChange} does. A trade is a discrete event with its own
103
+ * price and counterparties; collapsing two into one callback would lose one.
104
+ *
105
+ * Live deltas only. A gap or a reconnect re-seeds the tape from the server's
106
+ * snapshot, and those trades do not fire here — they are not new, they are
107
+ * what was missed. {@link onGap} and {@link onRecovery} are how a caller
108
+ * learns that happened.
109
+ */
110
+ onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
71
111
  /** Register a handler for the caller's holding changes. */
72
112
  onHoldingChange(handler: (h: Holding) => void): Subscription;
73
113
  /**
74
- * Register a handler that fires when MarketView detects a gap in
114
+ * Register a handler that fires when Desk detects a gap in
75
115
  * the ORDERS-UPDATE seq stream. Use this to wire your own
76
116
  * telemetry — by default the SDK logs to console.warn but
77
117
  * otherwise hides the recovery flow.
@@ -80,10 +120,10 @@ export interface MarketView {
80
120
  /**
81
121
  * Register a handler that fires after the SDK reacts to a
82
122
  * transport error — either when reconnect + resnapshot have
83
- * completed, or when the attempt has failed and the view is left
123
+ * completed, or when the attempt has failed and the desk is left
84
124
  * stale.
85
125
  */
86
- onReconnect(handler: (event: ReconnectEvent) => void): Subscription;
126
+ onRecovery(handler: (event: DeskRecovery) => void): Subscription;
87
127
  /** Submit a limit order on this marketplace. */
88
128
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
89
129
  /** Cancel a previously-submitted order. */
@@ -95,11 +135,11 @@ export interface MarketView {
95
135
  */
96
136
  close(): void;
97
137
  }
98
- export declare class DefaultMarketView implements MarketView {
138
+ export declare class DefaultDesk implements Desk {
99
139
  readonly marketplaceId: number;
100
140
  readonly markets: Market[];
101
141
  private readonly _flexemarkets;
102
- private readonly _orderBooks;
142
+ private readonly _books;
103
143
  private readonly _trades;
104
144
  private _events;
105
145
  private _session;
@@ -107,18 +147,19 @@ export declare class DefaultMarketView implements MarketView {
107
147
  private readonly _sessionHandlers;
108
148
  private readonly _holdingHandlers;
109
149
  private readonly _bookHandlers;
150
+ private readonly _tradeHandlers;
110
151
  private readonly _gapHandlers;
111
152
  private readonly _reconnectHandlers;
112
153
  private _closed;
113
154
  /**
114
- * Highest ORDERS-UPDATE seq this view has applied so far. Deltas
155
+ * Highest ORDERS-UPDATE seq this desk has applied so far. Deltas
115
156
  * with `seq <= _lastAppliedSeq` are skipped — they've already been
116
157
  * folded into the local state via the initial REST snapshot or a
117
158
  * previously-applied delta. Initial value comes from the snapshot's
118
159
  * `asOfSeq`; `NO_SEQ` disables filtering (older fm-server).
119
160
  */
120
161
  private _lastAppliedSeq;
121
- static open(flexemarkets: Flexemarkets, marketplaceId: number): Promise<DefaultMarketView>;
162
+ static open(flexemarkets: Flexemarkets, marketplaceId: number): Promise<DefaultDesk>;
122
163
  private _seedComplete;
123
164
  private _seedBuffer;
124
165
  private constructor();
@@ -136,14 +177,18 @@ export declare class DefaultMarketView implements MarketView {
136
177
  * Phase 2b (gap recovery + ID-based dedup) closes the window.
137
178
  */
138
179
  private _seedFromSnapshot;
139
- orderBook(marketId: number): OrderBook | null;
180
+ book(marketId: number): Book | null;
181
+ tape(marketId: number): Tape | null;
182
+ books(): Book[];
183
+ tapes(): Tape[];
140
184
  session(): Session | null;
141
185
  holding(): Holding | null;
142
186
  onSessionChange(handler: (s: Session) => void): Subscription;
143
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
187
+ onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
188
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
144
189
  onHoldingChange(handler: (h: Holding) => void): Subscription;
145
190
  onGap(handler: (e: GapEvent) => void): Subscription;
146
- onReconnect(handler: (e: ReconnectEvent) => void): Subscription;
191
+ onRecovery(handler: (e: DeskRecovery) => void): Subscription;
147
192
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
148
193
  submitCancel(marketId: number, originalId: number): Promise<Order>;
149
194
  close(): void;
@@ -152,21 +197,21 @@ export declare class DefaultMarketView implements MarketView {
152
197
  /**
153
198
  * Re-seed once the transport is back.
154
199
  *
155
- * Reconnecting is not this layer's job -- a `Reconnected` only arrives
200
+ * Reconnecting is not this layer's job -- a `StreamReconnected` only arrives
156
201
  * because the listener already restored the subscription. Reseeding is: a
157
202
  * reconnect is the largest possible sequence gap, so _seedFromSnapshot()
158
203
  * (clear + REST snapshot + reapply + seq watermark) is what converges the
159
- * state, exactly as it does for a small one. If it fails the view is left
160
- * stale until the caller close()s and observe()s again.
204
+ * state, exactly as it does for a small one. If it fails the desk is left
205
+ * stale until the caller close()s and desk()s again.
161
206
  */
162
207
  private _reseedAfterReconnect;
163
208
  private _applyOrdersUpdate;
164
209
  private _ensureOpen;
165
210
  }
166
211
  /**
167
- * Reader-side handle on a refcounted DefaultMarketView. Returned by
168
- * Flexemarkets.observe(); multiple handles for the same marketplaceId
169
- * share one underlying view + WS subscription + materialized state.
212
+ * Reader-side handle on a refcounted DefaultDesk. Returned by
213
+ * Flexemarkets.desk(); multiple handles for the same marketplaceId
214
+ * share one underlying desk + WS subscription + materialized state.
170
215
  * Each handle's close() decrements the shared refcount and tears down
171
216
  * the shared resources on the last close.
172
217
  *
@@ -174,22 +219,26 @@ export declare class DefaultMarketView implements MarketView {
174
219
  * locally and closed when the handle closes — so a handler doesn't
175
220
  * keep firing into stale state after the handle is gone.
176
221
  */
177
- export declare class MarketViewHandle implements MarketView {
222
+ export declare class DeskHandle implements Desk {
178
223
  private readonly _shared;
179
224
  private readonly _onClose;
180
225
  private readonly _mySubscriptions;
181
226
  private _closed;
182
- constructor(shared: DefaultMarketView, onClose: () => void);
227
+ constructor(shared: DefaultDesk, onClose: () => void);
183
228
  get marketplaceId(): number;
184
229
  get markets(): Market[];
185
- orderBook(marketId: number): OrderBook | null;
230
+ book(marketId: number): Book | null;
231
+ tape(marketId: number): Tape | null;
232
+ books(): Book[];
233
+ tapes(): Tape[];
186
234
  session(): Session | null;
187
235
  holding(): Holding | null;
188
236
  onSessionChange(handler: (s: Session) => void): Subscription;
189
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
237
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
238
+ onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
190
239
  onHoldingChange(handler: (h: Holding) => void): Subscription;
191
240
  onGap(handler: (e: GapEvent) => void): Subscription;
192
- onReconnect(handler: (e: ReconnectEvent) => void): Subscription;
241
+ onRecovery(handler: (e: DeskRecovery) => void): Subscription;
193
242
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
194
243
  submitCancel(marketId: number, originalId: number): Promise<Order>;
195
244
  close(): void;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MarketView — always-current view of a single marketplace, hiding
2
+ * Desk — always-current state for a single marketplace, hiding
3
3
  * transport details (WebSocket subscribe, snapshot+delta
4
4
  * reconciliation, sequence-gap recovery, reconnect) behind a small
5
5
  * read-side surface. Mirrors the Java + Python SDKs; same staged
@@ -9,14 +9,14 @@
9
9
  * existing listen() / callback pipe. No reconciliation, no
10
10
  * snapshot seed, no sharing, no reconnect — those land in Phase 2.
11
11
  */
12
- import { OrderBooks } from "./orderbook.js";
13
- import { MarketplaceTrades } from "./trades.js";
12
+ import { BookIndex } from "./orderbook.js";
13
+ import { TapeIndex } from "./trades.js";
14
14
  import { NO_SEQ } from "./stomp.js";
15
- export class DefaultMarketView {
15
+ export class DefaultDesk {
16
16
  marketplaceId;
17
17
  markets;
18
18
  _flexemarkets;
19
- _orderBooks;
19
+ _books;
20
20
  _trades;
21
21
  _events = null;
22
22
  _session = null;
@@ -24,11 +24,12 @@ export class DefaultMarketView {
24
24
  _sessionHandlers = [];
25
25
  _holdingHandlers = [];
26
26
  _bookHandlers = [];
27
+ _tradeHandlers = [];
27
28
  _gapHandlers = [];
28
29
  _reconnectHandlers = [];
29
30
  _closed = false;
30
31
  /**
31
- * Highest ORDERS-UPDATE seq this view has applied so far. Deltas
32
+ * Highest ORDERS-UPDATE seq this desk has applied so far. Deltas
32
33
  * with `seq <= _lastAppliedSeq` are skipped — they've already been
33
34
  * folded into the local state via the initial REST snapshot or a
34
35
  * previously-applied delta. Initial value comes from the snapshot's
@@ -37,7 +38,7 @@ export class DefaultMarketView {
37
38
  _lastAppliedSeq = NO_SEQ;
38
39
  static async open(flexemarkets, marketplaceId) {
39
40
  const markets = await flexemarkets.markets(marketplaceId);
40
- const view = new DefaultMarketView(flexemarkets, marketplaceId, markets);
41
+ const desk = new DefaultDesk(flexemarkets, marketplaceId, markets);
41
42
  // Subscribe WS first (so deltas start buffering on the callback
42
43
  // path), then fetch + apply the snapshot, only THEN allow live
43
44
  // dispatch. _seedFromSnapshot flips _seedComplete=true atomically
@@ -45,22 +46,22 @@ export class DefaultMarketView {
45
46
  //
46
47
  // Phase 2d: own the EventListener directly rather than calling
47
48
  // flexemarkets.listen() — that would clobber the singleton
48
- // _eventListener and prevent multiple shared views from
49
+ // _eventListener and prevent multiple shared desks from
49
50
  // coexisting in one Flexemarkets.
50
- view._events = await flexemarkets._connectEvents(marketplaceId, (event) => view._dispatch(event));
51
- await view._seedFromSnapshot();
52
- return view;
51
+ desk._events = await flexemarkets._connectEvents(marketplaceId, (event) => desk._dispatch(event));
52
+ await desk._seedFromSnapshot();
53
+ return desk;
53
54
  }
54
55
  _seedComplete = false;
55
56
  _seedBuffer = [];
56
- // 100 matches the default per-market Trades capacity. Plumb through to
57
- // observe() later if a caller needs deeper trade scrollback.
57
+ // 100 matches the default per-market Tape capacity. Plumb through to
58
+ // desk() later if a caller needs deeper trade scrollback.
58
59
  constructor(flexemarkets, marketplaceId, markets) {
59
60
  this._flexemarkets = flexemarkets;
60
61
  this.marketplaceId = marketplaceId;
61
62
  this.markets = markets;
62
- this._orderBooks = new OrderBooks(markets);
63
- this._trades = new MarketplaceTrades(markets, 100);
63
+ this._books = new BookIndex(markets);
64
+ this._trades = new TapeIndex(markets, 100);
64
65
  }
65
66
  /**
66
67
  * Phase 2a snapshot seeding. Fetches the V1 active-orders and
@@ -81,10 +82,10 @@ export class DefaultMarketView {
81
82
  // Clear before reseeding so a resync (Phase 2b) doesn't double-add
82
83
  // against existing price levels. Initial seed hits empty books so
83
84
  // clear() is a no-op there.
84
- this._orderBooks.clear();
85
+ this._books.clear();
85
86
  this._trades.clear();
86
87
  if (orders.body.length > 0)
87
- this._orderBooks.update(orders.body);
88
+ this._books.update(orders.body);
88
89
  if (trades.body.length > 0)
89
90
  this._trades.update(trades.body);
90
91
  this._lastAppliedSeq = orders.asOfSeq;
@@ -99,9 +100,21 @@ export class DefaultMarketView {
99
100
  for (const update of buffered)
100
101
  this._applyOrdersUpdate(update);
101
102
  }
102
- orderBook(marketId) {
103
+ book(marketId) {
103
104
  this._ensureOpen();
104
- return this._orderBooks.get(marketId) ?? null;
105
+ return this._books.get(marketId) ?? null;
106
+ }
107
+ tape(marketId) {
108
+ this._ensureOpen();
109
+ return this._trades.get(marketId);
110
+ }
111
+ books() {
112
+ this._ensureOpen();
113
+ return [...this._books.collection()];
114
+ }
115
+ tapes() {
116
+ this._ensureOpen();
117
+ return [...this._trades.collection()];
105
118
  }
106
119
  session() {
107
120
  this._ensureOpen();
@@ -120,7 +133,17 @@ export class DefaultMarketView {
120
133
  this._sessionHandlers.splice(i, 1);
121
134
  };
122
135
  }
123
- onOrderBookChange(marketId, handler) {
136
+ onTrade(marketId, handler) {
137
+ this._ensureOpen();
138
+ const entry = { marketId, handler };
139
+ this._tradeHandlers.push(entry);
140
+ return () => {
141
+ const i = this._tradeHandlers.indexOf(entry);
142
+ if (i >= 0)
143
+ this._tradeHandlers.splice(i, 1);
144
+ };
145
+ }
146
+ onBookChange(marketId, handler) {
124
147
  this._ensureOpen();
125
148
  const entry = { marketId, handler };
126
149
  this._bookHandlers.push(entry);
@@ -148,7 +171,7 @@ export class DefaultMarketView {
148
171
  this._gapHandlers.splice(i, 1);
149
172
  };
150
173
  }
151
- onReconnect(handler) {
174
+ onRecovery(handler) {
152
175
  this._ensureOpen();
153
176
  this._reconnectHandlers.push(handler);
154
177
  return () => {
@@ -177,7 +200,7 @@ export class DefaultMarketView {
177
200
  this._events = null;
178
201
  }
179
202
  // Flexemarkets is owned by the caller; we don't close it. If
180
- // observe() was the only consumer, the caller can close
203
+ // desk() was the only consumer, the caller can close
181
204
  // Flexemarkets themselves.
182
205
  }
183
206
  _resyncInFlight = false;
@@ -199,7 +222,7 @@ export class DefaultMarketView {
199
222
  this._lastAppliedSeq !== NO_SEQ &&
200
223
  event.seq > this._lastAppliedSeq + 1) {
201
224
  const expectedSeq = this._lastAppliedSeq + 1;
202
- console.warn(`[MarketView] ORDERS-UPDATE seq gap on marketplace ${this.marketplaceId} ` +
225
+ console.warn(`[Desk] ORDERS-UPDATE seq gap on marketplace ${this.marketplaceId} ` +
203
226
  `— expected ${expectedSeq}, got ${event.seq}; resyncing from snapshot`);
204
227
  const gap = {
205
228
  marketplaceId: this.marketplaceId,
@@ -237,7 +260,7 @@ export class DefaultMarketView {
237
260
  }
238
261
  if (_isStreamDropped(event)) {
239
262
  // The subscription restores itself; nothing to do but say so.
240
- console.warn(`[MarketView] WS transport error on marketplace ${this.marketplaceId}: ${event.exception.message}`);
263
+ console.warn(`[Desk] WS transport error on marketplace ${this.marketplaceId}: ${event.exception.message}`);
241
264
  return;
242
265
  }
243
266
  if (_isReconnected(event)) {
@@ -247,8 +270,8 @@ export class DefaultMarketView {
247
270
  if (_isFrameUnreadable(event)) {
248
271
  // STOMP ERROR / parse failure. Logged for visibility;
249
272
  // reconnecting won't help with a malformed frame, so we leave
250
- // the view as-is.
251
- console.warn(`[MarketView] WS error on marketplace ${this.marketplaceId}: ${event.command} ${event.body}`);
273
+ // the desk as-is.
274
+ console.warn(`[Desk] WS error on marketplace ${this.marketplaceId}: ${event.command} ${event.body}`);
252
275
  return;
253
276
  }
254
277
  // VERSION, SESSION-LIST — not reflected in the public surface yet.
@@ -256,12 +279,12 @@ export class DefaultMarketView {
256
279
  /**
257
280
  * Re-seed once the transport is back.
258
281
  *
259
- * Reconnecting is not this layer's job -- a `Reconnected` only arrives
282
+ * Reconnecting is not this layer's job -- a `StreamReconnected` only arrives
260
283
  * because the listener already restored the subscription. Reseeding is: a
261
284
  * reconnect is the largest possible sequence gap, so _seedFromSnapshot()
262
285
  * (clear + REST snapshot + reapply + seq watermark) is what converges the
263
- * state, exactly as it does for a small one. If it fails the view is left
264
- * stale until the caller close()s and observe()s again.
286
+ * state, exactly as it does for a small one. If it fails the desk is left
287
+ * stale until the caller close()s and desk()s again.
265
288
  */
266
289
  _reseedAfterReconnect() {
267
290
  if (this._resyncInFlight)
@@ -276,11 +299,11 @@ export class DefaultMarketView {
276
299
  }
277
300
  catch (err) {
278
301
  const reason = err instanceof Error ? err.message : String(err);
279
- console.error(`[MarketView] Reconnect failed on marketplace ${this.marketplaceId}; view is stale: ${reason}`);
302
+ console.error(`[Desk] Reconnect failed on marketplace ${this.marketplaceId}; desk is stale: ${reason}`);
280
303
  outcome = { marketplaceId: this.marketplaceId, success: false, reason };
281
304
  // Leave _resyncInFlight=true so subsequent dispatches keep
282
305
  // buffering rather than corrupting state; caller can close()
283
- // and observe() to recover.
306
+ // and desk() to recover.
284
307
  }
285
308
  for (const h of this._reconnectHandlers) {
286
309
  try {
@@ -301,10 +324,21 @@ export class DefaultMarketView {
301
324
  }
302
325
  const orders = update.orders;
303
326
  const touched = _marketIdsTouched(orders);
304
- this._orderBooks.update(orders);
305
- this._trades.update(orders);
327
+ this._books.update(orders);
328
+ const traded = this._trades.update(orders);
329
+ // Tape first: the more specific event, and a book handler that then reads
330
+ // the tape sees the same trade the trade handler was just given. Both
331
+ // aggregators are already current either way — what is ordered here is only
332
+ // which handler hears about it first.
333
+ for (const [marketId, fresh] of traded) {
334
+ for (const h of this._tradeHandlers) {
335
+ if (h.marketId === marketId)
336
+ for (const trade of fresh)
337
+ h.handler(trade);
338
+ }
339
+ }
306
340
  for (const marketId of touched) {
307
- const book = this._orderBooks.get(marketId);
341
+ const book = this._books.get(marketId);
308
342
  if (!book)
309
343
  continue;
310
344
  for (const h of this._bookHandlers) {
@@ -317,7 +351,7 @@ export class DefaultMarketView {
317
351
  }
318
352
  _ensureOpen() {
319
353
  if (this._closed) {
320
- throw new Error(`MarketView for marketplace ${this.marketplaceId} is closed`);
354
+ throw new Error(`Desk for marketplace ${this.marketplaceId} is closed`);
321
355
  }
322
356
  }
323
357
  }
@@ -346,9 +380,9 @@ function _isFrameUnreadable(event) {
346
380
  return typeof event === "object" && event !== null && event.kind === "frame-unreadable";
347
381
  }
348
382
  /**
349
- * Reader-side handle on a refcounted DefaultMarketView. Returned by
350
- * Flexemarkets.observe(); multiple handles for the same marketplaceId
351
- * share one underlying view + WS subscription + materialized state.
383
+ * Reader-side handle on a refcounted DefaultDesk. Returned by
384
+ * Flexemarkets.desk(); multiple handles for the same marketplaceId
385
+ * share one underlying desk + WS subscription + materialized state.
352
386
  * Each handle's close() decrements the shared refcount and tears down
353
387
  * the shared resources on the last close.
354
388
  *
@@ -356,7 +390,7 @@ function _isFrameUnreadable(event) {
356
390
  * locally and closed when the handle closes — so a handler doesn't
357
391
  * keep firing into stale state after the handle is gone.
358
392
  */
359
- export class MarketViewHandle {
393
+ export class DeskHandle {
360
394
  _shared;
361
395
  _onClose;
362
396
  _mySubscriptions = [];
@@ -372,9 +406,21 @@ export class MarketViewHandle {
372
406
  this._check();
373
407
  return this._shared.markets;
374
408
  }
375
- orderBook(marketId) {
409
+ book(marketId) {
410
+ this._check();
411
+ return this._shared.book(marketId);
412
+ }
413
+ tape(marketId) {
414
+ this._check();
415
+ return this._shared.tape(marketId);
416
+ }
417
+ books() {
376
418
  this._check();
377
- return this._shared.orderBook(marketId);
419
+ return this._shared.books();
420
+ }
421
+ tapes() {
422
+ this._check();
423
+ return this._shared.tapes();
378
424
  }
379
425
  session() {
380
426
  this._check();
@@ -390,9 +436,15 @@ export class MarketViewHandle {
390
436
  this._mySubscriptions.push(sub);
391
437
  return sub;
392
438
  }
393
- onOrderBookChange(marketId, handler) {
439
+ onBookChange(marketId, handler) {
440
+ this._check();
441
+ const sub = this._shared.onBookChange(marketId, handler);
442
+ this._mySubscriptions.push(sub);
443
+ return sub;
444
+ }
445
+ onTrade(marketId, handler) {
394
446
  this._check();
395
- const sub = this._shared.onOrderBookChange(marketId, handler);
447
+ const sub = this._shared.onTrade(marketId, handler);
396
448
  this._mySubscriptions.push(sub);
397
449
  return sub;
398
450
  }
@@ -408,9 +460,9 @@ export class MarketViewHandle {
408
460
  this._mySubscriptions.push(sub);
409
461
  return sub;
410
462
  }
411
- onReconnect(handler) {
463
+ onRecovery(handler) {
412
464
  this._check();
413
- const sub = this._shared.onReconnect(handler);
465
+ const sub = this._shared.onRecovery(handler);
414
466
  this._mySubscriptions.push(sub);
415
467
  return sub;
416
468
  }
@@ -440,8 +492,8 @@ export class MarketViewHandle {
440
492
  }
441
493
  _check() {
442
494
  if (this._closed) {
443
- throw new Error(`MarketView handle for marketplace ${this._shared.marketplaceId} is closed`);
495
+ throw new Error(`Desk handle for marketplace ${this._shared.marketplaceId} is closed`);
444
496
  }
445
497
  }
446
498
  }
447
- //# sourceMappingURL=market-view.js.map
499
+ //# sourceMappingURL=desk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desk.js","sourceRoot":"","sources":["../src/desk.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  /** Flexemarkets TypeScript SDK. */
2
- export type { Person, Account, Token, Security, Holding, Market, Marketplace, Session, Order, ClientConnection, TickGrid, Version, ConflictFailure, } from "./types.js";
3
- export { Side, OrderType, toSide, toOrderType, SESSION_STATE_INIT, SESSION_STATE_OPEN, SESSION_STATE_PAUSED, SESSION_STATE_CLOSED, getSecurity, isApproved, orderedSecurities, holdingUnits, priceRound, unitRound, tickRound, gridRound, unitGrid, } from "./types.js";
2
+ export type { Person, Account, Allotment, Assets, ManagerOtpBundle, Token, Security, Holding, Market, Marketplace, Session, Order, ClientConnection, TickGrid, Version, ConflictFailure, } from "./types.js";
3
+ export { OrderSide, OrderType, toSide, toOrderType, SESSION_STATE_INIT, SESSION_STATE_OPEN, SESSION_STATE_PAUSED, SESSION_STATE_CLOSED, getSecurity, isApproved, orderedSecurities, holdingUnits, priceRound, unitRound, tickRound, gridRound, unitGrid, displayName, } from "./types.js";
4
4
  export { Flexemarkets, FlexemarketsError, AuthenticationError, AuthorizationError, InvalidArgumentError, ConnectionFailedError, ConfigurationError, ConflictError, HttpError, ApiError, AccountNameConflictError, PersonHasMarketplaceDataError, } from "./client.js";
5
5
  export { toInstant } from "./timestamps.js";
6
- export { isCancel, isLimit, isBuy, isSell, contra, isAvailable, isConsumed, isSplit, isSymbol, isSubmit, isResting, findOrder, } from "./order-utils.js";
7
- export { OrderBook, OrderBooks } from "./orderbook.js";
8
- export { Trades, MarketplaceTrades } from "./trades.js";
9
- export type { StompFrame, StreamDropped, Reconnected, FrameUnreadable, FmEvent, EventCallback, } from "./stomp.js";
10
- export type { MarketView, Subscription, GapEvent, ReconnectEvent } from "./market-view.js";
6
+ export { contra, findOrder, isAvailable, isConsumed, isConsumedOrSplit, isResting, isSplit, isSubmit, isSupplier, isSymbol, limit, } from "./order-utils.js";
7
+ export { Book } from "./orderbook.js";
8
+ export { Tape, tradeOf } from "./trades.js";
9
+ export type { Trade } from "./trades.js";
10
+ export type { StompFrame, StreamDropped, StreamReconnected, FrameUnreadable, FmEvent, EventCallback, } from "./stomp.js";
11
+ export type { Desk, Subscription, GapEvent, DeskRecovery } from "./desk.js";
11
12
  export type { Snapshot } from "./snapshot.js";
12
13
  export { NO_SEQ } from "./stomp.js";
13
14
  export type { OrdersUpdate } from "./stomp.js";
package/dist/index.js CHANGED
@@ -1,13 +1,22 @@
1
1
  /** Flexemarkets TypeScript SDK. */
2
- export { Side, OrderType, toSide, toOrderType, SESSION_STATE_INIT, SESSION_STATE_OPEN, SESSION_STATE_PAUSED, SESSION_STATE_CLOSED, getSecurity, isApproved, orderedSecurities, holdingUnits, priceRound, unitRound, tickRound, gridRound, unitGrid, } from "./types.js";
2
+ export { OrderSide, OrderType, toSide, toOrderType, SESSION_STATE_INIT, SESSION_STATE_OPEN, SESSION_STATE_PAUSED, SESSION_STATE_CLOSED, getSecurity, isApproved, orderedSecurities, holdingUnits, priceRound, unitRound, tickRound, gridRound, unitGrid, displayName, } from "./types.js";
3
3
  // Client
4
4
  export { Flexemarkets, FlexemarketsError, AuthenticationError, AuthorizationError, InvalidArgumentError, ConnectionFailedError, ConfigurationError, ConflictError, HttpError, ApiError, AccountNameConflictError, PersonHasMarketplaceDataError, } from "./client.js";
5
5
  export { toInstant } from "./timestamps.js";
6
- // Order utils
7
- export { isCancel, isLimit, isBuy, isSell, contra, isAvailable, isConsumed, isSplit, isSymbol, isSubmit, isResting, findOrder, } from "./order-utils.js";
6
+ // Order utils -- what can only be worked out from a set of orders together.
7
+ //
8
+ // isBuy, isSell, isCancel and isLimit are deliberately not here. They became
9
+ // one-line comparisons the moment side and type became enums: OrderSide.BUY ===
10
+ // order.side says the same thing as isBuy(order), reads the same way, and is
11
+ // one fewer name to know. Java deleted them outright; they survive here only
12
+ // because this SDK's own code uses them, where Java's did not.
13
+ //
14
+ // contra stays: OrderSide is a string union in TypeScript, so unlike Java and
15
+ // Python it cannot carry the method that replaced this.
16
+ export { contra, findOrder, isAvailable, isConsumed, isConsumedOrSplit, isResting, isSplit, isSubmit, isSupplier, isSymbol, limit, } from "./order-utils.js";
8
17
  // Order book
9
- export { OrderBook, OrderBooks } from "./orderbook.js";
10
- // Trades
11
- export { Trades, MarketplaceTrades } from "./trades.js";
18
+ export { Book } from "./orderbook.js";
19
+ // Tape
20
+ export { Tape, tradeOf } from "./trades.js";
12
21
  export { NO_SEQ } from "./stomp.js";
13
22
  //# sourceMappingURL=index.js.map