@prestizni-software/server-dem 0.6.5 → 0.6.7

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 (38) hide show
  1. package/dist/AutoUpdateServerManagerClass.d.ts +6 -1
  2. package/dist/AutoUpdateServerManagerClass.js +120 -1
  3. package/dist/AutoUpdateServerManagerClass.js.map +1 -1
  4. package/dist/AutoUpdatedServerObjectClass.d.ts +8 -0
  5. package/dist/AutoUpdatedServerObjectClass.js +31 -0
  6. package/dist/AutoUpdatedServerObjectClass.js.map +1 -1
  7. package/dist/CommonTypes.d.ts +7 -1
  8. package/dist/CommonTypes.js +7 -0
  9. package/dist/CommonTypes.js.map +1 -1
  10. package/dist/server.d.ts +1 -0
  11. package/dist/server.js +1 -0
  12. package/dist/server.js.map +1 -1
  13. package/dist/sync/ClientStateReconciler.d.ts +41 -0
  14. package/dist/sync/ClientStateReconciler.js +162 -0
  15. package/dist/sync/ClientStateReconciler.js.map +1 -0
  16. package/dist/sync/ServerChangeTracker.d.ts +50 -0
  17. package/dist/sync/ServerChangeTracker.js +181 -0
  18. package/dist/sync/ServerChangeTracker.js.map +1 -0
  19. package/dist/sync/index.d.ts +7 -0
  20. package/dist/sync/index.js +8 -0
  21. package/dist/sync/index.js.map +1 -0
  22. package/dist/sync/storage/IClientStorageAdapter.d.ts +23 -0
  23. package/dist/sync/storage/IClientStorageAdapter.js +2 -0
  24. package/dist/sync/storage/IClientStorageAdapter.js.map +1 -0
  25. package/dist/sync/storage/IndexedDbStorageAdapter.d.ts +22 -0
  26. package/dist/sync/storage/IndexedDbStorageAdapter.js +125 -0
  27. package/dist/sync/storage/IndexedDbStorageAdapter.js.map +1 -0
  28. package/dist/sync/storage/LocalStorageAdapter.d.ts +27 -0
  29. package/dist/sync/storage/LocalStorageAdapter.js +85 -0
  30. package/dist/sync/storage/LocalStorageAdapter.js.map +1 -0
  31. package/dist/sync/storage/MemoryStorageAdapter.d.ts +13 -0
  32. package/dist/sync/storage/MemoryStorageAdapter.js +25 -0
  33. package/dist/sync/storage/MemoryStorageAdapter.js.map +1 -0
  34. package/dist/sync/types.d.ts +67 -0
  35. package/dist/sync/types.js +5 -0
  36. package/dist/sync/types.js.map +1 -0
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +2 -2
@@ -0,0 +1,85 @@
1
+ /**
2
+ * LocalStorage client storage adapter.
3
+ * Works with browser window.localStorage or mock storage in tests/Node.js.
4
+ */
5
+ export class LocalStorageAdapter {
6
+ prefix;
7
+ storageBackend = null;
8
+ constructor(options) {
9
+ this.prefix = options?.prefix ?? "dem_state_";
10
+ if (options?.storage) {
11
+ this.storageBackend = options.storage;
12
+ }
13
+ else if (typeof window !== "undefined" && window.localStorage) {
14
+ this.storageBackend = window.localStorage;
15
+ }
16
+ else if (typeof globalThis !== "undefined" && globalThis.localStorage) {
17
+ this.storageBackend = globalThis.localStorage;
18
+ }
19
+ }
20
+ getKey(className) {
21
+ return `${this.prefix}${className}`;
22
+ }
23
+ async saveManagerState(className, state) {
24
+ if (!this.storageBackend) {
25
+ return;
26
+ }
27
+ try {
28
+ const serialized = JSON.stringify(state);
29
+ this.storageBackend.setItem(this.getKey(className), serialized);
30
+ }
31
+ catch {
32
+ // Ignore quota exceeded or storage failure gracefully
33
+ }
34
+ }
35
+ async loadManagerState(className) {
36
+ if (!this.storageBackend) {
37
+ return null;
38
+ }
39
+ try {
40
+ const raw = this.storageBackend.getItem(this.getKey(className));
41
+ if (!raw)
42
+ return null;
43
+ const parsed = JSON.parse(raw);
44
+ if (parsed && typeof parsed.revision === "number" && Array.isArray(parsed.ids)) {
45
+ return parsed;
46
+ }
47
+ return null;
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ async clearManagerState(className) {
54
+ if (!this.storageBackend)
55
+ return;
56
+ try {
57
+ this.storageBackend.removeItem(this.getKey(className));
58
+ }
59
+ catch {
60
+ // Ignore
61
+ }
62
+ }
63
+ async clearAll() {
64
+ if (!this.storageBackend)
65
+ return;
66
+ try {
67
+ if (typeof this.storageBackend.length === "number" && typeof this.storageBackend.key === "function") {
68
+ const keysToRemove = [];
69
+ for (let i = 0; i < this.storageBackend.length; i++) {
70
+ const key = this.storageBackend.key(i);
71
+ if (key && key.startsWith(this.prefix)) {
72
+ keysToRemove.push(key);
73
+ }
74
+ }
75
+ for (const key of keysToRemove) {
76
+ this.storageBackend.removeItem(key);
77
+ }
78
+ }
79
+ }
80
+ catch {
81
+ // Ignore
82
+ }
83
+ }
84
+ }
85
+ //# sourceMappingURL=LocalStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorageAdapter.js","sourceRoot":"","sources":["../../../sync/storage/LocalStorageAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { StoredManagerState } from "../types.js";
2
+ import { IClientStorageAdapter } from "./IClientStorageAdapter.js";
3
+ /**
4
+ * In-memory client storage adapter.
5
+ * Useful for keeping state between socket reconnections in Node.js or short-lived sessions.
6
+ */
7
+ export declare class MemoryStorageAdapter implements IClientStorageAdapter {
8
+ private store;
9
+ saveManagerState<T = unknown>(className: string, state: StoredManagerState<T>): Promise<void>;
10
+ loadManagerState<T = unknown>(className: string): Promise<StoredManagerState<T> | null>;
11
+ clearManagerState(className: string): Promise<void>;
12
+ clearAll(): Promise<void>;
13
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * In-memory client storage adapter.
3
+ * Useful for keeping state between socket reconnections in Node.js or short-lived sessions.
4
+ */
5
+ export class MemoryStorageAdapter {
6
+ store = new Map();
7
+ async saveManagerState(className, state) {
8
+ // Clone state to prevent external mutations from modifying stored snapshot
9
+ const cloned = JSON.parse(JSON.stringify(state));
10
+ this.store.set(className, cloned);
11
+ }
12
+ async loadManagerState(className) {
13
+ const state = this.store.get(className);
14
+ if (!state)
15
+ return null;
16
+ return JSON.parse(JSON.stringify(state));
17
+ }
18
+ async clearManagerState(className) {
19
+ this.store.delete(className);
20
+ }
21
+ async clearAll() {
22
+ this.store.clear();
23
+ }
24
+ }
25
+ //# sourceMappingURL=MemoryStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorageAdapter.js","sourceRoot":"","sources":["../../../sync/storage/MemoryStorageAdapter.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEpD,KAAK,CAAC,gBAAgB,CAC3B,SAAiB,EACjB,KAA4B;QAE5B,2EAA2E;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,SAAiB;QAEjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAA0B,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QAC9C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Core types and interfaces for DEM Delta Synchronization & Change Tracking.
3
+ */
4
+ export type ChangeType = "create" | "update" | "delete";
5
+ export interface ChangeEntry<T = unknown> {
6
+ revision: number;
7
+ type: ChangeType;
8
+ id: string;
9
+ data?: Partial<T>;
10
+ timestamp: number;
11
+ estimatedBytes: number;
12
+ }
13
+ export type PruneMode = "either" | "both";
14
+ export interface ChangeLogOptions {
15
+ /**
16
+ * Maximum age of entries in milliseconds (TTL).
17
+ * E.g. 7 * 24 * 60 * 60 * 1000 for 7 days.
18
+ */
19
+ maxAgeMs?: number;
20
+ /**
21
+ * Maximum estimated size of all entries combined in bytes.
22
+ * E.g. 10 * 1024 * 1024 for 10 MB.
23
+ */
24
+ maxSizeBytes?: number;
25
+ /**
26
+ * Maximum number of entries to retain.
27
+ */
28
+ maxEntries?: number;
29
+ /**
30
+ * Pruning policy when both conditions are specified:
31
+ * - 'either': prune if entry exceeds maxAge OR total size exceeds maxSizeBytes (default)
32
+ * - 'both': prune only if BOTH conditions are violated
33
+ */
34
+ pruneMode?: PruneMode;
35
+ }
36
+ export interface DeltaSyncPayload<T = unknown> {
37
+ status: "up-to-date" | "delta" | "full";
38
+ revision: number;
39
+ changes?: ChangeEntry<T>[];
40
+ ids?: string[];
41
+ objects?: T[];
42
+ properties?: string[];
43
+ }
44
+ export interface StoredManagerState<T = unknown> {
45
+ className: string;
46
+ revision: number;
47
+ ids: string[];
48
+ objects: T[];
49
+ properties: string[];
50
+ savedAt: number;
51
+ }
52
+ export interface ClientDeltaSyncOptions {
53
+ /**
54
+ * The storage adapter instance to use for client caching and offline persistence.
55
+ */
56
+ storage?: import("./storage/IClientStorageAdapter.js").IClientStorageAdapter;
57
+ /**
58
+ * Optional custom identifier for cache namespace.
59
+ */
60
+ cacheKeyPrefix?: string;
61
+ }
62
+ export interface ServerDeltaSyncOptions extends ChangeLogOptions {
63
+ /**
64
+ * Set to false to disable change tracking on the server manager.
65
+ */
66
+ enabled?: boolean;
67
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core types and interfaces for DEM Delta Synchronization & Change Tracking.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../sync/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}