@stratasync/react 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.
Files changed (42) hide show
  1. package/README.md +91 -0
  2. package/dist/context.d.ts +21 -0
  3. package/dist/context.d.ts.map +1 -0
  4. package/dist/context.js +27 -0
  5. package/dist/context.js.map +1 -0
  6. package/dist/hooks/use-connection-state.d.ts +55 -0
  7. package/dist/hooks/use-connection-state.d.ts.map +1 -0
  8. package/dist/hooks/use-connection-state.js +90 -0
  9. package/dist/hooks/use-connection-state.js.map +1 -0
  10. package/dist/hooks/use-model.d.ts +22 -0
  11. package/dist/hooks/use-model.d.ts.map +1 -0
  12. package/dist/hooks/use-model.js +162 -0
  13. package/dist/hooks/use-model.js.map +1 -0
  14. package/dist/hooks/use-query.d.ts +35 -0
  15. package/dist/hooks/use-query.d.ts.map +1 -0
  16. package/dist/hooks/use-query.js +302 -0
  17. package/dist/hooks/use-query.js.map +1 -0
  18. package/dist/hooks/use-sync-client.d.ts +25 -0
  19. package/dist/hooks/use-sync-client.d.ts.map +1 -0
  20. package/dist/hooks/use-sync-client.js +49 -0
  21. package/dist/hooks/use-sync-client.js.map +1 -0
  22. package/dist/hooks/use-yjs-document.d.ts +108 -0
  23. package/dist/hooks/use-yjs-document.d.ts.map +1 -0
  24. package/dist/hooks/use-yjs-document.js +202 -0
  25. package/dist/hooks/use-yjs-document.js.map +1 -0
  26. package/dist/hooks/use-yjs-presence.d.ts +62 -0
  27. package/dist/hooks/use-yjs-presence.d.ts.map +1 -0
  28. package/dist/hooks/use-yjs-presence.js +230 -0
  29. package/dist/hooks/use-yjs-presence.js.map +1 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +9 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/provider.d.ts +7 -0
  35. package/dist/provider.d.ts.map +1 -0
  36. package/dist/provider.js +117 -0
  37. package/dist/provider.js.map +1 -0
  38. package/dist/types.d.ts +107 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/package.json +53 -0
