@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/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,GACT,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,MAAM,aAAa,CAAC;AAexD,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"}
@@ -3,12 +3,12 @@
3
3
  *
4
4
  * Port of fm.order_utils (Python) / fm.OrderUtils (Java).
5
5
  */
6
- import { Order, type Side } from "./types.js";
6
+ import { Order, type Market, type OrderSide } from "./types.js";
7
7
  export declare function isCancel(order: Order): boolean;
8
8
  export declare function isLimit(order: Order): boolean;
9
9
  export declare function isBuy(side: string | null | undefined): boolean;
10
10
  export declare function isSell(side: string | null | undefined): boolean;
11
- export declare function contra(side: string): Side;
11
+ export declare function contra(side: string): OrderSide;
12
12
  /** Order is resting on the book (consumer is null). */
13
13
  export declare function isAvailable(order: Order): boolean;
14
14
  /** Order has been matched with another order. */
@@ -20,3 +20,28 @@ export declare function isSubmit(order: Order): boolean;
20
20
  export declare function findOrder(orders: Order[], orderId: number | null | undefined): Order | null;
21
21
  /** Determine if an order is currently resting on the book. */
22
22
  export declare function isResting(orders: Order[], order: Order): boolean;
23
+ /**
24
+ * True once an order has a consumer: traded against, whole or in part.
25
+ *
26
+ * The positive complement of {@link isAvailable}, named for what a position
27
+ * keeps rather than for the mechanism. A split leaves a remainder order behind,
28
+ * so from the position's point of view the original is finished either way --
29
+ * which is why this is one predicate rather than `isConsumed(o) || isSplit(o)`
30
+ * spelled out at every call site.
31
+ */
32
+ export declare function isConsumedOrSplit(order: Order | null): boolean;
33
+ /**
34
+ * True if `rhs` was supplied by `lhs` -- the two sides of one trade.
35
+ *
36
+ * The kind of question this module exists for: it cannot be answered by either
37
+ * order alone, only by the reference between them.
38
+ */
39
+ export declare function isSupplier(lhs: Order | null, rhs: Order | null): boolean;
40
+ /**
41
+ * A limit order ready to submit.
42
+ *
43
+ * {@link Order} has seventeen fields because it is what the server returns; a
44
+ * caller building one to send sets four and leaves the rest to the exchange.
45
+ * Naming those at the call site beats an object literal of mostly nulls.
46
+ */
47
+ export declare function limit(market: Market, side: OrderSide, units: number, price: number): Order;
@@ -3,14 +3,14 @@
3
3
  *
4
4
  * Port of fm.order_utils (Python) / fm.OrderUtils (Java).
5
5
  */
6
- import { toOrderType, toSide } from "./types.js";
6
+ import { OrderType, toOrderType, toSide } from "./types.js";
7
7
  export function isCancel(order) {
8
8
  return toOrderType(order.type) === "CANCEL";
9
9
  }
10
10
  export function isLimit(order) {
11
11
  return toOrderType(order.type) === "LIMIT";
12
12
  }
13
- // These take `string` rather than `Side` on purpose: they are the lenient
13
+ // These take `string` rather than `OrderSide` on purpose: they are the lenient
14
14
  // door. A caller holding a value off the wire, or out of a config file, can
15
15
  // ask without narrowing it first -- which is what the old toUpperCase()
16
16
  // comparison allowed and what removing it would quietly take away.
@@ -132,4 +132,53 @@ export function isResting(orders, order) {
132
132
  // split order with child younger than its consumer is resting
133
133
  return isSupplierOlder(orders, firstChild(orders, order));
134
134
  }
