@pluv/addon-indexeddb 5.0.0 → 5.0.2

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/index.d.mts CHANGED
@@ -1,23 +1,11 @@
1
1
  import { PluvRoom, PluvRoomAddon } from "@pluv/client";
2
2
  import { AbstractCrdtDocFactory } from "@pluv/crdt";
3
-
4
3
  //#region ../../node_modules/.pnpm/wonka@6.3.6/node_modules/wonka/dist/wonka.d.ts
5
4
  declare global {
6
5
  interface SymbolConstructor {
7
6
  readonly observable: symbol;
8
7
  }
9
8
  }
10
- /** A definition of the ES Observable Subscription type that is returned by
11
- * {@link Observable.subscribe}
12
- *
13
- * @remarks
14
- * The Subscription in ES Observables is a handle that is held while the Observable is actively
15
- * streaming values. As such, it's used to indicate with {@link ObservableSubscription.closed}
16
- * whether it's active, and {@link ObservableSubscription.unsubscribe} may be used to cancel the
17
- * ongoing subscription and end the {@link Observable} early.
18
- *
19
- * @see {@link https://github.com/tc39/proposal-observable} for the ES Observable specification.
20
- */
21
9
  //#endregion
22
10
  //#region ../types/dist/index.d.mts
23
11
  type Maybe<T> = T | Nil;
@@ -44,7 +32,7 @@ interface CrdtLibraryType<TDoc extends CrdtDocFactory<any, any> = CrdtDocFactory
44
32
  type CrdtType<TValue extends unknown, TJson extends unknown = any> = Omit<TValue, "__pluvType"> & {
45
33
  __pluvType: () => TJson;
46
34
  };
47
- type InferCrdtJson<T extends unknown> = T extends CrdtType<any, infer IJson> ? InferCrdtJson<IJson> : T extends Record<string, any> ? { [P in keyof T]: InferCrdtJson<T[P]> } : T extends (infer IJson)[] ? InferCrdtJson<IJson>[] : T extends readonly (infer IJson)[] ? readonly InferCrdtJson<IJson>[] : T extends Json ? T : string;
35
+ type InferCrdtJson<T extends unknown> = T extends CrdtType<any, infer IJson> ? InferCrdtJson<IJson> : T extends Record<string, any> ? { [P in keyof T]: InferCrdtJson<T[P]>; } : T extends (infer IJson)[] ? InferCrdtJson<IJson>[] : T extends readonly (infer IJson)[] ? readonly InferCrdtJson<IJson>[] : T extends Json ? T : string;
48
36
  interface DocApplyEncodedStateParams {
49
37
  origin?: string;
50
38
  update?: Maybe<string | Uint8Array>;
@@ -78,14 +66,13 @@ interface CrdtDocLike<TDoc extends any, TStorage extends Record<string, CrdtType
78
66
  track(): this;
79
67
  transact(fn: () => void, origin?: string): this;
80
68
  undo(): this;
81
- } //#endregion
82
- //#region src/pluv/enums.d.ts
69
+ }
83
70
  //#endregion
84
71
  //#region src/pluv/shared.d.ts
85
72
  type BaseUser = {
86
73
  id: string;
87
74
  };
