@fire-spark/realtime 0.4.1 → 0.6.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.d.ts CHANGED
@@ -70,6 +70,42 @@ declare const listenKiosk: (options: RealtimeListenKioskOptions, deps?: Realtime
70
70
  //#region src/listenOrder.d.ts
71
71
  declare const listenOrder: (options: RealtimeListenOrderOptions, deps?: RealtimeListenDeps) => () => void;
72
72
  //#endregion
73
+ //#region src/checkoutRelease.d.ts
74
+ type CheckoutReleaseResult = {
75
+ status: "released";
76
+ payload: OrderChangedPayload$1;
77
+ } | {
78
+ status: "failed";
79
+ payload: OrderChangedPayload$1;
80
+ } | {
81
+ status: "timeout";
82
+ } | {
83
+ status: "stopped";
84
+ };
85
+ interface CheckoutReleaseWatch {
86
+ /** Resolves when the channel is joined, or when the watch settles first. */
87
+ subscribed: Promise<void>;
88
+ result: Promise<CheckoutReleaseResult>;
89
+ /** Starts the timeout. Call after place order is in flight or has returned. */
90
+ arm: () => void;
91
+ /** Drops the subscription. Settles `result` with `stopped` if still open. */
92
+ stop: () => void;
93
+ /** Feed a payload you already have (sale response, replay). */
94
+ consider: (payload: OrderChangedPayload$1 | null) => void;
95
+ }
96
+ type WatchCheckoutReleaseOptions = Omit<RealtimeListenOrderOptions, "on"> & {
97
+ timeoutMs?: number;
98
+ /** Known fulfillment state. A terminal value settles the watch immediately. */
99
+ current?: OrderChangedPayload$1 | null;
100
+ };
101
+ /**
102
+ * Subscribes to `order.changed` and settles when checkout is released or
103
+ * rejected. The fulfillment snapshot on subscribe covers an event that
104
+ * already happened. `arm` starts the timeout so a missed event cannot spin
105
+ * forever. `stop` on unmount.
106
+ */
107
+ declare const watchCheckoutRelease: (options: WatchCheckoutReleaseOptions) => CheckoutReleaseWatch;
108
+ //#endregion
73
109
  //#region src/index.d.ts
74
110
  declare const realtime: {
75
111
  listen: typeof listen;
@@ -77,4 +113,4 @@ declare const realtime: {
77
113
  listenOrder: typeof listenOrder;
78
114
  };
79
115
  //#endregion
80
- export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, type KioskCommandPayload, type KioskConfigChangedPayload, type KioskRealtimeToken, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, type OrderChangedPayload, type RealtimeListenEvents, type RealtimeListenKioskOptions, type RealtimeListenOptions, type RealtimeListenOrderOptions, type StorefrontAvailabilityChangedPayload, type StorefrontCmsChangedPayload, type StorefrontMenuChangedPayload, type StorefrontRealtimeToken, type StorefrontWorkspaceChangedPayload, listen, listenKiosk, listenOrder, realtime };
116
+ export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, type CheckoutReleaseResult, type CheckoutReleaseWatch, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, type KioskCommandPayload, type KioskConfigChangedPayload, type KioskRealtimeToken, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, type OrderChangedPayload, type RealtimeListenEvents, type RealtimeListenKioskOptions, type RealtimeListenOptions, type RealtimeListenOrderOptions, type StorefrontAvailabilityChangedPayload, type StorefrontCmsChangedPayload, type StorefrontMenuChangedPayload, type StorefrontRealtimeToken, type StorefrontWorkspaceChangedPayload, listen, listenKiosk, listenOrder, realtime, watchCheckoutRelease };
package/dist/index.js CHANGED
@@ -4086,6 +4086,94 @@ const listenOrder = (options, deps = {}) => {
4086
4086
  };
4087
4087
  };
4088
4088
  //#endregion
