@flexemarkets/fm-sdk 0.1.4 → 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,18 +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";
14
- import { type Trade, type Trades } from "./trades.js";
13
+ import { Book } from "./orderbook.js";
14
+ import { type Trade, type Tape } from "./trades.js";
15
15
  import type { Holding, Market, Order, Session } from "./types.js";
16
16
  /**
17
- * Handle returned by `MarketView.on*` listener registrations. Call
17
+ * Handle returned by `Desk.on*` listener registrations. Call
18
18
  * to unregister. Idempotent — multiple calls are no-ops.
19
19
  */
20
20
  export type Subscription = () => void;
21
21
  /**
22
- * Fires when MarketView detects a sequence-gap in the ORDERS-UPDATE
22
+ * Fires when Desk detects a sequence-gap in the ORDERS-UPDATE
23
23
  * WS stream — one or more frames were dropped between client and
24
- * fm-server. After a gap, MarketView re-runs the REST snapshot
24
+ * fm-server. After a gap, Desk re-runs the REST snapshot
25
25
  * recovery flow before applying further deltas; the gap event is the
26
26
  * signal callers can wire into their own observability stack instead
27
27
  * of relying on the SDK's default console.warn.
@@ -32,36 +32,46 @@ export interface GapEvent {
32
32
  readonly receivedSeq: number;
33
33
  }
34
34
  /**
35
- * Fires when MarketView reacts to a StreamDropped — either after
35
+ * Fires when Desk reacts to a StreamDropped — either after
36
36
  * the reconnect + resnapshot completes successfully, or after the
37
- * attempt has failed and the view is left stale.
37
+ * attempt has failed and the desk is left stale.
38
38
  */