88
- type EventRecord<TEvent extends string, TData extends JsonObject> = { [key in `${TEvent}`]: TData };
75
+ type EventRecord<TEvent extends string, TData extends JsonObject> = { [key in `${TEvent}`]: TData; };
89
76
  type InputZodLike<TData extends JsonObject> = {
90
77
  parse: (data: unknown) => TData;
91
78
  } & ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":["Pull","Close","TalkbackKind","signal","Start","Push","End","T","tag","_T","Tag","SignalKind","TalkbackFn","Signal","Sink","sink","In","Out","Source","a","U","unsubscribe","next","value","complete","Observer","source","AsyncIterator","AsyncIterable","produce","iterable","Iterable","array","observer","TeardownFn","subscriber","Subject","ms","HTMLElement","element","event","Event","Promise","promise","S","notifier","Operator","map","sources","predicate","callback","acc","reducer","seed","wait","max","addOne","timing","Subscription","SourceIterable","Head","Tail","TypeOfSource","TypeOfSourceArray","Sources","prop","Property","Record","global","SymbolConstructor","observable","closed","error","subscribe","ObservableObserver","Symbol","Observable","ObservableSubscription","onNext","onError","onComplete","ObservableLike","input","I","O","t","Callbag","d","callbag","R","A","UnaryFn","op1","B","op2","C","op3","D","op4","E","op5","F","op6","G","op7","H","op8","consumer","pipe","args","T","K","Pick","Nil","Promise","P","L","R","Exclude","U","Constructable","Id","OptionalPropertyNames","SpreadProperties","A","SpreadTwo","Spread","Array","DeepPartial","ReadonlyArray","DeepWriteable","Record","Omit","Partial","NonNullable","JsonPrimitive","Json","key","arg","I","HasRequiredProperty","TDoc","TStorage","CrdtType","_initialStorage","builder","getEmpty","CrdtDocLike","getFactory","initialStorage","CrdtDocFactory","getInitialized","isEmpty","Maybe","doc","value","kind","TValue","TJson","__pluvType","IJson","InferCrdtJson","origin","update","Uint8Array","updates","local","applyEncodedState","DocApplyEncodedStateParams","params","batchApplyEncodedState","DocBatchApplyEncodedStateParams","canRedo","canUndo","destroy","get","TKey","getEncodedState","rebuildStorage","reference","redo","subscribe","DocSubscribeCallbackParams","listener","toJson","type","track","transact","fn","undo","Closed","Connecting","Open","Unavailable","Untouched","ConnectionState","Loading","Offline","Synced","StorageState","id","$getOthers","$initializeSession","presence","JsonObject","$ping","$updatePresence","$updateStorage","InferEventMessage","BaseClientEventRecord","TAuthorize","IOAuthorize","$error","message","stack","$exit","sessionId","$othersReceived","others","connectionId","room","timers","user","InferIOAuthorizeUser","$pong","$presenceUpdated","$registered","state","$storageReceived","changeKind","$storageUpdated","$syncStateReceived","connectionIds","$userJoined","TEvent","TData","data","EventRecord","EventMessage","TIO","IOLike","IAuthorize","BaseUser","InputZodLike","IUser","parse","_input","_zod","input","TUser","TContext","secret","context","InferIOAuthorize","TInput","TOutput","config","broadcast","MaybePromise","resolver","self","sync","TEvents","ProcedureLike","_defs","events","TCrdt","CrdtLibraryType","IORouterLike","authorize","crdt","ICrdt","IDoc","IEvents","InferIOProcedureInput","InferIOProcedureOutput","TProcedure","IInput","IOutput","UnionToIntersection","TRouter","InferEventsInput","InferEventsOutput","InferIOOutput","IOAuthorizeEventMessage","TClientEvents","PluvRouterEventConfig","TServerIO","IServerEvents","IClientInput","IClientOutput","token","TPresence","UserInfo","OtherSubscriptionCallback","callback","users","OthersSubscriptionEvent","event","OthersSubscriptionCallback","connection","Subject","WebSocketState","myself","Readonly","TSubject","StateNotifierSubjects","IValue","InferSubjectValue","oldPresence","attempts","authorization","AuthorizationState","WebSocketConnection","storage","StorageInfo","webSocket","WebSocket","InferIOInput","MergeEvents","PEvent","IOEventMessage","EventNotifierSubscriptionCallback","EventSubscriptionFn","StorageSubscriptionCallback","StorageRootSubscriptionCallback","StorageSubscriptionFn","StorageRootSubscriptionFn","PKey","name","SubscriptionCallback","SubscribeFn","EventProxy","myPresence","other","OtherSubscriptionFn","OthersSubscriptionFn","StorageProxy","storageLoaded","close","CloseEvent","error","Event","MessageEvent","open","BroadcastProxy","addEventListener","TKind","RoomEventListenerMap","handler","getDoc","getConnection","getMyPresence","getMyself","getOther","getOthers","getStorage","getStorageJson","getStorageLoaded","SubscribeProxy","updateMyPresence","UpdateMyPresenceAction"],"sources":["../../../node_modules/.pnpm/wonka@6.3.6/node_modules/wonka/dist/wonka.d.ts","../../types/dist/index.d.mts","../src/addonIndexedDB.ts"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../node_modules/.pnpm/wonka@6.3.6/node_modules/wonka/dist/wonka.d.ts","../../types/dist/index.d.mts","../src/addonIndexedDB.ts"],"x_google_ignoreList":[0],"mappings":";;;QAmuCQ;YACM;aACG;;;;;KC/tCZ,MAAM,KAAK,IAAI;KACf,aAAa,KAAK,QAAQ,KAAK;KAE/B;KAWA;KACA,OAAO,gBAAgB,kBAAkB;GAC3C,cAAc;;KAEZ,aAAa,eAAe;;;UAKvB,eAAe,kBAAkB,iBAAiB,eAAe;EACzE,kBAAkB,iBAAiB;EACnC,YAAY,YAAY,MAAM;EAC9B,WAAW,kBAAkB,iBAAiB,WAAW,eAAe,MAAM;EAC9E,eAAe,kBAAkB,iBAAiB,WAAW,YAAY,MAAM;EAC/E,QAAQ,gBAAgB;;UAEhB,gBAAgB,aAAa,2BAA2B;EAChE,MAAM,eAAe;EACrB;;KAEG,SAAS,wBAAwB,+BAA+B,KAAK;EACxE,kBAAkB;;KAEf,cAAc,qBAAqB,UAAU,oBAAoB,SAAS,cAAc,SAAS,UAAU,yBAAyB,WAAW,IAAI,cAAc,EAAE,SAAS,iBAAiB,WAAW,cAAc,WAAW,0BAA0B,oBAAoB,cAAc,WAAW,UAAU,OAAO;UACpT;EACR;EACA,SAAS,eAAe;;UAEhB;EACR;EACA,UAAU,eAAe,eAAe;;UAEhC,2BAA2B,kBAAkB,iBAAiB,eAAe;EACrF,KAAK,YAAY,MAAM;EACvB;EACA;EACA;;UAEQ,YAAY,kBAAkB,iBAAiB,eAAe;EACtE,OAAO;EACP,kBAAkB,QAAQ;EAC1B,uBAAuB,QAAQ;EAC/B;EACA;EACA;EACA,IAAI,kBAAkB;EACtB,IAAI,mBAAmB,UAAU,KAAK,OAAO,SAAS;EACtD;EACA;EACA,eAAe,WAAW;EAC1B;EACA,UAAU,WAAW,QAAQ,2BAA2B,MAAM;EAC9D,UAAU,cAAc;EACxB,OAAO,mBAAmB,UAAU,MAAM,OAAO,cAAc,SAAS;EACxE;EACA,SAAS,gBAAgB;EACzB;;;;KAqBG;EACH;;KA6EG,YAAY,uBAAuB,cAAc,iBAAiB,UAAU,WAAW;KAMvF,aAAa,cAAc;EAC9B,QAAQ,kBAAkB;;EAE1B,QAAQ;;EAER;IACE,OAAO;;;KAGN,YAAY,cAAc,uBAAuB,iBAAiB,iCAAiC,cAAc;EACpH;EACA,MAAM,aAAa;cACP,SAAS,aAAa,cAAc;EAChD;EACA,MAAM,aAAa;;KAMhB,cAAc,eAAe,0BAA0B,gBAAgB;EAC1E;IACE,cAAc,MAAM,WAAW,gBAAgB,aAAa,QAAQ;IACpE,QAAQ,aAAa;IACrB,WAAW,MAAM,WAAW,gBAAgB,aAAa;IACzD,SAAS,MAAM,WAAW,gBAAgB,aAAa,QAAQ;IAC/D,SAAS,MAAM,WAAW,gBAAgB,aAAa,QAAQ;;;UAGzD,aAAa,gBAAgB,eAAe;EACpD;IACE,QAAQ;;;UAGF,OAAO,mBAAmB,qCAAqC,cAAc,uBAAuB,sBAAsB,gBAAgB,eAAe,uCAAuC,aAAa;EACrN;IACE,WAAW;IACX,MAAM;IACN,QAAQ;;;;;UCtNK,qBACb,YAAY,uBACZ,kBAAkB,YAClB,kBAAkB,qBAClB,cAAc;EAEd,sBAAsB,MAAM,SAAS,KAAK,WAAW,WAAW;;cAGvD,iBACT,YAAY,uBACZ,kBAAkB,YAClB,kBAAkB,qBAClB,cAAc,kCAEd,SAAS,qBAAqB,KAAK,WAAW,WAAW,WAC1D,cAAc,KAAK,WAAW,WAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/IndexedDBStorage.ts","../src/addonIndexedDB.ts"],"sourcesContent":["import { AbstractStorageStore } from \"@pluv/client\";\nimport type { IDBPDatabase } from \"idb\";\nimport { openDB } from \"idb\";\n\nconst STORAGE_STORE_FLATTEN_THRESHOLD = 500;\nconst UPGRADES_KEY = \"__PLUV_UPDATES\";\n\ntype IndexDBSchema = {\n [UPGRADES_KEY]: {\n key: number;\n value: string;\n };\n};\n\ntype IndexedDB = IDBPDatabase<IndexDBSchema>;\n\nexport class IndexedDBStorage extends AbstractStorageStore {\n public room: string;\n\n private _db: IndexedDB | null = null;\n private _dbRef: number = 0;\n private _dbSize: number = 0;\n\n constructor(room: string) {\n super(room);\n\n this.room = room;\n }\n\n public async addUpdate(update: string): Promise<void> {\n const db = this._db;\n\n if (!db) return;\n\n await db.add(UPGRADES_KEY, update);\n\n this._dbSize += 1;\n }\n\n public destroy(): Promise<void> {\n if (!this._db) return Promise.resolve();\n\n this._db.close();\n this._db = null;\n this._dbRef = 0;\n this._dbSize = 0;\n\n return Promise.resolve();\n }\n\n public async flatten(encodedState: string): Promise<void> {\n const db = this._db;\n\n if (!db) return;\n\n await db.add(UPGRADES_KEY, encodedState);\n await db.delete(UPGRADES_KEY, this._getUpperBound(this._dbRef, true));\n\n this._dbSize = await this._getSize();\n }\n\n public async getShouldFlatten(): Promise<boolean> {\n const dbSize = await this._getSize();\n\n return dbSize >= STORAGE_STORE_FLATTEN_THRESHOLD;\n }\n\n public async getUpdates(start: number = 0): Promise<readonly string[]> {\n const db = this._db;\n\n if (!db) return [];\n\n const updates = await db.getAll(UPGRADES_KEY, this._getLowerBound(start));\n\n const lastKey = await this._getLastKey();\n\n this._dbRef = lastKey + 1;\n\n return updates;\n }\n\n public async initialize(): Promise<void> {\n const newDB = await openDB<IndexDBSchema>(this.room, undefined, {\n upgrade: (db) => {\n db.createObjectStore(UPGRADES_KEY, { autoIncrement: true });\n },\n });\n\n newDB.addEventListener(\"versionchange\", () => {\n newDB.close();\n });\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"unload\", () => {\n newDB.close();\n });\n }\n\n this._db = newDB;\n }\n\n private async _getLastKey(): Promise<number> {\n const db = this._db;\n\n if (!db) throw new Error(\"IndexedDB not initialized\");\n\n const store = db.transaction(UPGRADES_KEY).objectStore(UPGRADES_KEY);\n const cursor = await store.openCursor(null, \"prev\");\n\n return cursor?.key ?? -1;\n }\n\n private _getLowerBound(lower: number, open: boolean = false): IDBKeyRange {\n return IDBKeyRange.lowerBound(lower, open);\n }\n\n private async _getSize(): Promise<number> {\n if (this._dbSize) return this._dbSize;\n\n const db = this._db;\n\n if (!db) throw new Error(\"IndexedDB not initialized\");\n\n const store = db.transaction(UPGRADES_KEY).objectStore(UPGRADES_KEY);\n\n return store.count();\n }\n\n private _getUpperBound(upper: number, open: boolean = false): IDBKeyRange {\n return IDBKeyRange.upperBound(upper, open);\n }\n}\n","import type { PluvRoom, PluvRoomAddon } from \"@pluv/client\";\nimport type { AbstractCrdtDocFactory, CrdtType } from \"@pluv/crdt\";\nimport type { IOLike, JsonObject } from \"@pluv/types\";\nimport { IndexedDBStorage } from \"./IndexedDBStorage\";\n\nexport interface AddonIndexedDBConfig<\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject,\n TPresence extends Record<string, any>,\n TCrdt extends AbstractCrdtDocFactory<any, any>,\n> {\n enabled?: boolean | ((room: PluvRoom<TIO, TMetadata, TPresence, TCrdt>) => boolean);\n}\n\nexport const addonIndexedDB = <\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject,\n TPresence extends Record<string, any>,\n TCrdt extends AbstractCrdtDocFactory<any, any>,\n>(\n config?: AddonIndexedDBConfig<TIO, TMetadata, TPresence, TCrdt>,\n): PluvRoomAddon<TIO, TMetadata, TPresence, TCrdt> => {\n const { enabled = true } = config ?? {};\n\n return ({ room }) => {\n const _enabled = typeof enabled === \"boolean\" ? enabled : enabled(room);\n\n if (!_enabled) return {};\n\n return {\n storage: new IndexedDBStorage(room.id),\n };\n };\n};\n"],"mappings":";;;AAIA,MAAM,kCAAkC;AACxC,MAAM,eAAe;AAWrB,IAAa,mBAAb,cAAsC,qBAAqB;CAOvD,YAAY,MAAc;EACtB,MAAM,IAAI;aALkB;gBACP;iBACC;EAKtB,KAAK,OAAO;CAChB;CAEA,MAAa,UAAU,QAA+B;EAClD,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI;EAET,MAAM,GAAG,IAAI,cAAc,MAAM;EAEjC,KAAK,WAAW;CACpB;CAEA,UAAgC;EAC5B,IAAI,CAAC,KAAK,KAAK,OAAO,QAAQ,QAAQ;EAEtC,KAAK,IAAI,MAAM;EACf,KAAK,MAAM;EACX,KAAK,SAAS;EACd,KAAK,UAAU;EAEf,OAAO,QAAQ,QAAQ;CAC3B;CAEA,MAAa,QAAQ,cAAqC;EACtD,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI;EAET,MAAM,GAAG,IAAI,cAAc,YAAY;EACvC,MAAM,GAAG,OAAO,cAAc,KAAK,eAAe,KAAK,QAAQ,IAAI,CAAC;EAEpE,KAAK,UAAU,MAAM,KAAK,SAAS;CACvC;CAEA,MAAa,mBAAqC;EAG9C,OAAO,MAFc,KAAK,SAAS,KAElB;CACrB;CAEA,MAAa,WAAW,QAAgB,GAA+B;EACnE,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,OAAO,CAAC;EAEjB,MAAM,UAAU,MAAM,GAAG,OAAO,cAAc,KAAK,eAAe,KAAK,CAAC;EAExE,MAAM,UAAU,MAAM,KAAK,YAAY;EAEvC,KAAK,SAAS,UAAU;EAExB,OAAO;CACX;CAEA,MAAa,aAA4B;EACrC,MAAM,QAAQ,MAAM,OAAsB,KAAK,MAAM,KAAA,GAAW,EAC5D,UAAU,OAAO;GACb,GAAG,kBAAkB,cAAc,EAAE,eAAe,KAAK,CAAC;EAC9D,EACJ,CAAC;EAED,MAAM,iBAAiB,uBAAuB;GAC1C,MAAM,MAAM;EAChB,CAAC;EAED,IAAI,OAAO,WAAW,aAClB,OAAO,iBAAiB,gBAAgB;GACpC,MAAM,MAAM;EAChB,CAAC;EAGL,KAAK,MAAM;CACf;CAEA,MAAc,cAA+B;EACzC,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,2BAA2B;EAKpD,QAAO,MAHO,GAAG,YAAY,YAAY,CAAC,CAAC,YAAY,YAC9B,CAAC,CAAC,WAAW,MAAM,MAAM,EAAA,EAEnC,OAAO;CAC1B;CAEA,eAAuB,OAAe,OAAgB,OAAoB;EACtE,OAAO,YAAY,WAAW,OAAO,IAAI;CAC7C;CAEA,MAAc,WAA4B;EACtC,IAAI,KAAK,SAAS,OAAO,KAAK;EAE9B,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,2BAA2B;EAIpD,OAFc,GAAG,YAAY,YAAY,CAAC,CAAC,YAAY,YAE5C,CAAC,CAAC,MAAM;CACvB;CAEA,eAAuB,OAAe,OAAgB,OAAoB;EACtE,OAAO,YAAY,WAAW,OAAO,IAAI;CAC7C;AACJ;;;ACrHA,MAAa,kBAMT,WACkD;CAClD,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC;CAEtC,QAAQ,EAAE,WAAW;EAGjB,IAAI,EAFa,OAAO,YAAY,YAAY,UAAU,QAAQ,IAAI,IAEvD,OAAO,CAAC;EAEvB,OAAO,EACH,SAAS,IAAI,iBAAiB,KAAK,EAAE,EACzC;CACJ;AACJ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/IndexedDBStorage.ts","../src/addonIndexedDB.ts"],"sourcesContent":["import { AbstractStorageStore } from \"@pluv/client\";\nimport type { IDBPDatabase } from \"idb\";\nimport { openDB } from \"idb\";\n\nconst STORAGE_STORE_FLATTEN_THRESHOLD = 500;\nconst UPGRADES_KEY = \"__PLUV_UPDATES\";\n\ntype IndexDBSchema = {\n [UPGRADES_KEY]: {\n key: number;\n value: string;\n };\n};\n\ntype IndexedDB = IDBPDatabase<IndexDBSchema>;\n\nexport class IndexedDBStorage extends AbstractStorageStore {\n public room: string;\n\n private _db: IndexedDB | null = null;\n private _dbRef: number = 0;\n private _dbSize: number = 0;\n\n constructor(room: string) {\n super(room);\n\n this.room = room;\n }\n\n public async addUpdate(update: string): Promise<void> {\n const db = this._db;\n\n if (!db) return;\n\n await db.add(UPGRADES_KEY, update);\n\n this._dbSize += 1;\n }\n\n public destroy(): Promise<void> {\n if (!this._db) return Promise.resolve();\n\n this._db.close();\n this._db = null;\n this._dbRef = 0;\n this._dbSize = 0;\n\n return Promise.resolve();\n }\n\n public async flatten(encodedState: string): Promise<void> {\n const db = this._db;\n\n if (!db) return;\n\n await db.add(UPGRADES_KEY, encodedState);\n await db.delete(UPGRADES_KEY, this._getUpperBound(this._dbRef, true));\n\n this._dbSize = await this._getSize();\n }\n\n public async getShouldFlatten(): Promise<boolean> {\n const dbSize = await this._getSize();\n\n return dbSize >= STORAGE_STORE_FLATTEN_THRESHOLD;\n }\n\n public async getUpdates(start: number = 0): Promise<readonly string[]> {\n const db = this._db;\n\n if (!db) return [];\n\n const updates = await db.getAll(UPGRADES_KEY, this._getLowerBound(start));\n\n const lastKey = await this._getLastKey();\n\n this._dbRef = lastKey + 1;\n\n return updates;\n }\n\n public async initialize(): Promise<void> {\n const newDB = await openDB<IndexDBSchema>(this.room, undefined, {\n upgrade: (db) => {\n db.createObjectStore(UPGRADES_KEY, { autoIncrement: true });\n },\n });\n\n newDB.addEventListener(\"versionchange\", () => {\n newDB.close();\n });\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"unload\", () => {\n newDB.close();\n });\n }\n\n this._db = newDB;\n }\n\n private async _getLastKey(): Promise<number> {\n const db = this._db;\n\n if (!db) throw new Error(\"IndexedDB not initialized\");\n\n const store = db.transaction(UPGRADES_KEY).objectStore(UPGRADES_KEY);\n const cursor = await store.openCursor(null, \"prev\");\n\n return cursor?.key ?? -1;\n }\n\n private _getLowerBound(lower: number, open: boolean = false): IDBKeyRange {\n return IDBKeyRange.lowerBound(lower, open);\n }\n\n private async _getSize(): Promise<number> {\n if (this._dbSize) return this._dbSize;\n\n const db = this._db;\n\n if (!db) throw new Error(\"IndexedDB not initialized\");\n\n const store = db.transaction(UPGRADES_KEY).objectStore(UPGRADES_KEY);\n\n return store.count();\n }\n\n private _getUpperBound(upper: number, open: boolean = false): IDBKeyRange {\n return IDBKeyRange.upperBound(upper, open);\n }\n}\n","import type { PluvRoom, PluvRoomAddon } from \"@pluv/client\";\nimport type { AbstractCrdtDocFactory, CrdtType } from \"@pluv/crdt\";\nimport type { IOLike, JsonObject } from \"@pluv/types\";\nimport { IndexedDBStorage } from \"./IndexedDBStorage\";\n\nexport interface AddonIndexedDBConfig<\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject,\n TPresence extends Record<string, any>,\n TCrdt extends AbstractCrdtDocFactory<any, any>,\n> {\n enabled?: boolean | ((room: PluvRoom<TIO, TMetadata, TPresence, TCrdt>) => boolean);\n}\n\nexport const addonIndexedDB = <\n TIO extends IOLike<any, any, any>,\n TMetadata extends JsonObject,\n TPresence extends Record<string, any>,\n TCrdt extends AbstractCrdtDocFactory<any, any>,\n>(\n config?: AddonIndexedDBConfig<TIO, TMetadata, TPresence, TCrdt>,\n): PluvRoomAddon<TIO, TMetadata, TPresence, TCrdt> => {\n const { enabled = true } = config ?? {};\n\n return ({ room }) => {\n const _enabled = typeof enabled === \"boolean\" ? enabled : enabled(room);\n\n if (!_enabled) return {};\n\n return {\n storage: new IndexedDBStorage(room.id),\n };\n };\n};\n"],"mappings":";;;AAIA,MAAM,kCAAkC;AACxC,MAAM,eAAe;AAWrB,IAAa,mBAAb,cAAsC,qBAAqB;CAOvD,YAAY,MAAc;EACtB,MAAM,IAAI;EALkB,KAAA,MAAA;EACP,KAAA,SAAA;EACC,KAAA,UAAA;EAKtB,KAAK,OAAO;CAChB;CAEA,MAAa,UAAU,QAA+B;EAClD,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI;EAET,MAAM,GAAG,IAAI,cAAc,MAAM;EAEjC,KAAK,WAAW;CACpB;CAEA,UAAgC;EAC5B,IAAI,CAAC,KAAK,KAAK,OAAO,QAAQ,QAAQ;EAEtC,KAAK,IAAI,MAAM;EACf,KAAK,MAAM;EACX,KAAK,SAAS;EACd,KAAK,UAAU;EAEf,OAAO,QAAQ,QAAQ;CAC3B;CAEA,MAAa,QAAQ,cAAqC;EACtD,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI;EAET,MAAM,GAAG,IAAI,cAAc,YAAY;EACvC,MAAM,GAAG,OAAO,cAAc,KAAK,eAAe,KAAK,QAAQ,IAAI,CAAC;EAEpE,KAAK,UAAU,MAAM,KAAK,SAAS;CACvC;CAEA,MAAa,mBAAqC;EAG9C,OAAO,MAFc,KAAK,SAAS,KAElB;CACrB;CAEA,MAAa,WAAW,QAAgB,GAA+B;EACnE,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,OAAO,CAAC;EAEjB,MAAM,UAAU,MAAM,GAAG,OAAO,cAAc,KAAK,eAAe,KAAK,CAAC;EAExE,MAAM,UAAU,MAAM,KAAK,YAAY;EAEvC,KAAK,SAAS,UAAU;EAExB,OAAO;CACX;CAEA,MAAa,aAA4B;EACrC,MAAM,QAAQ,MAAM,OAAsB,KAAK,MAAM,KAAA,GAAW,EAC5D,UAAU,OAAO;GACb,GAAG,kBAAkB,cAAc,EAAE,eAAe,KAAK,CAAC;EAC9D,EACJ,CAAC;EAED,MAAM,iBAAiB,uBAAuB;GAC1C,MAAM,MAAM;EAChB,CAAC;EAED,IAAI,OAAO,WAAW,aAClB,OAAO,iBAAiB,gBAAgB;GACpC,MAAM,MAAM;EAChB,CAAC;EAGL,KAAK,MAAM;CACf;CAEA,MAAc,cAA+B;EACzC,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,2BAA2B;EAKpD,QAAO,MAHO,GAAG,YAAY,YAAY,CAAC,CAAC,YAAY,YAC9B,CAAC,CAAC,WAAW,MAAM,MAAM,EAAA,EAEnC,OAAO;CAC1B;CAEA,eAAuB,OAAe,OAAgB,OAAoB;EACtE,OAAO,YAAY,WAAW,OAAO,IAAI;CAC7C;CAEA,MAAc,WAA4B;EACtC,IAAI,KAAK,SAAS,OAAO,KAAK;EAE9B,MAAM,KAAK,KAAK;EAEhB,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,2BAA2B;EAIpD,OAFc,GAAG,YAAY,YAAY,CAAC,CAAC,YAAY,YAE5C,CAAC,CAAC,MAAM;CACvB;CAEA,eAAuB,OAAe,OAAgB,OAAoB;EACtE,OAAO,YAAY,WAAW,OAAO,IAAI;CAC7C;AACJ;;;ACrHA,MAAa,kBAMT,WACkD;CAClD,MAAM,EAAE,UAAU,SAAS,UAAU,CAAC;CAEtC,QAAQ,EAAE,WAAW;EAGjB,IAAI,EAFa,OAAO,YAAY,YAAY,UAAU,QAAQ,IAAI,IAEvD,OAAO,CAAC;EAEvB,OAAO,EACH,SAAS,IAAI,iBAAiB,KAAK,EAAE,EACzC;CACJ;AACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/addon-indexeddb",