@@ -0,0 +1,117 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef, useState } from "react";
3
+ import { SyncBacklogContext, SyncClientContext, SyncContext, SyncStatusContext, } from "./context.js";
4
+ /**
5
+ * Provider component for the sync client
6
+ */
7
+ export const SyncProvider = ({ client, children, autoStart = true, autoStop = true, }) => {
8
+ const [state, setState] = useState(client.state);
9
+ const [connectionState, setConnectionState] = useState(client.connectionState);
10
+ const lastSyncIdRef = useRef(client.lastSyncId);
11
+ const [backlog, setBacklog] = useState(0);
12
+ const [error, setError] = useState(client.lastError ?? null);
13
+ useEffect(() => {
14
+ let mounted = true;
15
+ // Subscribe to state changes
16
+ const unsubState = client.onStateChange((nextState) => {
17
+ if (mounted) {
18
+ setState(nextState);
19
+ }
20
+ });
21
+ const unsubConnection = client.onConnectionStateChange((nextState) => {
22
+ if (mounted) {
23
+ setConnectionState(nextState);
24
+ }
25
+ });
26
+ const unsubEvents = client.onEvent((event) => {
27
+ if (!mounted) {
28
+ return;
29
+ }
30
+ switch (event.type) {
31
+ case "syncComplete": {
32
+ lastSyncIdRef.current = event.lastSyncId;
33
+ break;
34
+ }
35
+ case "stateChange": {
36
+ if (event.state !== "error") {
37
+ setError(null);
38
+ }
39
+ break;
40
+ }
41
+ case "syncError": {
42
+ setError(event.error);
43
+ break;
44
+ }
45
+ case "outboxChange": {
46
+ setBacklog(event.pendingCount);
47
+ break;
48
+ }
49
+ default: {
50
+ break;
51
+ }
52
+ }
53
+ });
54
+ // Sync initial state
55
+ setState(client.state);
56
+ setConnectionState(client.connectionState);
57
+ lastSyncIdRef.current = client.lastSyncId;
58
+ setError(client.lastError ?? null);
59
+ (async () => {
60
+ try {
61
+ const count = await client.getPendingCount();
62
+ if (mounted) {
63
+ setBacklog(count);
64
+ }
65
+ }
66
+ catch {
67
+ // Storage may not be open yet; backlog will update via outboxChange event
68
+ }
69
+ })();
70
+ if (autoStart) {
71
+ const startClient = async () => {
72
+ try {
73
+ await client.start();
74
+ }
75
+ catch (startError) {
76
+ if (mounted) {
77
+ setError(startError instanceof Error
78
+ ? startError
79
+ : new Error(String(startError)));
80
+ }
81
+ }
82
+ };
83
+ startClient();
84
+ }
85
+ return () => {
86
+ mounted = false;
87
+ unsubState();
88
+ unsubConnection();
89
+ unsubEvents();
90
+ if (autoStop) {
91
+ // oxlint-disable-next-line prefer-await-to-then -- fire-and-forget pattern
92
+ client.stop().catch(() => {
93
+ /* noop */
94
+ });
95
+ }
96
+ };
97
+ }, [client, autoStart, autoStop]);
98
+ const statusValue = useMemo(() => ({
99
+ clientId: client.clientId,
100
+ connectionState,
101
+ error,
102
+ isOffline: connectionState === "disconnected",
103
+ isReady: state === "syncing",
104
+ isSyncing: state === "syncing" || state === "bootstrapping",
105
+ get lastSyncId() {
106
+ return lastSyncIdRef.current;
107
+ },
108
+ state,
109
+ }), [state, connectionState, error, client.clientId]);
110
+ const value = useMemo(() => ({
111
+ backlog,
112
+ client,
113
+ ...statusValue,
114
+ }), [client, backlog, statusValue]);
115
+ return (_jsx(SyncClientContext.Provider, { value: client, children: _jsx(SyncStatusContext.Provider, { value: statusValue, children: _jsx(SyncBacklogContext.Provider, { value: backlog, children: _jsx(SyncContext.Provider, { value: value, children: children }) }) }) }));
116
+ };
117
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { QueryOptions, SyncClient } from "@stratasync/client";
2
+ import type { ConnectionState, SyncClientState, SyncId } from "@stratasync/core";
3
+ /**
4
+ * Sync provider props
5
+ */
6
+ export interface SyncProviderProps {
7
+ /** Sync client instance */
8
+ client: SyncClient;
9
+ /** Children to render */
10
+ children: React.ReactNode;
11
+ /** Automatically start the client */
12
+ autoStart?: boolean;
13
+ /** Automatically stop the client on unmount */
14
+ autoStop?: boolean;
15
+ }
16
+ /**
17
+ * Sync status context value (excluding pending backlog)
18
+ */
19
+ export interface SyncStatusContextValue {
20
+ /** Current sync state */
21
+ state: SyncClientState;
22
+ /** Current connection state */
23
+ connectionState: ConnectionState;
24
+ /** Last sync ID received */
25
+ lastSyncId: SyncId;
26
+ /** Last sync error */
27
+ error: Error | null;
28
+ /** Whether the client is ready */
29
+ isReady: boolean;
30
+ /** Whether the client is syncing */
31
+ isSyncing: boolean;
32
+ /** Whether the client is offline */
33
+ isOffline: boolean;
34
+ /** Client ID */
35
+ clientId: string;
36
+ }
37
+ /**
38
+ * Full sync context value
39
+ */
40
+ export interface SyncContextValue extends SyncStatusContextValue {
41
+ /** Sync client instance */
42
+ client: SyncClient;
43
+ /** Count of pending transactions */
44
+ backlog: number;
45
+ }
46
+ /**
47
+ * Use model hook result
48
+ */
49
+ export interface UseModelResult<T> {
50
+ /** Model data */
51
+ data: T | null;
52
+ /** Whether the model is loading */
53
+ isLoading: boolean;
54
+ /** Whether the model was found */
55
+ isFound: boolean;
56
+ /** Any error that occurred */
57
+ error: Error | null;
58
+ /** Refresh the model */
59
+ refresh: () => Promise<void>;
60
+ }
61
+ /**
62
+ * Use query hook options
63
+ */
64
+ export interface UseQueryOptions<T> extends QueryOptions<T> {
65
+ /** Skip the query (useful for conditional fetching) */
66
+ skip?: boolean;
67
+ }
68
+ /**
69
+ * Use query hook result
70
+ */
71
+ export interface UseQueryResult<T> {
72
+ /** Query results */
73
+ data: T[];
74
+ /** Whether the query is loading */
75
+ isLoading: boolean;
76
+ /** Any error that occurred */
77
+ error: Error | null;
78
+ /** Total count (if available) */
79
+ totalCount?: number;
80
+ /** Whether more results are available */
81
+ hasMore: boolean;
82
+ /** Refresh the query */
83
+ refresh: () => Promise<void>;
84
+ }
85
+ /**
86
+ * Use connection state hook result
87
+ */
88
+ export interface UseConnectionStateResult {
89
+ /** Current sync status */
90
+ status: SyncClientState;
91
+ /** Last sync ID received */
92
+ lastSyncId: SyncId;
93
+ /** Pending outbox count */
94
+ backlog: number;
95
+ /** Last sync error */
96
+ error: Error | null;
97
+ }
98
+ /**
99
+ * Use pending count hook result
100
+ */
101
+ export interface UsePendingCountResult {
102
+ /** Number of pending transactions */
103
+ count: number;
104
+ /** Whether there are pending transactions */
105
+ hasPending: boolean;
106
+ }
107
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,MAAM,EACP,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,2BAA2B;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,yBAAyB;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,+BAA+B;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,sBAAsB;IAC9D,2BAA2B;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,iBAAiB;IACjB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,wBAAwB;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACzD,uDAAuD;IACvD,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,oBAAoB;IACpB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,wBAAwB;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,MAAM,EAAE,eAAe,CAAC;IACxB,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,UAAU,EAAE,OAAO,CAAC;CACrB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@stratasync/react",
3
+ "version": "0.2.0",
4
+ "files": [
5
+ "dist"
6
+ ],
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.build.json",
21
+ "dev": "tsc --watch -p tsconfig.build.json",
22
+ "lint": "oxlint .",
23
+ "lint:fix": "oxlint --fix .",
24
+ "format": "oxfmt --write .",
25
+ "format:check": "oxfmt --check .",
26
+ "check-types": "tsc --noEmit",
27
+ "test": "vitest"
28
+ },
29
+ "dependencies": {
30
+ "@stratasync/client": "*",
31
+ "@stratasync/core": "*"
32
+ },
33
+ "devDependencies": {
34
+ "@testing-library/react": "^16.3.2",
35
+ "@types/react": "^19.2.14",
36
+ "@types/react-dom": "^19.2.3",
37
+ "jsdom": "^29.0.0",
38
+ "lefthook": "^2.1.4",
39
+ "mobx": "^6.15.0",
40
+ "mobx-react-lite": "^4.1.1",
41
+ "oxfmt": "^0.41.0",
42
+ "oxlint": "^1.56.0",
43
+ "react": "^19.2.4",
44
+ "react-dom": "^19.2.4",
45
+ "typescript": "^5.9.3",
46
+ "ultracite": "^7.3.2",
47
+ "vitest": "^4.1.0"
48
+ },
49
+ "peerDependencies": {
50
+ "react": "^18.0.0 || ^19.0.0",
51
+ "yjs": "^13.6.0"
52
+ }
53
+ }