135
+ /**
136
+ * True once an order has a consumer: traded against, whole or in part.
137
+ *
138
+ * The positive complement of {@link isAvailable}, named for what a position
139
+ * keeps rather than for the mechanism. A split leaves a remainder order behind,
140
+ * so from the position's point of view the original is finished either way --
141
+ * which is why this is one predicate rather than `isConsumed(o) || isSplit(o)`
142
+ * spelled out at every call site.
143
+ */
144
+ export function isConsumedOrSplit(order) {
145
+ return order != null && order.consumer != null;
146
+ }
147
+ /**
148
+ * True if `rhs` was supplied by `lhs` -- the two sides of one trade.
149
+ *
150
+ * The kind of question this module exists for: it cannot be answered by either
151
+ * order alone, only by the reference between them.
152
+ */
153
+ export function isSupplier(lhs, rhs) {
154
+ return lhs != null && rhs != null && lhs.id === rhs.supplier;
155
+ }
156
+ /**
157
+ * A limit order ready to submit.
158
+ *
159
+ * {@link Order} has seventeen fields because it is what the server returns; a
160
+ * caller building one to send sets four and leaves the rest to the exchange.
161
+ * Naming those at the call site beats an object literal of mostly nulls.
162
+ */
163
+ export function limit(market, side, units, price) {
164
+ return {
165
+ id: 0,
166
+ original: 0,
167
+ supplier: 0,
168
+ consumer: null,
169
+ type: OrderType.LIMIT,
170
+ side,
171
+ units,
172
+ price,
173
+ ownerId: null,
174
+ marketplaceId: market.marketplaceId,
175
+ sessionId: 0,
176
+ symbol: market.symbol,
177
+ marketId: market.id,
178
+ ownerTarget: null,
179
+ clientDescription: null,
180
+ createdDate: null,
181
+ lastModifiedDate: null,
182
+ };
183
+ }
135
184
  //# sourceMappingURL=order-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"order-utils.js","sourceRoot":"","sources":["../src/order-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"order-utils.js","sourceRoot":"","sources":["../src/order-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAS,SAAS,EAAE,WAAW,EAAE,MAAM,EAA+B,MAAM,YAAY,CAAC;AAEhG,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC;AAC7C,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,wEAAwE;AACxE,mEAAmE;AACnE,MAAM,UAAU,KAAK,CAAC,IAA+B;IACnD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAA+B;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AACtC,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC;AACjE,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU,CAAC,KAAY;IACrC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAqB,EAAE,KAAY;IAC1D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAY;IACnC,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,OAAkC;IAC3E,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,MAAe,EAAE,KAAY;IAChD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAe,EAAE,OAAe;IAClD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,EAAE,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,MAAe,EAAE,KAAY;IAC7C,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,MAAe,EAAE,KAAY;IAC/C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAY,EAAE,QAAe;IACrD,OAAO,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,MAAe,EAAE,EAAgB,EAAE,EAAgB;IAClE,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE9B,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAE7C,IAAI,CAAC,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IAEhC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;IAE/E,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,UAAU,KAAK,IAAI,CAAC;IAC7B,CAAC;IACD,OAAO,gBAAgB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,MAAe,EAAE,KAAmB;IAC3D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEjC,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEnD,MAAM,kBAAkB,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAE/D,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAC1D,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,KAAY;IACrD,6BAA6B;IAC7B,IAAI,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,8BAA8B;IAC9B,IAAI,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAElC,mCAAmC;IACnC,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,kDAAkD;IAClD,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAErD,8CAA8C;IAC9C,IAAI,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;QAAE,OAAO,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAEnE,8DAA8D;IAC9D,OAAO,eAAe,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB;IACnD,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAiB,EAAE,GAAiB;IAC7D,OAAO,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,QAAQ,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CACnB,MAAc,EACd,IAAe,EACf,KAAa,EACb,KAAa;IAEb,OAAO;QACL,EAAE,EAAE,CAAC;QACL,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,CAAC;QACX,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,SAAS,CAAC,KAAK;QACrB,IAAI;QACJ,KAAK;QACL,KAAK;QACL,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,WAAW,EAAE,IAAI;QACjB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Order book maintained from WebSocket order events.
3
3
  *
4
- * Port of fm.orderbook (Python) / fm.OrderBook (Java).
4
+ * Port of fm.orderbook (Python) / fm.Book (Java).
5
5
  */
6
6
  import type { Market, Order } from "./types.js";
7
7
  /**
@@ -10,7 +10,7 @@ import type { Market, Order } from "./types.js";
10
10
  * Updated incrementally from WebSocket ORDERS-UPDATE events.
11
11
  * Buys are sorted highest-first (best bid), sells lowest-first (best ask).
12
12
  */