3
- "version": "5.0.0",
3
+ "version": "5.0.2",
4
4
  "description": "@pluv/io indexeddb for client storage persistence",
5
5
  "author": {
6
6
  "email": "david@pluv.io",
@@ -16,21 +16,24 @@
16
16
  },
17
17
  "type": "module",
18
18
  "types": "./dist/index.d.mts",
19
+ "files": [
20
+ "dist"
21
+ ],
19
22
  "publishConfig": {
20
23
  "access": "public"
21
24
  },
22
25
  "dependencies": {
23
- "idb": "^8.0.3",
24
- "@pluv/client": "^5.0.0",
25
- "@pluv/crdt": "^5.0.0"
26
+ "@pluv/client": "^5.0.2",
27
+ "@pluv/crdt": "^5.0.2",
28
+ "idb": "^8.0.3"
26
29
  },
27
30
  "devDependencies": {
28
- "eslint": "^10.5.0",
29
- "tsdown": "0.22.3",
30
- "typescript": "^5.9.3",
31
- "@pluv/tsconfig": "^5.0.0",
32
- "@pluv/types": "^5.0.0",
33
- "eslint-config-pluv": "^5.0.0"
31
+ "@pluv/tsconfig": "^5.0.2",
32
+ "@pluv/types": "^5.0.2",
33
+ "eslint": "^10.9.0",
34
+ "eslint-config-pluv": "^5.0.2",
35
+ "tsdown": "0.22.14",
36
+ "typescript": "^5.9.3"
34
37
  },
35
38
  "exports": {
36
39
  ".": "./dist/index.mjs",
@@ -1,17 +0,0 @@
1
- $ tsdown
2
- ℹ tsdown v0.22.3 powered by rolldown v1.1.2
3
- ℹ config file: /home/runner/work/pluv/pluv/packages/addon-indexeddb/tsdown.config.ts
4
- ℹ entry: src/index.ts
5
- ℹ target: esnext
6
- ℹ tsconfig: tsconfig.json
7
- ℹ Build start
8
- ℹ Hint: consider adding deps.onlyBundle option to avoid unintended bundling of dependencies, or set deps.onlyBundle: false to disable this hint.
9
- See more at https://tsdown.dev/options/dependencies#deps-onlybundle
10
- Detected dependencies in bundle:
11
- - wonka
12
- ℹ dist/index.mjs 2.58 kB │ gzip: 0.95 kB
13
- ℹ dist/index.d.mts.map 7.82 kB │ gzip: 2.79 kB
14
- ℹ dist/index.mjs.map 6.64 kB │ gzip: 2.08 kB
15
- ℹ dist/index.d.mts 5.84 kB │ gzip: 1.85 kB
16
- ℹ 4 files, total: 22.89 kB
17
- ✔ Build complete in 3129ms