@fire-spark/realtime 0.7.2 → 0.8.1
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 +17 -2
- package/dist/index.js +89 -2
- package/package.json +3 -3
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.
|
|
3
|
+
"version": "0.8.1",
|
|
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/
|
|
22
|
-
"@fire-spark/
|
|
21
|
+
"@fire-spark/core": "^0.8.1",
|
|
22
|
+
"@fire-spark/types": "^0.8.1"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"tsdown": "^0.22.14",
|