4089
+ //#region src/checkoutRelease.ts
4090
+ const CHECKOUT_RELEASE_TIMEOUT_MS = 6e4;
4091
+ /** `checkout_state` from `order.changed` or the fulfillment snapshot. */
4092
+ const checkoutReleaseStatus = (payload) => {
4093
+ if (payload.checkout_state === "failed") return "failed";
4094
+ if (payload.checkout_state === "released") return "released";
4095
+ return "pending";
4096
+ };
4097
+ /**
4098
+ * Subscribes to `order.changed` and settles when checkout is released or
4099
+ * rejected. The fulfillment snapshot on subscribe covers an event that
4100
+ * already happened. `arm` starts the timeout so a missed event cannot spin
4101
+ * forever. `stop` on unmount.
4102
+ */
4103
+ const watchCheckoutRelease = (options) => {
4104
+ const timeoutMs = options.timeoutMs ?? CHECKOUT_RELEASE_TIMEOUT_MS;
4105
+ let settled = false;
4106
+ let stopListen = () => {};
4107
+ let timer = null;
4108
+ let resolveResult = () => void 0;
4109
+ let resolveSubscribed = () => void 0;
4110
+ const result = new Promise((resolve) => {
4111
+ resolveResult = resolve;
4112
+ });
4113
+ const subscribed = new Promise((resolve) => {
4114
+ resolveSubscribed = resolve;
4115
+ });
4116
+ const finish = (value) => {
4117
+ if (settled) return;
4118
+ settled = true;
4119
+ if (timer !== null) clearTimeout(timer);
4120
+ timer = null;
4121
+ stopListen();
4122
+ resolveSubscribed();
4123
+ resolveResult(value);
4124
+ };
4125
+ const take = (payload) => {
4126
+ const status = checkoutReleaseStatus(payload);
4127
+ if (status === "pending") return;
4128
+ if (status === "released") {
4129
+ finish({
4130
+ status: "released",
4131
+ payload
4132
+ });
4133
+ return;
4134
+ }
4135
+ finish({
4136
+ status: "failed",
4137
+ payload
4138
+ });
4139
+ };
4140
+ if (options.current) take(options.current);
4141
+ if (!settled) {
4142
+ const o1 = {
4143
+ orderId: options.orderId,
4144
+ baseUrl: options.baseUrl
4145
+ };
4146
+ const o2 = { accessToken: options.accessToken };
4147
+ const o3 = { fetchImpl: options.fetchImpl };
4148
+ const on = {
4149
+ changed: take,
4150
+ subscribed: () => resolveSubscribed()
4151
+ };
4152
+ stopListen = listenOrder({
4153
+ ...o1,
4154
+ ...o2,
4155
+ ...o3,
4156
+ on
4157
+ });
4158
+ }
4159
+ const arm = () => {
4160
+ if (settled || timer !== null) return;
4161
+ timer = setTimeout(() => finish({ status: "timeout" }), timeoutMs);
4162
+ };
4163
+ const stop = () => finish({ status: "stopped" });
4164
+ const consider = (payload) => {
4165
+ if (!payload) return;
4166
+ take(payload);
4167
+ };
4168
+ return {
4169
+ subscribed,
4170
+ result,
4171
+ arm,
4172
+ stop,
4173
+ consider
4174
+ };
4175
+ };
4176
+ //#endregion
4089
4177
  //#region src/index.ts
4090
4178
  const realtime = {
4091
4179
  listen,
@@ -4093,4 +4181,4 @@ const realtime = {
4093
4181
  listenOrder
4094
4182
  };
4095
4183
  //#endregion
4096
- export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, listen, listenKiosk, listenOrder, realtime };
4184
+ export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, listen, listenKiosk, listenOrder, realtime, watchCheckoutRelease };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fire-spark/realtime",
3
- "version": "0.4.1",
3
+ "version": "0.6.0",
4
4
  "description": "Fire Spark storefront realtime SDK",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -18,8 +18,8 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@supabase/realtime-js": "^2.100.1",
21
- "@fire-spark/core": "^0.4.1",
22
- "@fire-spark/types": "^0.4.1"
21
+ "@fire-spark/core": "^0.6.0",
22
+ "@fire-spark/types": "^0.6.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "tsdown": "^0.22.14",