@anfenn/dync 1.0.14 → 1.0.16

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.
@@ -21,6 +21,16 @@ function newLogger(base, min) {
21
21
  var SERVER_PK = "id";
22
22
  var LOCAL_PK = "_localId";
23
23
  var UPDATED_AT = "updated_at";
24
+ var ApiError = class extends Error {
25
+ isNetworkError;
26
+ cause;
27
+ constructor(message, isNetworkError2, cause) {
28
+ super(message);
29
+ this.name = "ApiError";
30
+ this.isNetworkError = isNetworkError2;
31
+ this.cause = cause;
32
+ }
33
+ };
24
34
  var SyncAction = /* @__PURE__ */ ((SyncAction2) => {
25
35
  SyncAction2["Create"] = "create";
26
36
  SyncAction2["Update"] = "update";
@@ -37,6 +47,36 @@ function createLocalId() {
37
47
  }
38
48
 
39
49
  // src/helpers.ts
50
+ function parseApiError(error) {
51
+ if (error instanceof ApiError) {
52
+ return error;
53
+ }
54
+ if (typeof error === "string") {
55
+ return new ApiError(error, false);
56
+ }
57
+ return new ApiError(error.message, isNetworkError(error), error);
58
+ }
59
+ function isNetworkError(error) {
60
+ const message = error.message?.toLowerCase() ?? "";
61
+ const name = error.name;
62
+ if (name === "TypeError" && (message.includes("failed to fetch") || message.includes("network request failed"))) {
63
+ return true;
64
+ }
65
+ const code = error.code;
66
+ if (code === "ERR_NETWORK" || code === "ECONNABORTED" || code === "ENOTFOUND" || code === "ECONNREFUSED") {
67
+ return true;
68
+ }
69
+ if (error.isAxiosError && error.response === void 0) {
70
+ return true;
71
+ }
72
+ if (name === "ApolloError" && error.networkError) {
73
+ return true;
74
+ }
75
+ if (message.includes("network error") || message.includes("networkerror")) {
76
+ return true;
77
+ }
78
+ return false;
79
+ }
40
80
  function sleep(ms, signal) {
41
81
  return new Promise((resolve) => {
42
82
  if (signal?.aborted) {
@@ -102,6 +142,7 @@ var DEFAULT_STATE = {
102
142
  var StateManager = class {
103
143
  persistedState;
104
144
  syncStatus;
145
+ apiError;
105
146
  listeners = /* @__PURE__ */ new Set();
106
147
  storageAdapter;
107
148
  hydrated = false;
@@ -142,12 +183,8 @@ var StateManager = class {
142
183
  this.persistedState = resolveNextState(this.persistedState, setterOrState);
143
184
  return this.persist();
144
185
  }
145
- /**
146
- * Set error in memory only without persisting to database.
147
- * Used when the database itself failed to open.
148
- */
149
- setErrorInMemory(error) {
150
- this.persistedState = { ...this.persistedState, error };
186
+ setApiError(error) {
187
+ this.apiError = error ? parseApiError(error) : void 0;
151
188
  this.emit();
152
189
  }
153
190
  addPendingChange(change) {
@@ -227,7 +264,7 @@ var StateManager = class {
227
264
  this.emit();
228
265
  }
229
266
  getSyncState() {
230
- return buildSyncState(this.persistedState, this.syncStatus, this.hydrated);
267
+ return buildSyncState(this.persistedState, this.syncStatus, this.hydrated, this.apiError);
231
268
  }
232
269
  subscribe(listener) {
233
270
  this.listeners.add(listener);
@@ -250,12 +287,13 @@ function resolveNextState(current, setterOrState) {
250
287
  }
251
288
  return { ...current, ...setterOrState };
252
289
  }
253
- function buildSyncState(state, status, hydrated) {
290
+ function buildSyncState(state, status, hydrated, apiError) {
254
291
  const persisted = clonePersistedState(state);
255
292
  const syncState = {
256
293
  ...persisted,
257
294
  status,
258
- hydrated
295
+ hydrated,
296
+ apiError
259
297
  };
260
298
  deleteKeyIfEmptyObject(syncState, "conflicts");
261
299
  return syncState;
@@ -1463,10 +1501,7 @@ var DyncBase = class {
1463
1501
  this.emitMutation({ type: "pull", tableName });
1464
1502
  }
1465
1503
  this.syncStatus = "idle";
1466
- await this.state.setState((syncState) => ({
1467
- ...syncState,
1468
- error: pullResult.error ?? firstPushSyncError
1469
- }));
1504
+ this.state.setApiError(pullResult.error ?? firstPushSyncError);
1470
1505
  if (this.mutationsDuringSync) {
1471
1506
  this.mutationsDuringSync = false;
1472
1507
  this.syncOnce().catch(() => {
@@ -3771,4 +3806,4 @@ export {
3771
3806
  SqliteQueryContext,
3772
3807
  SQLiteAdapter2 as SQLiteAdapter
3773
3808
  };
3774
- //# sourceMappingURL=chunk-6B5N26W3.js.map
3809
+ //# sourceMappingURL=chunk-NJF2KCLA.js.map