@fire-spark/realtime 0.7.1 → 0.8.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
@@ -1,5 +1,5 @@
1
1
  import { ServiceHttpOptions } from "@fire-spark/core";
2
- import { KioskCommandPayload, KioskCommandPayload as KioskCommandPayload$1, KioskConfigChangedPayload, KioskConfigChangedPayload as KioskConfigChangedPayload$1, KioskRealtimeToken, KioskRealtimeToken as KioskRealtimeToken$1, OrderChangedPayload, OrderChangedPayload as OrderChangedPayload$1, StorefrontAvailabilityChangedPayload, StorefrontAvailabilityChangedPayload as StorefrontAvailabilityChangedPayload$1, StorefrontCmsChangedPayload, StorefrontCmsChangedPayload as StorefrontCmsChangedPayload$1, StorefrontMenuChangedPayload, StorefrontMenuChangedPayload as StorefrontMenuChangedPayload$1, StorefrontMenuScope, StorefrontRealtimeToken, StorefrontWorkspaceChangedPayload, StorefrontWorkspaceChangedPayload as StorefrontWorkspaceChangedPayload$1 } from "@fire-spark/types";
2
+ import { KioskCommandPayload, KioskCommandPayload as KioskCommandPayload$1, KioskConfigChangedPayload, KioskConfigChangedPayload as KioskConfigChangedPayload$1, KioskRealtimeToken, KioskRealtimeToken as KioskRealtimeToken$1, OrderChangedPayload, OrderChangedPayload as OrderChangedPayload$1, PosFloorChangedPayload, PosFloorChangedPayload as PosFloorChangedPayload$1, PosFloorRealtimeToken, PosFloorRealtimeToken as PosFloorRealtimeToken$1, StorefrontAvailabilityChangedPayload, StorefrontAvailabilityChangedPayload as StorefrontAvailabilityChangedPayload$1, StorefrontCmsChangedPayload, StorefrontCmsChangedPayload as StorefrontCmsChangedPayload$1, StorefrontMenuChangedPayload, StorefrontMenuChangedPayload as StorefrontMenuChangedPayload$1, StorefrontMenuScope, StorefrontRealtimeToken, StorefrontWorkspaceChangedPayload, StorefrontWorkspaceChangedPayload as StorefrontWorkspaceChangedPayload$1 } from "@fire-spark/types";
3
3
  //#region src/listen.types.d.ts
4
4
  declare const MENU_CHANGED_EVENT = "menu.changed";
5
5
  declare const AVAILABILITY_CHANGED_EVENT = "availability.changed";
@@ -7,6 +7,7 @@ declare const ORDER_CHANGED_EVENT = "order.changed";
7
7
  declare const KIOSK_CONFIG_CHANGED_EVENT = "kiosk.config.changed";
8
8
  declare const KIOSK_COMMAND_EVENT = "kiosk.command";
9
9
  declare const CMS_CHANGED_EVENT = "cms.changed";
