@beacon-build/sdk 1.18.0 → 1.18.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.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * RealtimeProvider — F141
3
+ *
4
+ * Context provider for the beacon Realtime SSE client.
5
+ * Wrap your app with <RealtimeProvider baseUrl authToken> to enable useRealtime().
6
+ *
7
+ * INV-19: useRealtime() without <RealtimeProvider> throws RealtimeProviderNotFoundError.
8
+ */
9
+ import React from 'react';
10
+ export interface RealtimeContextValue {
11
+ baseUrl: string;
12
+ authToken: string;
13
+ }
14
+ export declare class RealtimeProviderNotFoundError extends Error {
15
+ constructor();
16
+ }
17
+ export interface RealtimeProviderProps {
18
+ /** API base URL, e.g. 'https://api.beacon.build' */
19
+ baseUrl: string;
20
+ /** User-JWT or Agent-JWT */
21
+ authToken: string;
22
+ children: React.ReactNode;
23
+ }
24
+ export declare const RealtimeProvider: React.FC<RealtimeProviderProps>;
25
+ /**
26
+ * Internal hook — reads RealtimeContext. Throws RealtimeProviderNotFoundError
27
+ * if called outside of <RealtimeProvider>.
28
+ */
29
+ export declare function useRealtimeContext(): RealtimeContextValue;
30
+ //# sourceMappingURL=RealtimeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeProvider.d.ts","sourceRoot":"","sources":["../../src/react/RealtimeProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAA;AAIxD,MAAM,WAAW,oBAAoB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CACpB;AAMD,qBAAa,6BAA8B,SAAQ,KAAK;;CAQvD;AAID,MAAM,WAAW,qBAAqB;IAClC,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAA;IACf,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC5B;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAU5D,CAAA;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,oBAAoB,CAIzD"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * RealtimeProvider — F141
4
+ *
5
+ * Context provider for the beacon Realtime SSE client.
6
+ * Wrap your app with <RealtimeProvider baseUrl authToken> to enable useRealtime().
7
+ *
8
+ * INV-19: useRealtime() without <RealtimeProvider> throws RealtimeProviderNotFoundError.
9
+ */
10
+ import { createContext, useContext } from 'react';
11
+ const RealtimeContext = createContext(null);
12
+ // ─── Error ────────────────────────────────────────────────────────────────────
13
+ export class RealtimeProviderNotFoundError extends Error {
14
+ constructor() {
15
+ super('useRealtime() was called outside of <RealtimeProvider>. ' +
16
+ 'Wrap your app with <RealtimeProvider baseUrl={...} authToken={...}>.');
17
+ this.name = 'RealtimeProviderNotFoundError';
18
+ }
19
+ }
20
+ export const RealtimeProvider = ({ baseUrl, authToken, children, }) => {
21
+ return (_jsx(RealtimeContext.Provider, { value: { baseUrl, authToken }, children: children }));
22
+ };
23
+ // ─── Context hook ─────────────────────────────────────────────────────────────
24
+ /**
25
+ * Internal hook — reads RealtimeContext. Throws RealtimeProviderNotFoundError
26
+ * if called outside of <RealtimeProvider>.
27
+ */
28
+ export function useRealtimeContext() {
29
+ const ctx = useContext(RealtimeContext);
30
+ if (!ctx)
31
+ throw new RealtimeProviderNotFoundError();
32
+ return ctx;
33
+ }
34
+ //# sourceMappingURL=RealtimeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeProvider.js","sourceRoot":"","sources":["../../src/react/RealtimeProvider.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAc,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AASxD,MAAM,eAAe,GAAG,aAAa,CAA8B,IAAI,CAAC,CAAA;AAExE,iFAAiF;AAEjF,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACpD;QACI,KAAK,CACD,0DAA0D;YACtD,sEAAsE,CAC7E,CAAA;QACD,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC/C,CAAC;CACJ;AAYD,MAAM,CAAC,MAAM,gBAAgB,GAAoC,CAAC,EAC9D,OAAO,EACP,SAAS,EACT,QAAQ,GACX,EAAE,EAAE;IACD,OAAO,CACH,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,YAClD,QAAQ,GACc,CAC9B,CAAA;AACL,CAAC,CAAA;AAED,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;IACvC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,6BAA6B,EAAE,CAAA;IACnD,OAAO,GAAG,CAAA;AACd,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { RealtimeProvider, useRealtimeContext, RealtimeProviderNotFoundError, } from './RealtimeProvider.js';
2
+ export type { RealtimeProviderProps, RealtimeContextValue } from './RealtimeProvider.js';
3
+ export { useRealtime } from './useRealtime.js';
4
+ export type { UseRealtimeOptions, UseRealtimeResult } from './useRealtime.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,6BAA6B,GAChC,MAAM,uBAAuB,CAAA;AAC9B,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAExF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,7 @@
1
+ // ─── React Integration for @beacon-build/sdk (F141) ───────────────────────────
2
+ //
3
+ // These exports moved from @beacon-build/ui → @beacon-build/sdk (C128).
4
+ // Consumers should import directly from @beacon-build/sdk.
5
+ export { RealtimeProvider, useRealtimeContext, RealtimeProviderNotFoundError, } from './RealtimeProvider.js';
6
+ export { useRealtime } from './useRealtime.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,wEAAwE;AACxE,2DAA2D;AAE3D,OAAO,EACH,gBAAgB,EAChB,kBAAkB,EAClB,6BAA6B,GAChC,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * useRealtime — F141
3
+ *
4
+ * Thin React wrapper over RealtimeSdkClient.
5
+ * Subscribes to one or more channels and calls onEvent when an event arrives.
6
+ *
7
+ * Lifecycle:
8
+ * - Connects on mount (if enabled !== false).
9
+ * - Disconnects on unmount (INV-13).
10
+ * - React StrictMode-compatible: double-mount produces effectively one connection
11
+ * after the cleanup cycle.
12
+ * - Reconnects when channels string representation changes.
13
+ *
14
+ * INV-19: Must be used inside <RealtimeProvider>. Throws RealtimeProviderNotFoundError otherwise.
15
+ */
16
+ import type { RealtimeChannel, RealtimeEventType } from '@beacon-build/core';
17
+ export interface UseRealtimeOptions<T extends Record<string, unknown> = Record<string, unknown>> {
18
+ channels: RealtimeChannel[];
19
+ eventType: RealtimeEventType;
20
+ onEvent: (data: T) => void;
21
+ /** default: true */
22
+ enabled?: boolean;
23
+ onError?: (error: Error) => void;
24
+ }
25
+ export interface UseRealtimeResult {
26
+ isConnected: boolean;
27
+ error: Error | null;
28
+ }
29
+ export declare function useRealtime<T extends Record<string, unknown> = Record<string, unknown>>(options: UseRealtimeOptions<T>): UseRealtimeResult;
30
+ //# sourceMappingURL=useRealtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRealtime.d.ts","sourceRoot":"","sources":["../../src/react/useRealtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAK5E,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3F,QAAQ,EAAE,eAAe,EAAE,CAAA;IAC3B,SAAS,EAAE,iBAAiB,CAAA;IAC5B,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;IAC1B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACnC;AAED,MAAM,WAAW,iBAAiB;IAC9B,WAAW,EAAE,OAAO,CAAA;IACpB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACtB;AAID,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnF,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC/B,iBAAiB,CAkDnB"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * useRealtime — F141
3
+ *
4
+ * Thin React wrapper over RealtimeSdkClient.
5
+ * Subscribes to one or more channels and calls onEvent when an event arrives.
6
+ *
7
+ * Lifecycle:
8
+ * - Connects on mount (if enabled !== false).
9
+ * - Disconnects on unmount (INV-13).
10
+ * - React StrictMode-compatible: double-mount produces effectively one connection
11
+ * after the cleanup cycle.
12
+ * - Reconnects when channels string representation changes.
13
+ *
14
+ * INV-19: Must be used inside <RealtimeProvider>. Throws RealtimeProviderNotFoundError otherwise.
15
+ */
16
+ import { useEffect, useRef, useState } from 'react';
17
+ import { RealtimeSdkClient } from '../realtime/realtime.client.js';
18
+ import { useRealtimeContext } from './RealtimeProvider.js';
19
+ // ─── Hook ─────────────────────────────────────────────────────────────────────
20
+ export function useRealtime(options) {
21
+ const { baseUrl, authToken } = useRealtimeContext();
22
+ const [isConnected, setIsConnected] = useState(false);
23
+ const [error, setError] = useState(null);
24
+ // Stable refs for handlers — avoids triggering re-connects on every render
25
+ const onEventRef = useRef(options.onEvent);
26
+ onEventRef.current = options.onEvent;
27
+ const onErrorRef = useRef(options.onError);
28
+ onErrorRef.current = options.onError;
29
+ const enabled = options.enabled !== false;
30
+ // Serialize channels for deep-compare in useEffect deps
31
+ const channelsKey = options.channels.slice().sort().join(',');
32
+ useEffect(() => {
33
+ if (!enabled)
34
+ return;
35
+ const client = new RealtimeSdkClient({
36
+ baseUrl,
37
+ authToken,
38
+ channels: options.channels,
39
+ onConnect: () => {
40
+ setIsConnected(true);
41
+ setError(null);
42
+ },
43
+ onDisconnect: () => {
44
+ setIsConnected(false);
45
+ },
46
+ onError: (err) => {
47
+ setError(err);
48
+ onErrorRef.current?.(err);
49
+ },
50
+ });
51
+ client.on(options.eventType, (data) => {
52
+ onEventRef.current(data);
53
+ });
54
+ client.connect();
55
+ return () => {
56
+ client.disconnect();
57
+ setIsConnected(false);
58
+ };
59
+ // channelsKey covers the channels array. authToken + baseUrl + eventType are stable by convention.
60
+ }, [baseUrl, authToken, channelsKey, options.eventType, enabled]);
61
+ return { isConnected, error };
62
+ }
63
+ //# sourceMappingURL=useRealtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRealtime.js","sourceRoot":"","sources":["../../src/react/useRealtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAkB1D,iFAAiF;AAEjF,MAAM,UAAU,WAAW,CACvB,OAA8B;IAE9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,kBAAkB,EAAE,CAAA;IACnD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IAEtD,2EAA2E;IAC3E,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1C,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAA;IAEzC,wDAAwD;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAE7D,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,OAAO;YAAE,OAAM;QAEpB,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;YACjC,OAAO;YACP,SAAS;YACT,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,SAAS,EAAE,GAAG,EAAE;gBACZ,cAAc,CAAC,IAAI,CAAC,CAAA;gBACpB,QAAQ,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;YACD,YAAY,EAAE,GAAG,EAAE;gBACf,cAAc,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACb,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACb,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;YAC7B,CAAC;SACJ,CAAC,CAAA;QAEF,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;YAClC,UAAU,CAAC,OAAO,CAAC,IAAS,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,OAAO,EAAE,CAAA;QAEhB,OAAO,GAAG,EAAE;YACR,MAAM,CAAC,UAAU,EAAE,CAAA;YACnB,cAAc,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC,CAAA;QACD,mGAAmG;IACvG,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IAEjE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,19 @@
1
1
  {
2
2
  "name": "@beacon-build/sdk",
3
- "version": "1.18.0",
3
+ "version": "1.18.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ },
12
+ "./react": {
13
+ "import": "./dist/react/index.js",
14
+ "types": "./dist/react/index.d.ts"
15
+ }
16
+ },
7
17
  "files": [
8
18
  "dist",
9
19
  "README.md",
@@ -13,11 +23,22 @@
13
23
  "dependencies": {
14
24
  "@types/event-source-polyfill": "^1.0.5",
15
25
  "event-source-polyfill": "^1.0.31",
16
- "@beacon-build/core": "1.18.0"
26
+ "@beacon-build/core": "1.18.1"
17
27
  },
18
28
  "devDependencies": {
29
+ "@testing-library/react": "^16.3.2",
30
+ "@types/react": "^19.2.0",
31
+ "@types/react-dom": "^19.2.0",
32
+ "@vitejs/plugin-react": "^4.7.0",
33
+ "jsdom": "^29.1.1",
34
+ "react": "^19.2.0",
35
+ "react-dom": "^19.2.0",
19
36
  "vitest": "^4.1.2"
20
37
  },
38
+ "peerDependencies": {
39
+ "react": "^19.0.0",
40
+ "react-dom": "^19.0.0"
41
+ },
21
42
  "publishConfig": {
22
43
  "registry": "https://registry.npmjs.org",
23
44
  "access": "public"