@stratasync/transport-graphql 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.
package/dist/utils.js ADDED
@@ -0,0 +1,180 @@
1
+ import { DEFAULT_RETRY_CONFIG } from "./types.js";
2
+ /**
3
+ * Delays execution for a specified duration
4
+ */
5
+ const delay = (ms) =>
6
+ // oxlint-disable-next-line avoid-new -- wrapping callback API in promise
7
+ new Promise((resolve) => {
8
+ setTimeout(resolve, ms);
9
+ });
10
+ /**
11
+ * Calculates the delay for exponential backoff with jitter
12
+ */
13
+ export const calculateBackoff = (attempt, config) => {
14
+ const exponentialDelay = config.baseDelay * 2 ** attempt;
15
+ const clampedDelay = Math.min(exponentialDelay, config.maxDelay);
16
+ // Add jitter
17
+ const jitter = config.jitter ?? 0;
18
+ if (jitter > 0) {
19
+ const jitterAmount = clampedDelay * jitter;
20
+ return clampedDelay + (Math.random() * 2 - 1) * jitterAmount;
21
+ }
22
+ return clampedDelay;
23
+ };
24
+ /**
25
+ * Retries an async function with exponential backoff
26
+ */
27
+ export const retryWithBackoff = async (fn, config = DEFAULT_RETRY_CONFIG, shouldRetry = () => true) => {
28
+ let lastError;
29
+ for (let attempt = 0; attempt <= config.maxRetries; attempt += 1) {
30
+ try {
31
+ return await fn();
32
+ }
33
+ catch (error) {
34
+ lastError = error;
35
+ if (attempt >= config.maxRetries || !shouldRetry(error)) {
36
+ throw error;
37
+ }
38
+ const backoffDelay = calculateBackoff(attempt, config);
39
+ await delay(backoffDelay);
40
+ }
41
+ }
42
+ // oxlint-disable-next-line no-throw-literal
43
+ throw lastError;
44
+ };
45
+ /**
46
+ * Creates an AbortController with a timeout
47
+ */
48
+ const createTimeoutController = (timeoutMs) => {
49
+ const controller = new AbortController();
50
+ const timeoutId = setTimeout(() => controller.abort(new Error(`Request timed out after ${timeoutMs}ms`)), timeoutMs);
51
+ return {
52
+ cleanup: () => clearTimeout(timeoutId),
53
+ controller,
54
+ };
55
+ };
56
+ /**
57
+ * Wraps a fetch call with timeout support
58
+ */
59
+ const fetchWithTimeout = async (url, options, timeoutMs) => {
60
+ const { controller, cleanup } = createTimeoutController(timeoutMs);
61
+ try {
62
+ const response = await fetch(url, {
63
+ ...options,
64
+ signal: controller.signal,
65
+ });
66
+ return response;
67
+ }
68
+ finally {
69
+ cleanup();
70
+ }
71
+ };
72
+ /**
73
+ * Builds request headers with auth token, accept, content-type, and custom headers
74
+ */
75
+ export const buildRequestHeaders = (opts) => {
76
+ const result = {};
77
+ if (opts.accept) {
78
+ result.Accept = opts.accept;
79
+ }
80
+ if (opts.contentType) {
81
+ result["Content-Type"] = opts.contentType;
82
+ }
83
+ if (opts.headers) {
84
+ Object.assign(result, opts.headers);
85
+ }
86
+ if (opts.token) {
87
+ result.Authorization = `Bearer ${opts.token}`;
88
+ }
89
+ return result;
90
+ };
91
+ /**
92
+ * HTTP error with status code for robust error classification
93
+ */
94
+ export class HttpError extends Error {
95
+ status;
96
+ constructor(status, message) {
97
+ super(message);
98
+ this.name = "HttpError";
99
+ this.status = status;
100
+ }
101
+ }
102
+ /**
103
+ * Fetches a URL with optional timeout and checks for a successful response
104
+ */
105
+ export const fetchChecked = async (url, init, timeoutMs, errorPrefix) => {
106
+ const res = timeoutMs
107
+ ? await fetchWithTimeout(url, init, timeoutMs)
108
+ : await fetch(url, init);
109
+ if (!res.ok) {
110
+ const text = await res.text();
111
+ throw new HttpError(res.status, `${errorPrefix}: ${res.status} ${text}`);
112
+ }
113
+ return res;
114
+ };
115
+ /**
116
+ * Checks if an error is a network error
117
+ */
118
+ export const isNetworkError = (error) => {
119
+ if (error instanceof Error) {
120
+ return (error.name === "TypeError" ||
121
+ error.message.includes("network") ||
122
+ error.message.includes("fetch") ||
123
+ error.message.includes("ECONNREFUSED") ||
124
+ error.message.includes("ETIMEDOUT") ||
125
+ error.message.includes("ENETUNREACH"));
126
+ }
127
+ return false;
128
+ };
129
+ /**
130
+ * Checks if an error is a timeout error
131
+ */
132
+ export const isTimeoutError = (error) => {
133
+ if (error instanceof Error) {
134
+ return (error.name === "AbortError" ||
135
+ error.message.includes("timeout") ||
136
+ error.message.includes("aborted"));
137
+ }
138
+ return false;
139
+ };
140
+ const RETRYABLE_STATUS_RE = /\b(500|502|503|504|429)\b/;
141
+ /**
142
+ * Checks if an error is retryable
143
+ */
144
+ export const isRetryableError = (error) => {
145
+ if (isNetworkError(error) || isTimeoutError(error)) {
146
+ return true;
147
+ }
148
+ if (error instanceof HttpError) {
149
+ return error.status >= 500 || error.status === 429;
150
+ }
151
+ // Fallback: string matching for errors not thrown by fetchChecked
152
+ if (error instanceof Error && RETRYABLE_STATUS_RE.test(error.message)) {
153
+ return true;
154
+ }
155
+ return false;
156
+ };
157
+ const SYNC_ID_RE = /^\d+$/;
158
+ /**
159
+ * Validates a string-encoded sync ID.
160
+ */
161
+ export const parseSyncId = (value, fieldName = "syncId") => {
162
+ if (typeof value !== "string") {
163
+ throw new TypeError(`${fieldName} must be a string`);
164
+ }
165
+ if (!SYNC_ID_RE.test(value)) {
166
+ throw new TypeError(`${fieldName} must be a string-encoded integer`);
167
+ }
168
+ return value;
169
+ };
170
+ /**
171
+ * Resolves an auth token, falling back to refreshToken if available
172
+ */
173
+ export const resolveAuthToken = async (auth) => {
174
+ let token = await auth.getAccessToken();
175
+ if (!token && auth.refreshToken) {
176
+ token = await auth.refreshToken();
177
+ }
178
+ return token;
179
+ };
180
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import type { ConnectionState, DeltaSubscription, SubscribeOptions } from "@stratasync/core";
2
+ import type { AuthProvider, RetryConfig } from "./types.js";
3
+ /**
4
+ * WebSocket connection manager for delta streaming
5
+ */
6
+ export declare class WebSocketManager {
7
+ private socket;
8
+ private connectPromise;
9
+ private readonly wsEndpoint;
10
+ private readonly auth;
11
+ private readonly webSocketFactory;
12
+ private connectionState;
13
+ private readonly stateListeners;
14
+ private subscribedReady;
15
+ private readonly subscribeStateListeners;
16
+ private readonly subscriptions;
17
+ private readonly yjsMessageCallbacks;
18
+ private readonly pendingMessages;
19
+ private reconnectAttempts;
20
+ private reconnectTimer;
21
+ private subscribeRetryAttempts;
22
+ private subscribeRetryTimer;
23
+ private readonly retryConfig;
24
+ private shouldReconnect;
25
+ constructor(wsEndpoint: string, auth: AuthProvider, retryConfig: RetryConfig, webSocketFactory?: typeof WebSocket);
26
+ /**
27
+ * Connects to the WebSocket server
28
+ */
29
+ connect(): Promise<void>;
30
+ /**
31
+ * Subscribes to delta updates
32
+ */
33
+ subscribe(options: SubscribeOptions): DeltaSubscription;
34
+ /**
35
+ * Gets the current connection state
36
+ */
37
+ getConnectionState(): ConnectionState;
38
+ /**
39
+ * Registers a callback for connection state changes
40
+ */
41
+ onConnectionStateChange(callback: (state: ConnectionState) => void): () => void;
42
+ /**
43
+ * Gets whether the server has acknowledged subscriptions for this socket.
44
+ */
45
+ isSubscribedReady(): boolean;
46
+ /**
47
+ * Registers a callback for subscription-readiness changes.
48
+ */
49
+ onSubscribeStateChange(callback: (ready: boolean) => void): () => void;
50
+ /**
51
+ * Registers a callback for Yjs/live-editing messages.
52
+ */
53
+ onYjsMessage(callback: (message: unknown) => void): () => void;
54
+ /**
55
+ * Sends a raw payload over the WebSocket (queues until subscribed).
56
+ */
57
+ sendRaw(payload: string): void;
58
+ /**
59
+ * Closes the WebSocket connection
60
+ */
61
+ close(): Promise<void>;
62
+ private setConnectionState;
63
+ private setSubscribedReady;
64
+ private scheduleReconnect;
65
+ private scheduleSubscribeRetry;
66
+ private flushSubscriptions;
67
+ private flushPendingMessages;
68
+ private sendSubscribe;
69
+ private handleMessage;
70
+ private emitYjsMessage;
71
+ private static isLiveEditingMessage;
72
+ private static isSubscribedAckMessage;
73
+ private static isSubscribeErrorMessage;
74
+ }
75
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EAEf,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAW5D;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+C;IAC9E,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAEpC;IACJ,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgC;IAC9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyC;IAC7E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,eAAe,CAAQ;gBAG7B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,YAAY,EAClB,WAAW,EAAE,WAAW,EACxB,gBAAgB,CAAC,EAAE,OAAO,SAAS;IAYrC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmF9B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,iBAAiB;IAkEvD;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,uBAAuB,CAErB,QAAQ,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GACzC,MAAM,IAAI;IAOb;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IAEH,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAStE;;OAEG;IAEH,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9D;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAa9B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,sBAAsB;YAwChB,kBAAkB;IAUhC,OAAO,CAAC,oBAAoB;YAsCd,aAAa;YAwCb,aAAa;IA4D3B,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAkBnC,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAQrC,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAMvC"}