39
- export interface ReconnectEvent {
39
+ export interface DeskRecovery {
40
40
  readonly marketplaceId: number;
41
41
  readonly success: boolean;
42
42
  readonly reason: string | null;
43
43
  }
44
- export interface MarketView {
45
- /** The marketplace this view tracks. */
44
+ export interface Desk {
45
+ /** The marketplace this desk tracks. */
46
46
  readonly marketplaceId: number;
47
- /** Markets in this marketplace, captured at observe-time. */
47
+ /** Markets in this marketplace, captured when the desk was opened. */
48
48
  readonly markets: Market[];
49
49
  /**
50
50
  * Always-current order book for `marketId`. Reads are atomic; a
51
51
  * caller never sees a half-applied delta. Returns null if
52
52
  * `marketId` isn't in this marketplace.
53
53
  */
54
- orderBook(marketId: number): OrderBook | null;
54
+ book(marketId: number): Book | null;
55
55
  /**
56
56
  * Always-current trade tape for `marketId`, most recent last. Returns null
57
57
  * if `marketId` isn't in this marketplace.
58
58
  *
59
- * Maintained alongside {@link orderBook}: seeded from the server's recent
60
- * trades when the view opens, then kept current from the same delta stream.
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
61
  * Each `Trade` on it carries both sides of its match — the resting
62
62
  * order that was taken and the aggressor that took it.
63
63
  */
64
- trades(marketId: number): Trades | null;
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[];
65
75
  /**
66
76
  * Most-recent session update observed. Null until the first
67
77
  * SESSION-UPDATE frame lands.
@@ -78,30 +88,30 @@ export interface MarketView {
78
88
  * Register a handler that fires when the order book for
79
89
  * `marketId` changes. The handler receives the post-update book.
80
90
  */
81
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
91
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
82
92
  /**
83
93
  * Register a handler that fires for each trade on `marketId`.
84
94
  *
85
- * The missing member of the family {@link onOrderBookChange} and
95
+ * The missing member of the family {@link onBookChange} and
86
96
  * {@link onSessionChange} belong to. Without it, "tell me when a trade
87
97
  * happens" is asked as "tell me when the book changed, then let me look" —
88
98
  * which answers a different question, since a book changes on every resting
89
99
  * order and most changes are not trades.
90
100
  *
91
101
  * Fires **once per trade**, oldest first, rather than coalescing a batch the
92
- * way {@link onOrderBookChange} does. A trade is a discrete event with its own
102
+ * way {@link onBookChange} does. A trade is a discrete event with its own
93
103
  * price and counterparties; collapsing two into one callback would lose one.
94
104
  *
95
105
  * Live deltas only. A gap or a reconnect re-seeds the tape from the server's
96
106
  * snapshot, and those trades do not fire here — they are not new, they are
97
- * what was missed. {@link onGap} and {@link onReconnect} are how a caller
107
+ * what was missed. {@link onGap} and {@link onRecovery} are how a caller
98
108
  * learns that happened.
99
109
  */
100
110
  onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
101
111
  /** Register a handler for the caller's holding changes. */
102
112
  onHoldingChange(handler: (h: Holding) => void): Subscription;
103
113
  /**
104
- * Register a handler that fires when MarketView detects a gap in
114
+ * Register a handler that fires when Desk detects a gap in
105
115
  * the ORDERS-UPDATE seq stream. Use this to wire your own
106
116
  * telemetry — by default the SDK logs to console.warn but
107
117
  * otherwise hides the recovery flow.
@@ -110,10 +120,10 @@ export interface MarketView {
110
120
  /**
111
121
  * Register a handler that fires after the SDK reacts to a
112
122
  * transport error — either when reconnect + resnapshot have
113
- * 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
114
124
  * stale.
115
125
  */
116
- onReconnect(handler: (event: ReconnectEvent) => void): Subscription;
126
+ onRecovery(handler: (event: DeskRecovery) => void): Subscription;
117
127
  /** Submit a limit order on this marketplace. */
118
128
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
119
129
  /** Cancel a previously-submitted order. */
@@ -125,11 +135,11 @@ export interface MarketView {
125
135
  */
126
136
  close(): void;
127
137
  }
128
- export declare class DefaultMarketView implements MarketView {
138
+ export declare class DefaultDesk implements Desk {
129
139
  readonly marketplaceId: number;
130
140
  readonly markets: Market[];
131
141
  private readonly _flexemarkets;
132
- private readonly _orderBooks;
142
+ private readonly _books;
133
143
  private readonly _trades;
134
144
  private _events;
135
145
  private _session;
@@ -142,14 +152,14 @@ export declare class DefaultMarketView implements MarketView {
142
152
  private readonly _reconnectHandlers;
143
153
  private _closed;
144
154
  /**
145
- * Highest ORDERS-UPDATE seq this view has applied so far. Deltas
155
+ * Highest ORDERS-UPDATE seq this desk has applied so far. Deltas
146
156
  * with `seq <= _lastAppliedSeq` are skipped — they've already been
147
157
  * folded into the local state via the initial REST snapshot or a
148
158
  * previously-applied delta. Initial value comes from the snapshot's
149
159
  * `asOfSeq`; `NO_SEQ` disables filtering (older fm-server).
150
160
  */
151
161
  private _lastAppliedSeq;
152
- static open(flexemarkets: Flexemarkets, marketplaceId: number): Promise<DefaultMarketView>;
162
+ static open(flexemarkets: Flexemarkets, marketplaceId: number): Promise<DefaultDesk>;
153
163
  private _seedComplete;
154
164
  private _seedBuffer;
155
165
  private constructor();
@@ -167,16 +177,18 @@ export declare class DefaultMarketView implements MarketView {
167
177
  * Phase 2b (gap recovery + ID-based dedup) closes the window.
168
178
  */
169
179
  private _seedFromSnapshot;
170
- orderBook(marketId: number): OrderBook | null;
171
- trades(marketId: number): Trades | null;
180
+ book(marketId: number): Book | null;
181
+ tape(marketId: number): Tape | null;
182
+ books(): Book[];
183
+ tapes(): Tape[];
172
184
  session(): Session | null;
173
185
  holding(): Holding | null;
174
186
  onSessionChange(handler: (s: Session) => void): Subscription;
175
187
  onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
176
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
188
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
177
189
  onHoldingChange(handler: (h: Holding) => void): Subscription;
178
190
  onGap(handler: (e: GapEvent) => void): Subscription;
179
- onReconnect(handler: (e: ReconnectEvent) => void): Subscription;
191
+ onRecovery(handler: (e: DeskRecovery) => void): Subscription;
180
192
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
181
193
  submitCancel(marketId: number, originalId: number): Promise<Order>;
182
194
  close(): void;
@@ -185,21 +197,21 @@ export declare class DefaultMarketView implements MarketView {
185
197
  /**
186
198
  * Re-seed once the transport is back.
187
199
  *
188
- * Reconnecting is not this layer's job -- a `Reconnected` only arrives
200
+ * Reconnecting is not this layer's job -- a `StreamReconnected` only arrives
189
201
  * because the listener already restored the subscription. Reseeding is: a
190
202
  * reconnect is the largest possible sequence gap, so _seedFromSnapshot()
191
203
  * (clear + REST snapshot + reapply + seq watermark) is what converges the
192
- * state, exactly as it does for a small one. If it fails the view is left
193
- * 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.
194
206
  */
195
207
  private _reseedAfterReconnect;
196
208
  private _applyOrdersUpdate;
197
209
  private _ensureOpen;
198
210
  }
199
211
  /**
200
- * Reader-side handle on a refcounted DefaultMarketView. Returned by
201
- * Flexemarkets.observe(); multiple handles for the same marketplaceId
202
- * 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.
203
215
  * Each handle's close() decrements the shared refcount and tears down
204
216
  * the shared resources on the last close.
205
217
  *
@@ -207,24 +219,26 @@ export declare class DefaultMarketView implements MarketView {
207
219
  * locally and closed when the handle closes — so a handler doesn't
208
220
  * keep firing into stale state after the handle is gone.
209
221
  */
210
- export declare class MarketViewHandle implements MarketView {
222
+ export declare class DeskHandle implements Desk {
211
223
  private readonly _shared;
212
224
  private readonly _onClose;
213
225
  private readonly _mySubscriptions;
214
226
  private _closed;
215
- constructor(shared: DefaultMarketView, onClose: () => void);
227
+ constructor(shared: DefaultDesk, onClose: () => void);
216
228
  get marketplaceId(): number;
217
229
  get markets(): Market[];
218
- orderBook(marketId: number): OrderBook | null;
219
- trades(marketId: number): Trades | null;
230
+ book(marketId: number): Book | null;
231
+ tape(marketId: number): Tape | null;
232
+ books(): Book[];
233
+ tapes(): Tape[];
220
234
  session(): Session | null;
221
235
  holding(): Holding | null;
222
236
  onSessionChange(handler: (s: Session) => void): Subscription;
223
- onOrderBookChange(marketId: number, handler: (b: OrderBook) => void): Subscription;
237
+ onBookChange(marketId: number, handler: (b: Book) => void): Subscription;
224
238
  onTrade(marketId: number, handler: (t: Trade) => void): Subscription;
225
239
  onHoldingChange(handler: (h: Holding) => void): Subscription;
226
240
  onGap(handler: (e: GapEvent) => void): Subscription;
227
- onReconnect(handler: (e: ReconnectEvent) => void): Subscription;
241
+ onRecovery(handler: (e: DeskRecovery) => void): Subscription;
228
242
  submitLimit(marketId: number, side: string, units: number, price: number): Promise<Order>;
229
243
  submitCancel(marketId: number, originalId: number): Promise<Order>;
230
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;
@@ -29,7 +29,7 @@ export class DefaultMarketView {
29
29
  _reconnectHandlers = [];
30
30
  _closed = false;
31
31
  /**
32
- * Highest ORDERS-UPDATE seq this view has applied so far. Deltas
32
+ * Highest ORDERS-UPDATE seq this desk has applied so far. Deltas
33
33
  * with `seq <= _lastAppliedSeq` are skipped — they've already been
34
34
  * folded into the local state via the initial REST snapshot or a
35
35
  * previously-applied delta. Initial value comes from the snapshot's
@@ -38,7 +38,7 @@ export class DefaultMarketView {
38
38
  _lastAppliedSeq = NO_SEQ;
39
39
  static async open(flexemarkets, marketplaceId) {
40
40
  const markets = await flexemarkets.markets(marketplaceId);
41
- const view = new DefaultMarketView(flexemarkets, marketplaceId, markets);
41
+ const desk = new DefaultDesk(flexemarkets, marketplaceId, markets);
42
42
  // Subscribe WS first (so deltas start buffering on the callback
43
43
  // path), then fetch + apply the snapshot, only THEN allow live
44
44
  // dispatch. _seedFromSnapshot flips _seedComplete=true atomically
@@ -46,22 +46,22 @@ export class DefaultMarketView {
46
46
  //
47
47
  // Phase 2d: own the EventListener directly rather than calling
48
48
  // flexemarkets.listen() — that would clobber the singleton
49
- // _eventListener and prevent multiple shared views from
49
+ // _eventListener and prevent multiple shared desks from
50
50
  // coexisting in one Flexemarkets.
51
- view._events = await flexemarkets._connectEvents(marketplaceId, (event) => view._dispatch(event));
52
- await view._seedFromSnapshot();
53
- return view;
51
+ desk._events = await flexemarkets._connectEvents(marketplaceId, (event) => desk._dispatch(event));
52
+ await desk._seedFromSnapshot();
53
+ return desk;
54
54
  }
55
55
  _seedComplete = false;
56
56
  _seedBuffer = [];
57
- // 100 matches the default per-market Trades capacity. Plumb through to
58
- // 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.
59
59
  constructor(flexemarkets, marketplaceId, markets) {
60
60
  this._flexemarkets = flexemarkets;
61
61
  this.marketplaceId = marketplaceId;
62
62
  this.markets = markets;
63
- this._orderBooks = new OrderBooks(markets);
64
- this._trades = new MarketplaceTrades(markets, 100);
63
+ this._books = new BookIndex(markets);
64
+ this._trades = new TapeIndex(markets, 100);
65
65
  }
66
66
  /**
67
67
  * Phase 2a snapshot seeding. Fetches the V1 active-orders and
@@ -82,10 +82,10 @@ export class DefaultMarketView {
82
82
  // Clear before reseeding so a resync (Phase 2b) doesn't double-add
83
83
  // against existing price levels. Initial seed hits empty books so
84
84
  // clear() is a no-op there.
85
- this._orderBooks.clear();
85
+ this._books.clear();
86
86
  this._trades.clear();
87
87
  if (orders.body.length > 0)
88
- this._orderBooks.update(orders.body);
88
+ this._books.update(orders.body);
89
89
  if (trades.body.length > 0)
90
90
  this._trades.update(trades.body);
91
91
  this._lastAppliedSeq = orders.asOfSeq;
@@ -100,14 +100,22 @@ export class DefaultMarketView {
100
100
  for (const update of buffered)
101
101
  this._applyOrdersUpdate(update);
102
102
  }
103
- orderBook(marketId) {
103
+ book(marketId) {
104
104
  this._ensureOpen();
105
- return this._orderBooks.get(marketId) ?? null;
105
+ return this._books.get(marketId) ?? null;
106
106
  }
107
- trades(marketId) {
107
+ tape(marketId) {
108
108
  this._ensureOpen();
109
109
  return this._trades.get(marketId);
110
110
  }
111
+ books() {
112
+ this._ensureOpen();
113
+ return [...this._books.collection()];
114
+ }
115
+ tapes() {
116
+ this._ensureOpen();
117
+ return [...this._trades.collection()];
118
+ }
111
119
  session() {
112
120
  this._ensureOpen();
113
121
  return this._session;
@@ -135,7 +143,7 @@ export class DefaultMarketView {
135
143
  this._tradeHandlers.splice(i, 1);
136
144
  };
137
145
  }
138
- onOrderBookChange(marketId, handler) {
146
+ onBookChange(marketId, handler) {
139
147
  this._ensureOpen();
140
148
  const entry = { marketId, handler };
141
149
  this._bookHandlers.push(entry);
@@ -163,7 +171,7 @@ export class DefaultMarketView {
163
171
  this._gapHandlers.splice(i, 1);
164
172
  };
165
173
  }
166
- onReconnect(handler) {
174
+ onRecovery(handler) {
167
175
  this._ensureOpen();
168
176
  this._reconnectHandlers.push(handler);
169
177
  return () => {
@@ -192,7 +200,7 @@ export class DefaultMarketView {
192
200
  this._events = null;
193
201
  }
194
202
  // Flexemarkets is owned by the caller; we don't close it. If
195
- // observe() was the only consumer, the caller can close
203
+ // desk() was the only consumer, the caller can close
196
204
  // Flexemarkets themselves.
197
205
  }
198
206
  _resyncInFlight = false;
@@ -214,7 +222,7 @@ export class DefaultMarketView {
214
222
  this._lastAppliedSeq !== NO_SEQ &&
215
223
  event.seq > this._lastAppliedSeq + 1) {
216
224
  const expectedSeq = this._lastAppliedSeq + 1;
217
- console.warn(`[MarketView] ORDERS-UPDATE seq gap on marketplace ${this.marketplaceId} ` +
225
+ console.warn(`[Desk] ORDERS-UPDATE seq gap on marketplace ${this.marketplaceId} ` +
218
226
  `— expected ${expectedSeq}, got ${event.seq}; resyncing from snapshot`);
219
227
  const gap = {
220
228
  marketplaceId: this.marketplaceId,
@@ -252,7 +260,7 @@ export class DefaultMarketView {
252
260
  }
253
261
  if (_isStreamDropped(event)) {
254
262
  // The subscription restores itself; nothing to do but say so.
255
- 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}`);
256
264
  return;
257
265
  }
258
266
  if (_isReconnected(event)) {
@@ -262,8 +270,8 @@ export class DefaultMarketView {
262
270
  if (_isFrameUnreadable(event)) {
263
271
  // STOMP ERROR / parse failure. Logged for visibility;
264
272
  // reconnecting won't help with a malformed frame, so we leave
265
- // the view as-is.
266
- 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}`);
267
275
  return;
268
276
  }
269
277
  // VERSION, SESSION-LIST — not reflected in the public surface yet.
@@ -271,12 +279,12 @@ export class DefaultMarketView {
271
279
  /**
272
280
  * Re-seed once the transport is back.
273
281
  *
274
- * Reconnecting is not this layer's job -- a `Reconnected` only arrives
282
+ * Reconnecting is not this layer's job -- a `StreamReconnected` only arrives
275
283
  * because the listener already restored the subscription. Reseeding is: a
276
284
  * reconnect is the largest possible sequence gap, so _seedFromSnapshot()
277
285
  * (clear + REST snapshot + reapply + seq watermark) is what converges the
278
- * state, exactly as it does for a small one. If it fails the view is left
279
- * 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.
280
288
  */
281
289
  _reseedAfterReconnect() {
282
290
  if (this._resyncInFlight)
@@ -291,11 +299,11 @@ export class DefaultMarketView {
291
299
  }
292
300
  catch (err) {
293
301
  const reason = err instanceof Error ? err.message : String(err);
294
- 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}`);
295
303
  outcome = { marketplaceId: this.marketplaceId, success: false, reason };
296
304
  // Leave _resyncInFlight=true so subsequent dispatches keep
297
305
  // buffering rather than corrupting state; caller can close()
298
- // and observe() to recover.
306
+ // and desk() to recover.
299
307
  }
300
308
  for (const h of this._reconnectHandlers) {
301
309
  try {
@@ -316,9 +324,9 @@ export class DefaultMarketView {
316
324
  }
317
325
  const orders = update.orders;
318
326
  const touched = _marketIdsTouched(orders);
319
- this._orderBooks.update(orders);
327
+ this._books.update(orders);
320
328
  const traded = this._trades.update(orders);
321
- // Trades first: the more specific event, and a book handler that then reads
329
+ // Tape first: the more specific event, and a book handler that then reads
322
330
  // the tape sees the same trade the trade handler was just given. Both
323
331
  // aggregators are already current either way — what is ordered here is only
324
332
  // which handler hears about it first.
@@ -330,7 +338,7 @@ export class DefaultMarketView {
330
338
  }
331
339
  }
332
340
  for (const marketId of touched) {
333
- const book = this._orderBooks.get(marketId);
341
+ const book = this._books.get(marketId);
334
342
  if (!book)
335
343
  continue;
336
344
  for (const h of this._bookHandlers) {
@@ -343,7 +351,7 @@ export class DefaultMarketView {
343
351
  }
344
352
  _ensureOpen() {
345
353
  if (this._closed) {
346
- throw new Error(`MarketView for marketplace ${this.marketplaceId} is closed`);
354
+ throw new Error(`Desk for marketplace ${this.marketplaceId} is closed`);
347
355
  }
348
356
  }
349
357
  }
@@ -372,9 +380,9 @@ function _isFrameUnreadable(event) {
372
380
  return typeof event === "object" && event !== null && event.kind === "frame-unreadable";
373
381
  }
374
382
  /**
375
- * Reader-side handle on a refcounted DefaultMarketView. Returned by
376
- * Flexemarkets.observe(); multiple handles for the same marketplaceId
377
- * 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.
378
386
  * Each handle's close() decrements the shared refcount and tears down
379
387
  * the shared resources on the last close.
380
388
  *
@@ -382,7 +390,7 @@ function _isFrameUnreadable(event) {
382
390
  * locally and closed when the handle closes — so a handler doesn't
383
391
  * keep firing into stale state after the handle is gone.
384
392
  */
385
- export class MarketViewHandle {
393
+ export class DeskHandle {
386
394
  _shared;
387
395
  _onClose;
388
396
  _mySubscriptions = [];
@@ -398,13 +406,21 @@ export class MarketViewHandle {
398
406
  this._check();
399
407
  return this._shared.markets;
400
408
  }
401
- 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() {
402
418
  this._check();
403
- return this._shared.orderBook(marketId);
419
+ return this._shared.books();
404
420
  }
405
- trades(marketId) {
421
+ tapes() {
406
422
  this._check();
407
- return this._shared.trades(marketId);
423
+ return this._shared.tapes();
408
424
  }
409
425
  session() {
410
426
  this._check();
@@ -420,9 +436,9 @@ export class MarketViewHandle {
420
436
  this._mySubscriptions.push(sub);
421
437
  return sub;
422
438
  }
423
- onOrderBookChange(marketId, handler) {
439
+ onBookChange(marketId, handler) {
424
440
  this._check();
425
- const sub = this._shared.onOrderBookChange(marketId, handler);
441
+ const sub = this._shared.onBookChange(marketId, handler);
426
442
  this._mySubscriptions.push(sub);
427
443
  return sub;
428
444
  }
@@ -444,9 +460,9 @@ export class MarketViewHandle {
444
460
  this._mySubscriptions.push(sub);
445
461
  return sub;
446
462
  }
447
- onReconnect(handler) {
463
+ onRecovery(handler) {
448
464
  this._check();
449
- const sub = this._shared.onReconnect(handler);
465
+ const sub = this._shared.onRecovery(handler);
450
466
  this._mySubscriptions.push(sub);
451
467
  return sub;
452
468
  }
@@ -476,8 +492,8 @@ export class MarketViewHandle {
476
492
  }
477
493
  _check() {
478
494
  if (this._closed) {
479
- 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`);
480
496
  }
481
497
  }
482
498
  }
483
- //# 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,14 +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, displayName, } 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, tradeOf } from "./trades.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
9
  export type { Trade } from "./trades.js";
10
- export type { StompFrame, StreamDropped, Reconnected, FrameUnreadable, FmEvent, EventCallback, } from "./stomp.js";
11
- export type { MarketView, Subscription, GapEvent, ReconnectEvent } from "./market-view.js";
10
+ export type { StompFrame, StreamDropped, StreamReconnected, FrameUnreadable, FmEvent, EventCallback, } from "./stomp.js";
11
+ export type { Desk, Subscription, GapEvent, DeskRecovery } from "./desk.js";
12
12
  export type { Snapshot } from "./snapshot.js";
13
13
  export { NO_SEQ } from "./stomp.js";
14
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, displayName, } 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, tradeOf } 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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAmBnC,OAAO,EACL,IAAI,EACJ,SAAS,EACT,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,QAAQ,EACR,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,cAAc;AACd,OAAO,EACL,QAAQ,EACR,OAAO,EACP,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,GACV,MAAM,kBAAkB,CAAC;AAE1B,aAAa;AACb,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,SAAS;AACT,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgBjE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAsBnC,OAAO,EACL,SAAS,EACT,SAAS,EACT,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,SAAS,EACT,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,SAAS;AACT,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,QAAQ,EACR,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,+DAA+D;AAC/D,EAAE;AACF,8EAA8E;AAC9E,wDAAwD;AACxD,OAAO,EACL,MAAM,EACN,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,KAAK,GACN,MAAM,kBAAkB,CAAC;AAE1B,aAAa;AACb,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,OAAO;AACP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgB5C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC"}