10
+ declare const FLOOR_CHANGED_EVENT = "floor.changed";
10
11
  interface RealtimeListenEvents {
11
12
  menuChanged?: (payload: StorefrontMenuChangedPayload$1) => void;
12
13
  availabilityChanged?: (payload: StorefrontAvailabilityChangedPayload$1) => void;
@@ -60,6 +61,15 @@ interface RealtimeListenKioskOptions {
60
61
  cmsBlocks?: string[];
61
62
  on: RealtimeListenKioskEvents;
62
63
  }
64
+ interface RealtimeListenPosFloorEvents {
65
+ changed: (payload: PosFloorChangedPayload$1) => void;
66
+ /** Fires on every (re)join; refetch to catch changes missed offline. */
67
+ subscribed?: () => void;
68
+ }
69
+ interface RealtimeListenPosFloorOptions {
70
+ fetchToken: () => Promise<PosFloorRealtimeToken$1>;
71
+ on: RealtimeListenPosFloorEvents;
72
+ }
63
73
  //#endregion
64
74
  //#region src/listen.d.ts
65
75
  declare const listen: (options: RealtimeListenOptions, deps?: RealtimeListenDeps) => () => void;
@@ -70,6 +80,10 @@ declare const listenKiosk: (options: RealtimeListenKioskOptions, deps?: Realtime
70
80
  //#region src/listenOrder.d.ts
71
81
  declare const listenOrder: (options: RealtimeListenOrderOptions, deps?: RealtimeListenDeps) => () => void;
72
82
  //#endregion
83
+ //#region src/listenPosFloor.d.ts
84
+ /** Listens to the register store's `floor.changed` broadcasts. */
85
+ declare const listenPosFloor: (options: RealtimeListenPosFloorOptions, deps?: RealtimeListenDeps) => () => void;
86
+ //#endregion
73
87
  //#region src/checkoutRelease.d.ts
74
88
  type CheckoutReleaseResult = {
75
89
  status: "released";
@@ -111,6 +125,7 @@ declare const realtime: {
111
125
  listen: typeof listen;
112
126
  listenKiosk: typeof listenKiosk;
113
127
  listenOrder: typeof listenOrder;
128
+ listenPosFloor: typeof listenPosFloor;
114
129
  };
115
130
  //#endregion
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 };
131
+ export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, type CheckoutReleaseResult, type CheckoutReleaseWatch, FLOOR_CHANGED_EVENT, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, type KioskCommandPayload, type KioskConfigChangedPayload, type KioskRealtimeToken, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, type OrderChangedPayload, type PosFloorChangedPayload, type PosFloorRealtimeToken, type RealtimeListenEvents, type RealtimeListenKioskOptions, type RealtimeListenOptions, type RealtimeListenOrderOptions, type RealtimeListenPosFloorOptions, type StorefrontAvailabilityChangedPayload, type StorefrontCmsChangedPayload, type StorefrontMenuChangedPayload, type StorefrontRealtimeToken, type StorefrontWorkspaceChangedPayload, listen, listenKiosk, listenOrder, listenPosFloor, realtime, watchCheckoutRelease };
package/dist/index.js CHANGED
@@ -3613,6 +3613,7 @@ const KIOSK_COMMAND_EVENT = "kiosk.command";
3613
3613
  const CMS_CHANGED_EVENT = "cms.changed";
3614
3614
  const PAYMENTS_CHANGED_EVENT = "payments.changed";
3615
3615
  const FULFILLMENTS_CHANGED_EVENT = "fulfillments.changed";
3616
+ const FLOOR_CHANGED_EVENT = "floor.changed";
3616
3617
  const REALTIME_REFRESH_MS = 27e4;
3617
3618
  //#endregion
3618
3619
  //#region src/scope.ts
@@ -4086,6 +4087,91 @@ const listenOrder = (options, deps = {}) => {
4086
4087
  };
4087
4088
  };
4088
4089
  //#endregion