13
- export declare class OrderBook {
13
+ export declare class Book {
14
14
  readonly market: Market;
15
15
  private readonly _buys;
16
16
  private readonly _sells;
@@ -21,6 +21,15 @@ export declare class OrderBook {
21
21
  update(orders: Order[]): void;
22
22
  private _add;
23
23
  private _remove;
24
+ /**
25
+ * The book a side belongs to, refusing anything that does not name one.
26
+ *
27
+ * This used to be `isBuy(side) ? this._buys : this._sells`, which is the
28
+ * complement of buy rather than a test for sell, so a null side fell to the
29
+ * offer book. A null side is a real value on the wire -- a cancel carries
30
+ * none -- so that guess was reachable, and a book kept on a guess is wrong
31
+ * silently: units come off a side the order was never on.
32
+ */
24
33
  private _priceLevels;
25
34
  hasValue(side: string): boolean;
26
35
  bestPrice(side: string): number;
@@ -35,23 +44,23 @@ export declare class OrderBook {
35
44
  sellLevels(): [number, number][];
36
45
  /**
37
46
  * Reset to just-constructed state — empty levels, initialized=false.
38
- * Used by MarketView's Phase 2b gap-recovery: refetch the snapshot,
47
+ * Used by Desk's Phase 2b gap-recovery: refetch the snapshot,
39
48
  * clear(), reapply via update(), so the next delta with
40
49
  * isAvailable=false doesn't underflow against stale levels.
41
50
  */
42
51
  clear(): void;
43
52
  }
44
53
  /**
45
- * Container of OrderBook instances, one per market.
54
+ * Container of Book instances, one per market.
46
55
  */
47
- export declare class OrderBooks {
56
+ export declare class BookIndex {
48
57
  private readonly _books;
49
58
  constructor(markets: Market[]);
50
59
  update(orders: Order[]): void;
51
60
  hasValue(marketId: number, side: string): boolean;
52
61
  bestPrice(marketId: number, side: string): number;
53
- collection(): OrderBook[];
54
- get(marketId: number): OrderBook;
55
- /** Clear every contained book — see {@link OrderBook.clear}. */
62
+ collection(): Book[];
63
+ get(marketId: number): Book;
64
+ /** Clear every contained book — see {@link Book.clear}. */
56
65
  clear(): void;
57
66
  }
package/dist/orderbook.js CHANGED
@@ -1,16 +1,16 @@
1
1
  /**
2
2
  * Order book maintained from WebSocket order events.
3
3
  *
4
- * Port of fm.orderbook (Python) / fm.OrderBook (Java).
4
+ * Port of fm.orderbook (Python) / fm.Book (Java).
5
5
  */
6
- import { isAvailable, isBuy, isCancel, isResting, isSplit, isSymbol } from "./order-utils.js";
6
+ import { findOrder, isAvailable, isBuy, isSell, isCancel, isResting, isSplit, isSymbol, } from "./order-utils.js";
7
7
  /**
8
8
  * Aggregated price-level order book for a single market.
9
9
  *
10
10
  * Updated incrementally from WebSocket ORDERS-UPDATE events.
11
11
  * Buys are sorted highest-first (best bid), sells lowest-first (best ask).
12
12
  */
13
- export class OrderBook {
13
+ export class Book {
14
14
  market;
15
15
  _buys = new Map(); // price → units
16
16
  _sells = new Map(); // price → units
@@ -41,9 +41,22 @@ export class OrderBook {
41
41
  // During initialisation, disregard all non-available orders
42
42
  if (!this._initialized)
43
43
  continue;
44
- // Remove CANCEL orders
45
44
  if (isCancel(order)) {
46
- this._remove(side, price, units);
45
+ // fm-server broadcasts a cancel as two rows: the CANCEL, and the LIMIT it
46
+ // consumed, which carries the cancel as its consumer. The resting branch
47
+ // below removes that limit, because a cancelled limit was on the book and
48
+ // isResting says so. Removing here as well takes the units off twice.
49
+ //
50
+ // Both removals landing on a level that held only the cancelled order left
51
+ // it empty either way, which is why this survived: the one test that
52
+ // covered a cancel used a single one-unit order. Give the level units from
53
+ // a second order and the cancel takes that one down with it.
54
+ //
55
+ // So remove only when the order being cancelled is not in this batch --
56
+ // which keeps a lone CANCEL working, and stops the pair double-counting.
57
+ if (findOrder(orders, order.consumer) === null) {
58
+ this._remove(side, price, units);
59
+ }
47
60
  continue;
48
61
  }
49
62
  // Remove split orders from book
@@ -76,8 +89,21 @@ export class OrderBook {
76
89
  levels.set(price, updated);
77
90
  }
78
91
  }
92
+ /**
93
+ * The book a side belongs to, refusing anything that does not name one.
94
+ *
95
+ * This used to be `isBuy(side) ? this._buys : this._sells`, which is the
96
+ * complement of buy rather than a test for sell, so a null side fell to the
97
+ * offer book. A null side is a real value on the wire -- a cancel carries
98
+ * none -- so that guess was reachable, and a book kept on a guess is wrong
99
+ * silently: units come off a side the order was never on.
100
+ */
79
101
  _priceLevels(side) {
80
- return isBuy(side) ? this._buys : this._sells;
102
+ if (isBuy(side))
103
+ return this._buys;
104
+ if (isSell(side))
105
+ return this._sells;
106
+ throw new Error(`An order must name its side to be placed on a book; got: ${side}`);
81
107
  }
82
108
  // -- query -----------------------------------------------------------------
83
109
  hasValue(side) {
@@ -120,7 +146,7 @@ export class OrderBook {
120
146
  }
121
147
  /**
122
148
  * Reset to just-constructed state — empty levels, initialized=false.
123
- * Used by MarketView's Phase 2b gap-recovery: refetch the snapshot,
149
+ * Used by Desk's Phase 2b gap-recovery: refetch the snapshot,
124
150
  * clear(), reapply via update(), so the next delta with
125
151
  * isAvailable=false doesn't underflow against stale levels.
126
152
  */
@@ -131,13 +157,13 @@ export class OrderBook {
131
157
  }
132
158
  }
133
159
  /**
134
- * Container of OrderBook instances, one per market.
160
+ * Container of Book instances, one per market.
135
161
  */
136
- export class OrderBooks {
162
+ export class BookIndex {
137
163
  _books = new Map();
138
164
  constructor(markets) {
139
165
  for (const m of markets) {
140
- this._books.set(m.id, new OrderBook(m));
166
+ this._books.set(m.id, new Book(m));
141
167
  }
142
168
  }
143
169
  update(orders) {
@@ -157,7 +183,7 @@ export class OrderBooks {
157
183
  get(marketId) {
158
184
  return this._books.get(marketId);
159
185
  }
160
- /** Clear every contained book — see {@link OrderBook.clear}. */
186
+ /** Clear every contained book — see {@link Book.clear}. */
161
187
  clear() {
162
188
  for (const book of this._books.values())
163
189
  book.clear();
@@ -1 +1 @@
1
- {"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../src/orderbook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orderbook.js","sourceRoot":"","sources":["../src/orderbook.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,GAC9E,MAAM,kBAAkB,CAAC;AAG1B;;;;;GAKG;AACH,MAAM,OAAO,IAAI;IACN,MAAM,CAAS;IACP,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gBAAgB;IACnD,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gBAAgB;IAC7D,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAO,CAAC;IAC7B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACxB,CAAC;IAED,6EAA6E;IAE7E,MAAM,CAAC,MAAe;QACpB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;gBAAE,SAAS;YAE5C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAK,CAAC;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAE1B,6CAA6C;YAC7C,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9B,SAAS;YACX,CAAC;YAED,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAAC,YAAY;gBAAE,SAAS;YAEjC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,0EAA0E;gBAC1E,yEAAyE;gBACzE,0EAA0E;gBAC1E,sEAAsE;gBACtE,EAAE;gBACF,2EAA2E;gBAC3E,qEAAqE;gBACrE,2EAA2E;gBAC3E,6DAA6D;gBAC7D,EAAE;gBACF,wEAAwE;gBACxE,yEAAyE;gBACzE,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACnC,CAAC;gBACD,SAAS;YACX,CAAC;YAED,gCAAgC;YAChC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnB,YAAY,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,gDAAgD;YAChD,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC9C,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACjC,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IACtD,CAAC;IAEO,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,KAAa;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACjD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,YAAY,CAAC,IAAY;QAC/B,IAAI,KAAK,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACnC,IAAI,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,4DAA4D,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,6EAA6E;IAE7E,QAAQ,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAC3B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,0DAA0D;IAC1D,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,yDAAyD;IACzD,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;;;;OAKG;IACH,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,SAAS;IACH,MAAM,GAAG,IAAI,GAAG,EAAgB,CAAC;IAElD,YAAY,OAAiB;QAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAAe;QACpB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,QAAgB,EAAE,IAAY;QACrC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,IAAY;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;IACpC,CAAC;IAED,2DAA2D;IAC3D,KAAK;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACxD,CAAC;CACF"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * REST snapshot response bundle: parsed body + the `x-fm-as-of-seq`
3
3
  * header value the snapshot was read at. Returned by `Flexemarkets`
4
- * V1 snapshot methods so `MarketView` (and any other caller that
4
+ * V1 snapshot methods so `Desk` (and any other caller that
5
5
  * mixes REST snapshots with WS deltas) can reconcile the two
6
6
  * streams: apply deltas whose `seq` is greater than `asOfSeq` and
7
7
  * skip those whose seq is less than or equal.
package/dist/stomp.d.ts CHANGED
@@ -5,6 +5,17 @@
5
5
  * EventListener / Java StompListener behaviour.
6
6
  */
7
7
  import type { Holding, Order, Session, Version } from "./types.js";
8
+ /** What this client advertises in CONNECT, and must therefore keep to. */
9
+ export declare const ADVERTISED_HEARTBEAT_MS = 30000;
10
+ /**
11
+ * How often this client actually sends one. Under the 30s it advertises, so a
12
+ * late timer still lands inside the window it promised, and well under the 55s
13
+ * at which Heroku's router closes an idle connection and records an H15
14
+ * against the app. Named so the interval can be tested against the thing it
15
+ * exists to stay under.
16
+ */
17
+ export declare const HEARTBEAT_INTERVAL_MS = 25000;
18
+ export declare const HEROKU_IDLE_TIMEOUT_MS = 55000;
8
19
  export interface StompFrame {
9
20
  command: string;
10
21
  headers: Record<string, string>;
@@ -24,9 +35,9 @@ export interface StreamDropped {
24
35
  * happened while the socket was down was not delivered.
25
36
  *
26
37
  * Carries the marketplace because one client can hold several subscriptions,
27
- * and "we are back" does not say which view to reseed.
38
+ * and "we are back" does not say which desk to reseed.
28
39
  */
29
- export interface Reconnected {
40
+ export interface StreamReconnected {
30
41
  kind: "reconnected";
31
42
  marketplaceId: number;
32
43
  }
@@ -52,7 +63,7 @@ export interface OrdersUpdate {
52
63
  readonly orders: Order[];
53
64
  readonly seq: number;
54
65
  }
55
- export type FmEvent = Version | Session | Session[] | Holding | OrdersUpdate | StreamDropped | Reconnected | FrameUnreadable;
66
+ export type FmEvent = Version | Session | Session[] | Holding | OrdersUpdate | StreamDropped | StreamReconnected | FrameUnreadable;
56
67
  export type EventCallback = (event: FmEvent) => void;
57
68
  /** Sentinel for "no seq header" — see OrdersUpdate.seq docstring. */
58
69
  export declare const NO_SEQ = -1;
@@ -67,6 +78,19 @@ export declare class EventListener {
67
78
  private readonly _parseOrder;
68
79
  private _ws;
69
80
  private _closed;
81
+ /**
82
+ * Sends the heartbeats this client promises.
83
+ *
84
+ * IT PROMISED THEM AND NEVER SENT ONE. The CONNECT frame has always carried
85
+ * `heart-beat:30000,30000` -- "I will send every 30s, send me one every 30s"
86
+ * -- and nothing here wrote to the socket again except SUBSCRIBE. Worse than
87
+ * the other two SDKs: `ws` sends no WebSocket ping of its own unless asked,
88
+ * so this client had no keepalive at any layer. Java fixed this first;
89
+ * TypeScript and Python advertised the same thing and were left behind.
90
+ *
91
+ * unref()'d, so it can never hold the process open.
92
+ */
93
+ private _heartbeat;
70
94
  private _subscriptionCounter;
71
95
  private _reconnecting;
72
96
  constructor(wsUrl: string, bearerToken: string, marketplaceId: number, callback: EventCallback, clientDescription: string, parseHolding: (data: Record<string, unknown>) => Holding, parseOrder: (data: Record<string, unknown>) => Order);
@@ -74,7 +98,7 @@ export declare class EventListener {
74
98
  /**
75
99
  * React to a dropped stream by restoring it.
76
100
  *
77
- * On success a `Reconnected` is delivered so consumers know their state
101
+ * On success a `StreamReconnected` is delivered so consumers know their state
78
102
  * needs reseeding -- matching Java, where the subscription has always
79
103
  * restored itself rather than leaving the caller to notice.
80
104
  *
@@ -84,6 +108,14 @@ export declare class EventListener {
84
108
  _onStreamDropped(exception: Error): void;
85
109
  reconnect(): Promise<void>;
86
110
  close(): void;
111
+ /**
112
+ * Send a bare EOL every {@link HEARTBEAT_INTERVAL_MS}.
113
+ *
114
+ * A newline on its own is what STOMP 1.2 defines a heartbeat to be, so the
115
+ * server reads it as one and nothing else parses it as a frame.
116
+ */
117
+ private _startHeartbeats;
118
+ private _stopHeartbeats;
87
119
  private _connect;
88
120
  private _disconnect;
89
121
  private _nextId;
package/dist/stomp.js CHANGED
@@ -7,6 +7,17 @@
7
7
  import WebSocket from "ws";
8
8
  import { toInstant } from "./timestamps.js";
9
9
  const HEARTBEAT_MS = 30_000;
10
+ /** What this client advertises in CONNECT, and must therefore keep to. */
11
+ export const ADVERTISED_HEARTBEAT_MS = HEARTBEAT_MS;
12
+ /**
13
+ * How often this client actually sends one. Under the 30s it advertises, so a
14
+ * late timer still lands inside the window it promised, and well under the 55s
15
+ * at which Heroku's router closes an idle connection and records an H15
16
+ * against the app. Named so the interval can be tested against the thing it
17
+ * exists to stay under.
18
+ */
19
+ export const HEARTBEAT_INTERVAL_MS = 25_000;
20
+ export const HEROKU_IDLE_TIMEOUT_MS = 55_000;
10
21
  const NULL = "\x00";
11
22
  /**
12
23
  * Prefix on the `/app` SUBSCRIBE destination selecting fm-server's WS
@@ -141,6 +152,22 @@ function parseOrders(data, parseOrder) {
141
152
  // ---------------------------------------------------------------------------
142
153
  // EventListener — manages WS + STOMP connection
143
154
  // ---------------------------------------------------------------------------
155
+ /**
156
+ * Whether the handshake was refused for who we are rather than for what the
157
+ * network did.
158
+ *
159
+ * <p>`ws` reports a rejected upgrade as `Unexpected server response: 401`, so
160
+ * the status is read back out of that. 403 counts too: a token that is valid
161
+ * but not permitted here will not become permitted by being presented again.
162
+ */
163
+ function isAuthRefusal(failure) {
164
+ for (let cause = failure; cause instanceof Error; cause = cause.cause) {
165
+ const status = /Unexpected server response:\s*(\d{3})/.exec(cause.message)?.[1];
166
+ if (status === "401" || status === "403")
167
+ return true;
168
+ }
169
+ return false;
170
+ }
144
171
  export class EventListener {
145
172
  _wsUrl;
146
173
  _bearerToken;
@@ -151,6 +178,19 @@ export class EventListener {
151
178
  _parseOrder;
152
179
  _ws = null;
153
180
  _closed = false;
181
+ /**
182
+ * Sends the heartbeats this client promises.
183
+ *
184
+ * IT PROMISED THEM AND NEVER SENT ONE. The CONNECT frame has always carried
185
+ * `heart-beat:30000,30000` -- "I will send every 30s, send me one every 30s"
186
+ * -- and nothing here wrote to the socket again except SUBSCRIBE. Worse than
187
+ * the other two SDKs: `ws` sends no WebSocket ping of its own unless asked,
188
+ * so this client had no keepalive at any layer. Java fixed this first;
189
+ * TypeScript and Python advertised the same thing and were left behind.
190
+ *
191
+ * unref()'d, so it can never hold the process open.
192
+ */
193
+ _heartbeat = null;
154
194
  _subscriptionCounter = 0;
155
195
  _reconnecting = false;
156
196
  constructor(wsUrl, bearerToken, marketplaceId, callback, clientDescription, parseHolding, parseOrder) {
@@ -181,6 +221,7 @@ export class EventListener {
181
221
  // unexpected but continue
182
222
  }
183
223
  this._subscribe();
224
+ this._startHeartbeats();
184
225
  this._receiveLoop();
185
226
  resolve();
186
227
  });
@@ -195,7 +236,7 @@ export class EventListener {
195
236
  /**
196
237
  * React to a dropped stream by restoring it.
197
238
  *
198
- * On success a `Reconnected` is delivered so consumers know their state
239
+ * On success a `StreamReconnected` is delivered so consumers know their state
199
240
  * needs reseeding -- matching Java, where the subscription has always
200
241
  * restored itself rather than leaving the caller to notice.
201
242
  *
@@ -228,7 +269,26 @@ export class EventListener {
228
269
  await this.start();
229
270
  return;
230
271
  }
231
- catch {
272
+ catch (exception) {
273
+ // A REJECTED TOKEN IS NOT A BLIP, and retrying it is not patience --
274
+ // it is a client hammering a server that has already given its final
275
+ // answer. Measured 2026-09-03: one NAT gateway produced 11,918
276
+ // handshake 401s in two hours, about 100 a minute, against 360
277
+ // successful connections from every other client combined. Nothing
278
+ // told the operator their token had expired; the loop simply ran.
279
+ //
280
+ // So an auth refusal ends the stream and says why, and every other
281
+ // failure keeps the existing retry: a server restart or a network drop
282
+ // IS a blip, and recovering from it is what this loop is for.
283
+ if (isAuthRefusal(exception)) {
284
+ this._closed = true;
285
+ this._callback({
286
+ kind: "stream-dropped",
287
+ exception: new Error("WebSocket refused: the token was rejected. It has expired or was " +
288
+ "signed for another server; reconnecting cannot fix it.", { cause: exception }),
289
+ });
290
+ return;
291
+ }
232
292
  await new Promise((r) => setTimeout(r, 2000));
233
293
  }
234
294
  }
@@ -237,8 +297,36 @@ export class EventListener {
237
297
  if (this._closed)
238
298
  return;
239
299
  this._closed = true;
300
+ this._stopHeartbeats();
240
301
  this._disconnect();
241
302
  }
303
+ /**
304
+ * Send a bare EOL every {@link HEARTBEAT_INTERVAL_MS}.
305
+ *
306
+ * A newline on its own is what STOMP 1.2 defines a heartbeat to be, so the
307
+ * server reads it as one and nothing else parses it as a frame.
308
+ */
309
+ _startHeartbeats() {
310
+ this._stopHeartbeats();
311
+ this._heartbeat = setInterval(() => {
312
+ const ws = this._ws;
313
+ if (this._closed || ws === null || ws.readyState !== WebSocket.OPEN)
314
+ return;
315
+ try {
316
+ ws.send("\n");
317
+ }
318
+ catch {
319
+ // a dead socket is the receive loop's problem, not this timer's
320
+ }
321
+ }, HEARTBEAT_INTERVAL_MS);
322
+ this._heartbeat.unref?.();
323
+ }
324
+ _stopHeartbeats() {
325
+ if (this._heartbeat !== null) {
326
+ clearInterval(this._heartbeat);
327
+ this._heartbeat = null;
328
+ }
329
+ }
242
330
  // -- WebSocket connection --------------------------------------------------
243
331
  _connect() {
244
332
  return new WebSocket(this._wsUrl, ["v12.stomp", "v11.stomp", "v10.stomp"], {
package/dist/stomp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"stomp.js","sourceRoot":"","sources":["../src/stomp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stomp.js","sourceRoot":"","sources":["../src/stomp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,YAAY,GAAG,MAAM,CAAC;AAE5B,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,YAAY,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAC7C,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB;;;;;;;;;;;;GAYG;AACH,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE;IACvC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvE,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC1B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC,CAAC,EAAE,CAAC;AAYL,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,oCAAoC;IACpC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEhC,4DAA4D;IAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,aAAqB,CAAC;IAC1B,IAAI,IAAY,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,aAAa,GAAG,GAAG,CAAC;QACpB,IAAI,GAAG,EAAE,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACpC,CAAC;AAkED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,MAAM,YAAY,GAAG,cAAc,CAAC;AACpC,MAAM,UAAU,GAAK,KAAK,CAAC;AAE3B,qEAAqE;AACrE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;AAEzB,SAAS,UAAU,CACjB,KAAiB,EACjB,YAAwD,EACxD,UAAoD;IAEpD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEvC,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,cAAc;YACjB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,gBAAgB;YACnB,OAAO,YAAY,CAAC,IAA+B,CAAC,CAAC;QACvD,KAAK,gBAAgB;YACnB,OAAO,YAAY,CAAC,IAA+B,CAAC,CAAC;QACvD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACjD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;QAC/E,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;2BAC2B;AAC3B,SAAS,SAAS,CAAC,KAAyB;IAC1C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACnE,OAAO,EAAE,OAAO,EAAG,IAA+B,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAA6B;IACxD,OAAO;QACL,aAAa,EAAG,IAAI,CAAC,aAAwB,IAAI,CAAC;QAClD,YAAY,EAAG,IAAI,CAAC,YAAuB,IAAI,CAAC;QAChD,EAAE,EAAG,IAAI,CAAC,EAAa,IAAI,CAAC;QAC5B,QAAQ,EAAG,IAAI,CAAC,QAAmB,IAAI,CAAC;QACxC,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,IAAI;QACrC,IAAI,EAAG,IAAI,CAAC,IAAe,IAAI,IAAI;QACnC,WAAW,EAAG,IAAI,CAAC,WAAsB,IAAI,IAAI;QACjD,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAkB,CAAC;QAC5C,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,SAAmB,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAA4B,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,WAAW,CAClB,IAAa,EACb,UAAoD;IAEpD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAA4B,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,OAAgB;IACrC,KAAK,IAAI,KAAK,GAAY,OAAO,EAAE,KAAK,YAAY,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/E,MAAM,MAAM,GAAG,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,aAAa;IACP,MAAM,CAAS;IACf,YAAY,CAAS;IACrB,cAAc,CAAS;IACvB,SAAS,CAAgB;IACzB,kBAAkB,CAAS;IAC3B,aAAa,CAA6C;IAC1D,WAAW,CAA2C;IAE/D,GAAG,GAAqB,IAAI,CAAC;IAC7B,OAAO,GAAG,KAAK,CAAC;IAExB;;;;;;;;;;;OAWG;IACK,UAAU,GAA0B,IAAI,CAAC;IACzC,oBAAoB,GAAG,CAAC,CAAC;IACzB,aAAa,GAAG,KAAK,CAAC;IAE9B,YACE,KAAa,EACb,WAAmB,EACnB,aAAqB,EACrB,QAAuB,EACvB,iBAAyB,EACzB,YAAwD,EACxD,UAAoD;QAEpD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;QAChC,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAClC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,6EAA6E;IAE7E,KAAK;QACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBACvB,IAAI,CAAC;oBACH,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;oBACZ,OAAO;gBACT,CAAC;gBACD,0CAA0C;gBAC1C,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;oBAChC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;oBAC1C,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;wBAC1D,0BAA0B;oBAC5B,CAAC;oBACD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,gBAAgB,CAAC,SAAgB;QAC/B,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC9E,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAED,KAAK,CAAC,SAAS;QACb,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO;YACT,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,qEAAqE;gBACrE,qEAAqE;gBACrE,+DAA+D;gBAC/D,+DAA+D;gBAC/D,mEAAmE;gBACnE,kEAAkE;gBAClE,EAAE;gBACF,mEAAmE;gBACnE,uEAAuE;gBACvE,8DAA8D;gBAC9D,IAAI,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACpB,IAAI,CAAC,SAAS,CAAC;wBACb,IAAI,EAAE,gBAAgB;wBACtB,SAAS,EAAE,IAAI,KAAK,CAClB,mEAAmE;4BACjE,wDAAwD,EAC1D,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACK,gBAAgB;QACtB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;YACpB,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,OAAO;YAC5E,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;IAC5B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,QAAQ;QACd,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE;YACzE,OAAO,EAAE;gBACP,aAAa,EAAE,IAAI,CAAC,YAAY;aACjC;YACD,UAAU,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,OAAO;QACb,IAAI,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAC/B,OAAO,OAAO,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC5C,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE;gBACP,gBAAgB,EAAE,aAAa;gBAC/B,YAAY,EAAE,GAAG,YAAY,IAAI,YAAY,EAAE;gBAC/C,mBAAmB,EAAE,IAAI,CAAC,kBAAkB;gBAC5C,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC;aAC9C;YACD,IAAI,EAAE,EAAE;SACT,CAAC;QACF,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC;IAEO,UAAU;QAChB,6DAA6D;QAC7D,gEAAgE;QAChE,iEAAiE;QACjE,qEAAqE;QACrE,kEAAkE;QAClE,gEAAgE;QAChE,wCAAwC;QACxC,MAAM,QAAQ,GAAG,iBAAiB,IAAI,CAAC,cAAc,EAAE,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI;YACjB,cAAc,QAAQ,EAAE;YACxB,SAAS,QAAQ,EAAE;YACnB,OAAO,kBAAkB,GAAG,QAAQ,EAAE;SACvC,EAAE,CAAC;YACF,MAAM,KAAK,GAAe;gBACxB,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE;oBACP,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE;oBAClB,WAAW,EAAE,IAAI;iBAClB;gBACD,IAAI,EAAE,EAAE;aACT,CAAC;YACF,IAAI,CAAC,GAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,YAAY;QAClB,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,CAAC,kBAAkB;YAEtD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YAEhC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtE,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACrC,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,SAAS,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC;iBAC7D,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}