4090
+ //#region src/listenPosFloor.ts
4091
+ const isFloorPayload = (value) => {
4092
+ if (!value || typeof value !== "object") return false;
4093
+ const rec = value;
4094
+ return typeof rec.kind === "string" && typeof rec.store_uid === "string";
4095
+ };
4096
+ const bindFloorEvents = (socket, topic, options) => {
4097
+ const { changed, subscribed } = options.on;
4098
+ const channel = socket.channel(topic, { config: { private: true } });
4099
+ channel.on("broadcast", { event: FLOOR_CHANGED_EVENT }, (msg) => {
4100
+ const { payload } = msg;
4101
+ if (!isFloorPayload(payload)) return;
4102
+ changed(payload);
4103
+ });
4104
+ channel.subscribe((status, err) => {
4105
+ if (status === "SUBSCRIBED") {
4106
+ subscribed?.();
4107
+ return;
4108
+ }
4109
+ if (status !== "CHANNEL_ERROR" && status !== "TIMED_OUT") return;
4110
+ const detail = err instanceof Error ? err.message : status;
4111
+ console.error("[realtime] pos floor subscribe failed", detail);
4112
+ });
4113
+ return channel;
4114
+ };
4115
+ /** Listens to the register store's `floor.changed` broadcasts. */
4116
+ const listenPosFloor = (options, deps = {}) => {
4117
+ const createClient = deps.createClient ?? createRealtimeSocket;
4118
+ const setIntervalFn = deps.setIntervalFn ?? setInterval;
4119
+ const clearIntervalFn = deps.clearIntervalFn ?? clearInterval;
4120
+ let stopped = false;
4121
+ let socket = null;
4122
+ let channel = null;
4123
+ let refreshId = null;
4124
+ const teardown = () => {
4125
+ if (refreshId !== null) clearIntervalFn(refreshId);
4126
+ refreshId = null;
4127
+ if (channel) channel.unsubscribe();
4128
+ channel = null;
4129
+ socket?.disconnect();
4130
+ socket = null;
4131
+ };
4132
+ const applyToken = async (existing) => {
4133
+ const token = await options.fetchToken();
4134
+ if (stopped) return null;
4135
+ if (existing) {
4136
+ await existing.setAuth(token.access_token);
4137
+ return existing;
4138
+ }
4139
+ const next = createClient(token.url, token.key);
4140
+ await next.setAuth(token.access_token);
4141
+ if (stopped) {
4142
+ next.disconnect();
4143
+ return null;
4144
+ }
4145
+ next.connect();
4146
+ channel = bindFloorEvents(next, token.topic, options);
4147
+ return next;
4148
+ };
4149
+ const start = async () => {
4150
+ socket = await applyToken();
4151
+ if (stopped) {
4152
+ teardown();
4153
+ return;
4154
+ }
4155
+ if (!socket) return;
4156
+ refreshId = setIntervalFn(() => {
4157
+ if (!socket) return;
4158
+ applyToken(socket).catch((error) => {
4159
+ const message = error instanceof Error ? error.message : String(error);
4160
+ console.error("[realtime] pos floor token refresh failed", message);
4161
+ });
4162
+ }, REALTIME_REFRESH_MS);
4163
+ };
4164
+ start().catch((error) => {
4165
+ if (stopped) return;
4166
+ const message = error instanceof Error ? error.message : String(error);
4167
+ console.error("[realtime] listenPosFloor failed", message);
4168
+ });
4169
+ return () => {
4170
+ stopped = true;
4171
+ teardown();
4172
+ };
4173
+ };
4174
+ //#endregion
4089
4175
  //#region src/checkoutRelease.ts
4090
4176
  const CHECKOUT_RELEASE_TIMEOUT_MS = 6e4;
4091
4177
  /** `checkout_state` from `order.changed` or the fulfillment snapshot. */
@@ -4178,7 +4264,8 @@ const watchCheckoutRelease = (options) => {
4178
4264
  const realtime = {
4179
4265
  listen,
4180
4266
  listenKiosk,
4181
- listenOrder
4267
+ listenOrder,
4268
+ listenPosFloor
4182
4269
  };
4183
4270
  //#endregion
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 };
4271
+ export { AVAILABILITY_CHANGED_EVENT, CMS_CHANGED_EVENT, FLOOR_CHANGED_EVENT, KIOSK_COMMAND_EVENT, KIOSK_CONFIG_CHANGED_EVENT, MENU_CHANGED_EVENT, ORDER_CHANGED_EVENT, listen, listenKiosk, listenOrder, listenPosFloor, realtime, watchCheckoutRelease };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fire-spark/realtime",
3
- "version": "0.7.1",
3
+ "version": "0.8.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.7.1",
22
- "@fire-spark/types": "^0.7.1"
21
+ "@fire-spark/core": "^0.8.0",
22
+ "@fire-spark/types": "^0.8.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "tsdown": "^0.22.14",