PageSourceSearch

https://smry.ai/_next/static/chunks/219pqw7c_vp2q.js?dpl=5cb6504fd3cb

js smry.ai collected 2026-09-24 10:06:10 UTC 116,577 bytes, 185 lines download raw bytes

1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e._posthogReleaseId=e._posthogReleaseId||"01a0d2c8-6b7d-0000-f70a-d8c4c3e4bcf2";var n=(new e.Error).stack;n&&(e._posthogChunkIds=e._posthogChunkIds||{},e._posthogChunkIds[n]="fb6b2677-70b6-515e-9498-3aa9fd87465c")}catch(e){}}();(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,681837,940099,915719,t=>{"use strict";class e{crud;haveMore;complete;constructor(t,e,n){this.crud=t,this.haveMore=e,this.complete=n}}t.s(["CrudBatch",0,e],681837),t.s(["CrudTransaction",0,class extends e{crud;complete;transactionId;constructor(t,e,n){super(t,!1,e),this.crud=t,this.complete=e,this.transactionId=n}}],940099),t.s(["UploadQueueStats",0,class{count;size;constructor(t,e=null){this.count=t,this.size=e}toString(){return null==this.size?`UploadQueueStats<count:${this.count}>`:`UploadQueueStats<count: $count size: ${this.size/1024}kB>`}}],915719)},736207,941981,t=>{"use strict";var e=t.i(327007);function n(t,e){let n={};return t.forEach((t,i)=>n[t]=e[i]),n}function i(t){let e,{insertId:i,rowsAffected:a,columnNames:r,rawRows:s}=t;function o(){return e||(e=s.map(t=>n(r,t)))}function l(t){return e?e[t]:n(r,s[t])}return{insertId:i,rowsAffected:a,get array(){return o()},rows:{length:s.length,get _array(){return o()},item:l},[Symbol.iterator](){let t=0;return{next:function(){if(t>=s.length)return{done:!0,value:void 0};let e=l(t);return t++,{done:!1,value:e}}}}}}function a(t){return{...t,array:[],[Symbol.iterator]:()=>({next:()=>({done:!0,value:void 0})})}}t.s(["queryResultFromRaw",0,i,"queryResultWithoutRows",0,a],941981);class r{async getAll(t,e){return Array.from(await this.execute(t,e))}async getOptional(t,e){let{array:n}=await this.execute(t,e);return n.length>0?n[0]:null}async get(t,e){let n=await this.getOptional(t,e);if(null==n)throw Error("Result set is empty");return n}async execute(t,e){return i(await this.executeRaw(t,e))}async executeBatch(t,e=[]){let n,i=0;for(let a of e){let e=await this.execute(t,a);n=e.insertId,i+=e.rowsAffected??0}return a({rowsAffected:i,insertId:n})}}class s extends e.BaseObserver{readTransaction(t,e){return this.readLock(e=>o.runWith(e,t),e)}writeTransaction(t,e){return this.writeLock(e=>o.runWith(e,t),e)}getAll(t,e){return this.readLock(n=>n.getAll(t,e))}getOptional(t,e){return this.readLock(n=>n.getOptional(t,e))}get(t,e){return this.readLock(n=>n.get(t,e))}execute(t,e){return this.writeLock(n=>n.execute(t,e))}executeRaw(t,e){return this.writeLock(n=>n.executeRaw(t,e))}executeBatch(t,e){return this.writeTransaction(n=>n.executeBatch(t,e))}}class o extends r{inner;finalized=!1;constructor(t){super(),this.inner=t}async commit(){this.finalized||(this.finalized=!0,await this.inner.execute("COMMIT"))}async rollback(){this.finalized||(this.finalized=!0,await this.inner.execute("ROLLBACK"))}execute(t,e){return this.inner.execute(t,e)}executeRaw(t,e){return this.inner.executeRaw(t,e)}executeBatch(t,e){return this.inner.executeBatch(t,e)}static async runWith(t,e){let n=new o(t);try{await t.execute("BEGIN IMMEDIATE");let i=await e(n);return await n.commit(),i}catch(t){try{await n.rollback()}catch(t){}throw t}}}t.s(["DBAdapter",0,s,"LockContext",0,r],736207)},533243,297007,278178,784693,552392,123552,123438,962076,426057,804618,279933,t=>{"use strict";var e,n,i,a,r,s,o,l,c,u,h,d,g,p,m,y;let w={trace:10,debug:20,info:30,warn:40,error:50};t.s(["LogLevels",0,w,"createConsoleLogger",0,function(t){let{prefix:e="PowerSync",minLevel:n=w.info}=t??{};return{prefix:e,minLevel:n,log({level:t,message:n,error:i}){if(t<this.minLevel)return;let a=console.log;t>=w.error?a=console.error:t>=w.warn?a=console.warn:t>=w.info&&(a=console.info);let r=`[${e}]: ${n}`;i?a(r,i):a(r)}}}],297007),(c=e||(e={})).TEXT="TEXT",c.INTEGER="INTEGER",c.REAL="REAL";let f={type:e.TEXT},b={text:f,integer:{type:e.INTEGER},real:{type:e.REAL}};class S{options;constructor(t){this.options=t}get name(){return this.options.name}get type(){return this.options.type}
1toJSON(){return{name:this.name,type:this.type}}}t.s(["Column",0,S,"ColumnType",0,e,"column",0,b],278178);let E={ascending:!0};class v{options;static createAscending(t){return new v({name:t,ascending:!0})}constructor(t){this.options={...E,...t}}get name(){return this.options.name}get ascending(){return this.options.ascending}toJSON(t){return{name:this.name,ascending:this.ascending,type:t.columns.find(t=>t.name===this.name)?.type??e.TEXT}}}let _={columns:[]};class C{options;static createAscending(t,e){return new C({...t,columns:e.map(t=>v.createAscending(t))})}constructor(t){this.options=t,this.options={..._,...t}}get name(){return this.options.name}get columns(){return this.options.columns??[]}toJSON(t){return{name:this.name,columns:this.columns.map(e=>e.toJSON(t))}}}function L(t){let e=t.trackPrevious;return{local_only:t.localOnly,insert_only:t.insertOnly,include_old:e&&(e.columns??!0),include_old_only_when_changed:"object"==typeof e&&!0==e.onlyWhenChanged,include_metadata:t.trackMetadata,ignore_empty_update:t.ignoreEmptyUpdates}}t.s(["encodeTableOptions",0,L],784693);let T=/["'%,.#\s[\]]/;class A{options;constructor(t){this.options=t,this.applyDefaultOptions()}get name(){return this.options.name}get viewNameOverride(){return this.options.viewName}get viewName(){return this.viewNameOverride??this.name}get columns(){return this.options.columns}get indexes(){return this.options.indexes??[]}get localOnly(){return this.options.localOnly}get insertOnly(){return this.options.insertOnly}get trackPrevious(){return this.options.trackPrevious}get trackMetadata(){return this.options.trackMetadata}get ignoreEmptyUpdates(){return this.options.ignoreEmptyUpdates}get internalName(){return this.options.localOnly?`ps_data_local__${this.name}`:`ps_data__${this.name}`}get validName(){return!(T.test(this.name)||null!=this.viewNameOverride&&T.test(this.viewNameOverride))}validate(){if(T.test(this.name))throw Error(`Invalid characters in table name: ${this.name}`);if(this.viewNameOverride&&T.test(this.viewNameOverride))throw Error(`Invalid characters in view name: ${this.viewNameOverride}`);if(this.columns.length>1999)throw Error("Table has too many columns. The maximum number of columns is 1999.");if(this.trackMetadata&&this.localOnly)throw Error("Can't include metadata for local-only tables.");if(!1!=this.trackPrevious&&this.localOnly)throw Error("Can't include old values for local-only tables.");let t=new Set;for(let e of(t.add("id"),this.columns)){let{name:n}=e;if("id"===e.name)throw Error("An id column is automatically added, custom id columns are not supported");if(t.has(n))throw Error(`Duplicate column ${n}`);if(T.test(n))throw Error(`Invalid characters in column name: ${e.name}`);t.add(n)}let e=new Set;for(let n of this.indexes){if(e.has(n.name))throw Error(`Duplicate index ${n.name}`);if(T.test(n.name))throw Error(`Invalid characters in index name: ${n.name}`);for(let e of n.columns)if(!t.has(e.name))throw Error(`Column ${e.name} not found for index ${n.name}`);e.add(n.name)}}toJSON(){return{name:this.name,view_name:this.viewName,columns:this.columns.map(t=>t.toJSON()),indexes:this.indexes.map(t=>t.toJSON(this)),...L(this)}}applyDefaultOptions(){this.options.insertOnly??=!1,this.options.localOnly??=!1,this.options.trackPrevious??=!1,this.options.trackMetadata??=!1,this.options.ignoreEmptyUpdates??=!1}}class O extends A{_mappedColumns;static createLocalOnly(t,e){return new O(t,{localOnly:!0,insertOnly:!1,...e})}static createInsertOnly(t,e){return new O(t,{localOnly:!1,insertOnly:!0,...e})}constructor(t,e){super(O.optionsFromColumns(t,e)),this._mappedColumns=t}copyWithName(t){return new A({...this.options,name:t})}static optionsFromColumns(t,e){return{name:"",columns:Object.entries(t).map(([t,e])=>new S({name:t,type:e.type})),indexes:Object.entries(e?.indexes??{}).map(([t,e])=>new C({name:t,columns:e.map(t=>"string"==typeof t?new v({name:t.replace(/^-/,""),ascending:!t.startsWith("-")}):t)})),viewName:e?.viewName,insertOnly:e?.insertOnly,localOnly:e?.localOnly,trackPrevious:e?.trackPrevious,trackMetadata:e?.trackMetadata,ignoreEmptyUpdates:e?.ignoreEmptyUpdates}}}t.s(["Table",0,O],552392);let x="attachments";function R(t){return{id:t.id,filename:t.filename,localUri:t.local_uri,size:t.size,mediaType:t.media_type,timestamp:t.timestamp,metaData:t.meta_data,hasSynced:1===t.has_synced,state:t.state}}(u=n||(n={}))[u.QUEUED_UPLOAD=0]="QUEUED_UPLOAD",u[u.QUEUED_DOWNLOAD=1]="QUEUED_DOWNLOAD",u[u.QUEUED_DELET
1E=2]="QUEUED_DELETE",u[u.SYNCED=3]="SYNCED",u[u.ARCHIVED=4]="ARCHIVED";let I={filename:b.text,local_uri:b.text,timestamp:b.integer,size:b.integer,media_type:b.text,state:b.integer,has_synced:b.integer,meta_data:b.text};t.s(["ATTACHMENT_TABLE",0,x,"AttachmentState",0,n,"AttachmentTable",0,class extends O{constructor(t){super(I,{...t,viewName:t?.viewName??x,localOnly:!0,insertOnly:!1})}},"attachmentFromSql",0,R],123552);class D{db;tableName;logger;archivedCacheLimit=100;constructor(t,e="attachments",n,i){this.db=t,this.tableName=e,this.logger=n,this.archivedCacheLimit=i}async getActiveAttachments(){return(await this.db.getAll(`
2        SELECT
3          *
4        FROM
5          ${this.tableName}
6        WHERE
7          state = ?
8          OR state = ?
9          OR state = ?
10        ORDER BY
11          timestamp ASC
12      `,[n.QUEUED_UPLOAD,n.QUEUED_DOWNLOAD,n.QUEUED_DELETE])).map(R)}async getArchivedAttachments(){return(await this.db.getAll(`
13        SELECT
14          *
15        FROM
16          ${this.tableName}
17        WHERE
18          state = ?
19        ORDER BY
20          timestamp ASC
21      `,[n.ARCHIVED])).map(R)}async getAttachments(){return(await this.db.getAll(`
22        SELECT
23          *
24        FROM
25          ${this.tableName}
26        ORDER BY
27          timestamp ASC
28      `,[])).map(R)}async upsertAttachment(t,e){await e.execute(`
29        INSERT
30        OR REPLACE INTO ${this.tableName} (
31          id,
32          filename,
33          local_uri,
34          size,
35          media_type,
36          timestamp,
37          state,
38          has_synced,
39          meta_data
40        )
41        VALUES
42          (?, ?, ?, ?, ?, ?, ?, ?, ?)
43      `,[t.id,t.filename,t.localUri||null,t.size||null,t.mediaType||null,t.timestamp,t.state,+!!t.hasSynced,t.metaData||null])}async getAttachment(t){let e=await this.db.get(`
44        SELECT
45          *
46        FROM
47          ${this.tableName}
48        WHERE
49          id = ?
50      `,[t]);return e?R(e):void 0}async deleteAttachment(t){await this.db.writeTransaction(e=>e.execute(`
51          DELETE FROM ${this.tableName}
52          WHERE
53            id = ?
54        `,[t]))}async clearQueue(){await this.db.writeTransaction(t=>t.execute(` DELETE FROM ${this.tableName} `))}async deleteArchivedAttachments(t){let e=(await this.db.getAll(`
55        SELECT
56          *
57        FROM
58          ${this.tableName}
59        WHERE
60          state = ?
61        ORDER BY
62          timestamp DESC
63        LIMIT
64          ?
65        OFFSET
66          ?
67      `,[n.ARCHIVED,1e3,this.archivedCacheLimit])).map(R);if(0===e.length)return!1;await t?.(e),this.logger.log({level:w.info,message:`Deleting ${e.length} archived attachments. Archived attachment exceeds cache archiveCacheLimit of ${this.archivedCacheLimit}.`});let i=e.map(t=>t.id);return await this.db.execute(`
68        DELETE FROM ${this.tableName}
69        WHERE
70          id IN (
71            SELECT
72              json_each.value
73            FROM
74              json_each (?)
75          );
76      `,[JSON.stringify(i)]),this.logger.log({level:w.info,message:`Deleted ${e.length} archived attachments`}),e.length<1e3}async saveAttachments(t){0!==t.length&&await this.db.writeTransaction(async e=>{for(let n of t)await this.upsertAttachment(n,e)})}}class k{db;logger;tableName;mutex;context;constructor(t,e,n="attachments",i=100){this.db=t,this.logger=e,this.tableName=n,this.mutex=t.createMutex(),this.context=new D(t,n,e,i)}watchActiveAttachments({throttleMs:t}={}){return this.logger.log({level:w.info,message:"Watching active attachments..."}),this.db.query({sql:`
77          SELECT
78            *
79          FROM
80            ${this.tableName}
81          WHERE
82            state = ?
83            OR state = ?
84            OR state = ?
85          ORDER BY
86            timestamp ASC
87        `,parameters:[n.QUEUED_UPLOAD,n.QUEUED_DOWNLOAD,n.QUEUED_DELETE]}).differentialWatch({throttleMs:t})}async withContext(t){return this.mutex.runExclusive(async()=>t(this.context))}}class M{localStorage;remoteStorage;constructor(t,e){this.localStorage=t,this.remoteStorage=e}async upload(t){let e=await this.localStorage.readFile(t.localUri);await this.remoteStorage.uploadFile(e,t)}async download(t){let e=await this.remoteStorage.downloadFile(t);await this.localStorage.saveFile(t.localUri,e)}async delete(t){await this.remoteStorage.deleteFile(t)}}class U{attachmentService;localStorage;transport;logger;errorHandler;constructor(t,e,n,i,a){this.attachmentService=t,this.localStorage=e,this.transport=n,this.logger=i,this.errorHandler=a}async processAttachments(t,e){let i=e?.signal;for(let e of(this.logger.log({level:w.info,message:`Starting processAttachments with ${t.length} attachments`}),t)){if(i?.aborted)return void this.logger.log({level:w.info,message:"Sync cancelled; stopping iteration early"});try{let t;switch(e.state){case n.QUEUED_UPLOAD:t=await this.uploadAttachment(e);break;case n.QUEUED_DOWNLOAD:t=await this.downloadAttachment(e);break;
87case n.QUEUED_DELETE:t=await this.attachmentService.withContext(t=>this.deleteAttachment(e,t));break;default:continue}await this.attachmentService.withContext(e=>e.saveAttachments([t]))}catch(t){this.logger.log({level:w.warn,message:`Error during sync for ${e.id}`,error:t})}}}async uploadAttachment(t){this.logger.log({level:w.info,message:`Uploading attachment ${t.filename}`});try{if(null==t.localUri)throw Error(`No localUri for attachment ${t.id}`);return await this.transport.upload({...t,localUri:t.localUri}),{...t,state:n.SYNCED,hasSynced:!0}}catch(e){if(!(await this.errorHandler?.onUploadError(t,e)??!0))return{...t,state:n.ARCHIVED};return t}}async downloadAttachment(t){this.logger.log({level:w.info,message:`Downloading attachment ${t.filename}`});try{let e=this.localStorage.getLocalUri(t.filename);return await this.transport.download({...t,localUri:e}),{...t,state:n.SYNCED,localUri:e,hasSynced:!0}}catch(e){if(!(await this.errorHandler?.onDownloadError(t,e)??!0))return{...t,state:n.ARCHIVED};return t}}async deleteAttachment(t,e){try{return await this.transport.delete(t),t.localUri&&await this.localStorage.deleteFile(t.localUri),await e.deleteAttachment(t.id),{...t,state:n.ARCHIVED}}catch(e){if(!(await this.errorHandler?.onDeleteError(t,e)??!0))return{...t,state:n.ARCHIVED};return t}}async deleteArchivedAttachments(t){return await t.deleteArchivedAttachments(async t=>{for(let e of t)if(e.localUri)try{await this.localStorage.deleteFile(e.localUri)}catch(t){this.logger.log({level:w.error,message:"Error deleting local file for archived attachment",error:t})}})}}t.s(["AttachmentQueue",0,class{periodicSyncTimer;syncingService;localStorage;watchAttachments;tableName;logger;syncIntervalMs=3e4;syncThrottleDuration;downloadAttachments=!0;archivedCacheLimit;attachmentService;db;statusListenerDispose;watchActiveAttachments;watchAttachmentsAbortController;syncLoopMutex;syncAbortController;constructor({db:t,localStorage:e,remoteStorage:n,transportAdapter:i,watchAttachments:a,logger:r,tableName:s=x,syncIntervalMs:o=3e4,syncThrottleDuration:l,downloadAttachments:c=!0,archivedCacheLimit:u=100,errorHandler:h}){this.db=t,this.syncLoopMutex=t.createMutex(),this.localStorage=e,this.watchAttachments=a,this.tableName=s,this.syncIntervalMs=o,this.syncThrottleDuration=l,this.archivedCacheLimit=u,this.downloadAttachments=c,this.logger=r??t.logger,this.attachmentService=new k(t,this.logger,s,u);const d=i??new M(e,n);this.syncingService=new U(this.attachmentService,e,d,this.logger,h)}async generateAttachmentId(){return this.db.get("SELECT uuid() as id").then(t=>t.id)}async startSync(){await this.stopSync(),this.syncAbortController=new AbortController,this.watchActiveAttachments=this.attachmentService.watchActiveAttachments({throttleMs:this.syncThrottleDuration}),await this.localStorage.initialize(),await this.verifyAttachments(),this.periodicSyncTimer=setInterval(async()=>{await this.syncStorage()},this.syncIntervalMs),this.watchActiveAttachments.registerListener({onDiff:async()=>{await this.syncStorage()}}),this.statusListenerDispose=this.db.registerListener({statusChanged:t=>{t.connected&&this.syncStorage().catch(t=>{this.logger.log({level:w.error,message:"Error syncing storage on connection",error:t})})}}),this.watchAttachmentsAbortController=new AbortController;let t=this.watchAttachmentsAbortController.signal;this.watchAttachments(async e=>{t.aborted||await this.attachmentService.withContext(async t=>{let i=await t.getAttachments(),a=[];for(let t of e){let e=i.find(e=>e.id===t.id);if(!e){if(!this.downloadAttachments)continue;let e=t.filename??`${t.id}.${t.fileExtension}`;a.push({id:t.id,filename:e,state:n.QUEUED_DOWNLOAD,hasSynced:!1,metaData:t.metaData,mediaType:t.mediaType,timestamp:new Date().getTime()});continue}if(e.state===n.ARCHIVED)if(!0===e.hasSynced)a.push({...e,state:n.SYNCED});else{let t=null==e.localUri?n.QUEUED_DOWNLOAD:n.QUEUED_UPLOAD;a.push({...e,state:t})}}for(let t of i)if(null==e.find(e=>e.id===t.id))switch(t.state){case n.QUEUED_DELETE:case n.QUEUED_UPLOAD:!0===t.hasSynced&&a.push({...t,state:n.ARCHIVED});break;default:a.push({...t,state:n.ARCHIVED})}a.length>0&&await t.saveAttachments(a)})},t)}async syncStorage(){let t=this.syncAbortController?.signal;if(!(null==t||t?.aborted))try{await this.syncLoopMutex.runExclusive(async()=>{let e=await this.attachmentService.withContext(t=>t.getActiveAttachments());await this.localStorage.initialize(),await this.syncingService.processAttachments(e,{signal:t}),t.aborted||await this.attachmentService.withContext(t=>this.syncingService.deleteArchivedAttachments(t))},t)}catch(e){if(t.aborted)return;throw e}}async stopSync(){clearInterval(this.periodicSyncTimer),this.periodicSyncTimer=void 0,this.syncAbortController&&(this.syncAbortController.abort(),this.syncAbortController=void 0),this.watchActiveAttachments&&await this.watchActiveAttachments.close(),this.watchAttachmentsAbortController&&this.watchAttachmentsAbortController.abort(),this.statusListenerDispose&&(this.statusListenerDispose(),this.statusListenerDispose=void 0)}withAttachmentContext(t){return this.attachmentService.withContext(t)}
87async createUploadAttachment({fileExtension:t,mediaType:e,metaData:i,id:a,updateHook:r},s){let o,l=a??await this.generateAttachmentId(),c=`${l}.${t}`,u=this.localStorage.getLocalUri(c);if("data"===s.kind)o=await this.localStorage.saveFile(u,s.data);else{let t=this.localStorage;if(!t.moveFile)throw Error("The configured local storage adapter does not support moveFile, required by saveFileFromUri.");o=await t.moveFile(s.localUri,u)}let h={id:l,filename:c,mediaType:e,localUri:u,state:n.QUEUED_UPLOAD,hasSynced:!1,size:o,timestamp:new Date().getTime(),metaData:i};return await this.attachmentService.withContext(async t=>{await t.db.writeTransaction(async e=>{await r?.(e,h),await t.upsertAttachment(h,e)})}),h}async saveFile(t){return this.createUploadAttachment(t,{kind:"data",data:t.data})}async saveFileFromUri(t){return this.createUploadAttachment(t,{kind:"uri",localUri:t.localUri})}async deleteFile({id:t,updateHook:e}){await this.attachmentService.withContext(async i=>{let a=await i.getAttachment(t);if(!a)throw Error(`Attachment with id ${t} not found`);await i.db.writeTransaction(async t=>{await e?.(t,a),await i.upsertAttachment({...a,state:n.QUEUED_DELETE,hasSynced:!1},t)})})}async expireCache(){let t=!1;for(;!t;)await this.attachmentService.withContext(async e=>{t=await this.syncingService.deleteArchivedAttachments(e)})}async clearQueue(){await this.attachmentService.withContext(async t=>{await t.clearQueue()}),await this.localStorage.clear()}async verifyAttachments(){await this.attachmentService.withContext(async t=>{let e=await t.getAttachments(),i=[];for(let t of e){if(null==t.localUri||await this.localStorage.fileExists(t.localUri))continue;let e=this.localStorage.getLocalUri(t.filename);await this.localStorage.fileExists(e)?i.push({...t,localUri:e}):t.state===n.SYNCED?i.push({...t,state:n.QUEUED_DOWNLOAD,localUri:void 0}):i.push({...t,state:n.ARCHIVED,localUri:void 0})}await t.saveAttachments(i)})}}],123438),(h=i||(i={})).UTF8="utf8",h.Base64="base64",(d=a||(a={})).PUT="PUT",d.PATCH="PATCH",d.DELETE="DELETE",t.s(["UpdateType",0,a],962076),(g=r||(r={})).HTTP="http",g.WEB_SOCKET="web-socket",(p=s||(s={})).Buffered="buffered",p.Sequential="sequential",t.s(["FetchStrategy",0,s,"SyncStreamConnectionMethod",0,r],426057),(m=o||(o={})).INSERT="INSERT",m.UPDATE="UPDATE",m.DELETE="DELETE",t.s(["DiffTriggerOperation",0,o],804618),(y=l||(l={})).ON_DATA="onData",y.ON_ERROR="onError",y.ON_STATE_CHANGE="onStateChange",y.SETTINGS_WILL_UPDATE="settingsWillUpdate",y.CLOSED="closed",t.s(["WatchedQueryListenerEvent",0,l],279933),t.s([],533243)},327007,t=>{"use strict";class e{listeners=new Set;dispose(){this.listeners.clear()}registerListener(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}iterateListeners(t){for(let e of this.listeners)t(e)}async iterateAsyncListeners(t){for(let e of Array.from(this.listeners.values()))await t(e)}}t.s(["BaseObserver",0,e])},993150,675995,799386,800664,826663,592489,258472,944955,t=>{"use strict";t.i(533243);var e,n,i,a,r,s,o=t.i(297007),l=t.i(681837),c=t.i(940099),u=t.i(915719),h=t.i(327007),d=t.i(426057);async function g(t,e,n){let{rawRows:i}=await t.executeRaw("SELECT CAST(powersync_control(?, ?) AS TEXT)",[e,n]);return i[0][0]}function p(t,e=null){return g(t,"target_checkpoint_request_id",e)}(e=a||(a={})).DATA="ps_data",e.CRUD="ps_crud",e.BUCKETS="ps_buckets",e.OPLOG="ps_oplog",e.UNTYPED="ps_untyped",(n=r||(r={})).PROCESS_TEXT_LINE="line_text",n.PROCESS_BSON_LINE="line_binary",n.STOP="stop",n.START="start",n.NOTIFY_TOKEN_REFRESHED="refreshed_token",n.NOTIFY_CRUD_UPLOAD_COMPLETED="completed_upload",n.UPDATE_SUBSCRIPTIONS="update_subscriptions",n.CONNECTION_STATE="connection";let m="9223372036854775807";class y{internal;totalOperations;downloadedOperations;downloadedFraction;constructor(t){this.internal=t;const e=this.untilPriority(0x7fffffff);this.totalOperations=e.totalOperations,this.downloadedOperations=e.downloadedOperations,this.downloadedFraction=e.downloadedFraction}untilPriority(t){let e=0,n=0;for(let i of Object.values(this.internal.buckets))i.priority<=t&&(n+=i.since_last,e+=i.target_count-i.at_last);let i=0==e?0:n/e;return{totalOperations:e,downloadedOperations:n,downloadedFraction:i}}}class w{core;jsState;constructor(t,e){this.core=t,this.jsState=e}get connected(){return this.core?.connected??!1}get connecting(){return this.core?.connecting??!1}get downloading(){return this.core?.downloading!=null}get uploading(){return this.jsState.uploading??!1}get downloadError(){return this.jsState.downloadError}get uploadError(){return this.jsState.uploadError}get dataFlowStatus(){return{downloading:this.downloading,uploading:this.uploading,downloadError:this.downloadError,uploadError:this.uploadError}}get lastSyncedAt(){return this.statusForPriority(0x7fffffff)?.lastSyncedAt}get hasSynced(){return this.statusForPriority(0x7fffffff)?.hasSynced}
87get syncStreams(){return this.core?.streams.map(t=>new b(this,t))}forStream(t){let e=JSON.stringify(t.parameters),n=this.core?.streams?.find(n=>n.name==t.name&&e==JSON.stringify(n.parameters));return n&&new b(this,n)}get priorityStatusEntries(){return this.core?.priority_status.map(f)}get downloadProgress(){let t=this.core?.downloading;return null==t?null:new y(t)}statusForPriority(t){let e=this.core?.priority_status;if(null!=e){for(let n of e)if(n.priority>=t)return f(n);return{priority:t,lastSyncedAt:void 0,hasSynced:!1}}}isEqual(t){let e=(t,e)=>e instanceof Error?this.serializeError(e):e,n={core:this.core,jsState:this.jsState},i={core:t.core,jsState:t.jsState};return JSON.stringify(n,e)==JSON.stringify(i,e)}getMessage(){return`SyncStatus<connected: ${this.connected} connecting: ${this.connecting} lastSyncedAt: ${this.lastSyncedAt} hasSynced: ${this.hasSynced}. Downloading: ${this.downloading}. Uploading: ${this.uploading}. UploadError: ${this.uploadError}, DownloadError?: ${this.downloadError}>`}toJSON(){return{core:this.core,dataFlow:{uploading:this.uploading,uploadError:this.serializeError(this.uploadError),downloadError:this.serializeError(this.downloadError)}}}serializeError(t){if(void 0===t)return;let e={name:t.name,message:t.message,stack:t.stack};return void 0!==t.cause&&(e.cause=t.cause instanceof Error?this.serializeError(t.cause):t.cause),e}}function f(t){var e;return{priority:t.priority,hasSynced:t.has_synced??void 0,lastSyncedAt:null==(e=t.last_synced_at)?void 0:new Date(e/1e3)}}class b{status;core;subscription;constructor(t,e){this.status=t,this.core=e,this.subscription={name:e.name,parameters:e.parameters,active:e.active,isDefault:e.is_default,hasExplicitSubscription:e.has_explicit_subscription,expiresAt:null!=e.expires_at?new Date(1e3*e.expires_at):null,hasSynced:null!=e.last_synced_at,lastSyncedAt:null!=e.last_synced_at?new Date(1e3*e.last_synced_at):null}}get progress(){if(this.status.core?.downloading==null)return null;let{total:t,downloaded:e}=this.core.progress;return{totalOperations:t,downloadedOperations:e,downloadedFraction:0==t?0:e/t}}get priority(){return this.core.priority}}var S=h;class E extends S.BaseObserver{options;connectingPromise;syncStreamInitPromise;disconnectingPromise;pendingConnectionOptions;currentOptions;syncStreamImplementation;syncDisposer;locallyActiveSubscriptions=new Map;constructor(t){super(),this.options=t,this.connectingPromise=null,this.syncStreamInitPromise=null,this.disconnectingPromise=null,this.pendingConnectionOptions=null,this.syncStreamImplementation=null,this.currentOptions=null,this.syncDisposer=null}get connector(){return this.pendingConnectionOptions?.connector??null}get connectionOptions(){return this.currentOptions??this.pendingConnectionOptions?.options??null}get logger(){return this.options.logger}async close(){await this.syncStreamImplementation?.dispose(),await this.syncDisposer?.()}async connect(t,e,n){var i;let a=!!this.pendingConnectionOptions;this.pendingConnectionOptions={connector:t,options:(i=this.options.defaultConnectionMethod,{appMetadata:e.appMetadata??{},connectionMethod:e.connectionMethod??i,fetchStrategy:e.fetchStrategy??d.FetchStrategy.Buffered,params:e.params??{},includeDefaultStreams:e.includeDefaultStreams??!0,retryDelayMs:e.retryDelayMs??5e3,crudUploadThrottleMs:e.crudUploadThrottleMs??1e3}),schema:n},(!a||this.syncStreamImplementation)&&await this.disconnectInternal();let r=async()=>{if(this.pendingConnectionOptions)return this.connectingPromise=this.connectInternal().catch(()=>{}).finally(r),this.connectingPromise;this.connectingPromise=null};return this.connectingPromise??=this.connectInternal().catch(()=>{}).finally(r),this.connectingPromise}async connectInternal(){let t=null;await this.disconnectInternal(),this.syncStreamInitPromise=new Promise(async(e,n)=>{try{if(!this.pendingConnectionOptions){this.logger.log({level:o.LogLevels.debug,message:"No pending connection options found, not creating sync stream implementation"}),e();return}if(this.disconnectingPromise)return void e();let{connector:n,options:i,schema:a}=this.pendingConnectionOptions;t=i,this.currentOptions=i,this.pendingConnectionOptions=null;let{sync:r,onDispose:s}=await this.options.createSyncImplementation(n,{subscriptions:this.activeStreams,serializedSchema:a});this.iterateListeners(t=>t.syncStreamCreated?.(r)),this.syncStreamImplementation=r,this.syncDisposer=s,await this.syncStreamImplementation.waitForReady(),e()}catch(t){n(t)}}),await this.syncStreamInitPromise,this.syncStreamInitPromise=null,t&&(await this.disconnectingPromise,this.logger.log({level:o.LogLevels.debug,message:"Attempting to connect to PowerSync instance"}),await this.syncStreamImplementation?.connect(t))}async disconnect(){this.pendingConnectionOptions=null,this.currentOptions=null,await this.disconnectInternal()}async disconnectInternal(){if(this.disconnectingPromise)return this.disconnectingPromise;this.disconnectingPromise=this.performDisconnect(),await this.disconnectingPromise,this.disconnectingPromise=null}async performDisconnect(){await this.syncStreamInitPromise;let t=this.syncStreamImplementation;this.syncStreamImplementation=null;let e=this.syncDisposer;this.syncDisposer=null,await t?.disconnect(),await t?.dispose(),await e?.()}
87stream(t,e,n){let i={name:e,parameters:n},a=e=>t.firstStatusMatching(t=>t.forStream(i)?.subscription.hasSynced,e);return{...i,subscribe:async i=>{await t.rustSubscriptionsCommand({subscribe:{stream:{name:e,params:n},ttl:i?.ttl,priority:i?.priority}}),this.syncStreamImplementation||await t.resolveOfflineSyncStatus();let r=`${e}|${JSON.stringify(n)}`,s=this.locallyActiveSubscriptions.get(r);if(null==s){let t=()=>{this.locallyActiveSubscriptions.delete(r),this.subscriptionsMayHaveChanged()};s=new v(e,n,this.logger,a,t),this.locallyActiveSubscriptions.set(r,s),this.subscriptionsMayHaveChanged()}return new _(s)},unsubscribeAll:async()=>{await t.rustSubscriptionsCommand({unsubscribe:{name:e,params:n}}),this.subscriptionsMayHaveChanged()}}}get activeStreams(){return[...this.locallyActiveSubscriptions.values()].map(t=>({name:t.name,params:t.parameters}))}subscriptionsMayHaveChanged(){this.syncStreamImplementation?.updateSubscriptions(this.activeStreams)}}class v{name;parameters;logger;waitForFirstSync;clearSubscription;refcount=0;constructor(t,e,n,i,a){this.name=t,this.parameters=e,this.logger=n,this.waitForFirstSync=i,this.clearSubscription=a}decrementRefCount(){this.refcount--,0==this.refcount&&this.clearSubscription()}}class _{subscription;active=!0;constructor(t){this.subscription=t,t.refcount++,C?.register(this,t,this)}get name(){return this.subscription.name}get parameters(){return this.subscription.parameters}waitForFirstSync(t){return this.subscription.waitForFirstSync(t)}unsubscribe(){this.active&&(this.active=!1,C?.unregister(this),this.subscription.decrementRefCount())}}let C="FinalizationRegistry"in globalThis?new FinalizationRegistry(t=>{t.logger.log({level:o.LogLevels.warn,message:`A subscription to ${t.name} with params ${JSON.stringify(t.parameters)} leaked! Please ensure calling unsubscribe() when you don't need a subscription anymore. For global subscriptions, consider storing them in global fields to avoid this warning.`})}):null;t.s(["ConnectionManager",0,E],675995);class L{table;head;_length;constructor(t){this.table=[...t],this.head=0,this._length=this.table.length}get isEmpty(){return 0==this.length}get length(){return this._length}removeFirst(){if(this.isEmpty)throw Error("Queue is empty");let t=this.table[this.head];return this._length--,this.table[this.head]=void 0,this.head=(this.head+1)%this.table.length,t}addLast(t){if(this.length==this.table.length)throw Error("Queue is full");this.table[(this.head+this._length)%this.table.length]=t,this._length++}}class T{available;size;firstWaiter;lastWaiter;constructor(t){this.available=new L(t),this.size=this.available.length}addWaiter(t,e){let n={isActive:!0,acquiredItems:[],remainingItems:t,onAcquire:e,prev:this.lastWaiter};return this.lastWaiter?(this.lastWaiter.next=n,this.lastWaiter=n):this.lastWaiter=this.firstWaiter=n,n}deactivateWaiter(t){let{prev:e,next:n}=t;t.isActive=!1,e&&(e.next=n),n&&(n.prev=e),t==this.firstWaiter&&(this.firstWaiter=n),t==this.lastWaiter&&(this.lastWaiter=e)}requestPermits(t,e){if(t<=0||t>this.size)throw Error(`Invalid amount of items requested (${t}), must be between 1 and ${this.size}`);return new Promise((n,i)=>{let a;function r(){i(e?.reason??Error("Semaphore acquire aborted"))}if(e?.aborted)return r();let s=()=>{let t=a.acquiredItems;for(let e of(a.acquiredItems=[],t)){let t=this.firstWaiter;t?(t.acquiredItems.push(e),t.remainingItems--,0==t.remainingItems&&t.onAcquire()):this.available.addLast(e)}},o=()=>{e?.removeEventListener("abort",o),a.isActive&&(this.deactivateWaiter(a),r())},l=()=>{this.deactivateWaiter(a),e?.removeEventListener("abort",o),n({items:a.acquiredItems,release:s})};for(a=this.addWaiter(t,l);!this.available.isEmpty&&a.remainingItems>0;)a.acquiredItems.push(this.available.removeFirst()),a.remainingItems--;if(0==a.remainingItems)return l();e?.addEventListener("abort",o)})}async requestOne(t){let{items:e,release:n}=await this.requestPermits(1,t);return{release:n,item:e[0]}}requestAll(t){return this.requestPermits(this.size,t)}}class A{inner=new T([null]);async acquire(t){let{release:e}=await this.inner.requestOne(t);return e}async runExclusive(t,e){let n=await this.acquire(e);try{return await t()}finally{n()}}}t.s(["Mutex",0,A,"Semaphore",0,T],799386);var O=t.i(804618);let x={useStorageByDefault:!1};class R{options;schema;defaultConfig;cleanupTimeout;isDisposed;constructor(t){this.options=t,this.schema=t.schema,t.db.registerListener({schemaChanged:t=>{this.schema=t}}),this.isDisposed=!1,this.defaultConfig=x;const e=async()=>
87{if(this.cleanupTimeout=null,!this.isDisposed)try{await this.cleanupResources()}catch(t){this.db.logger.log({level:o.LogLevels.error,error:t,message:"Caught error while attempting to cleanup triggers"})}finally{if(this.isDisposed)return;this.cleanupTimeout=setTimeout(e,12e4)}};this.cleanupTimeout=setTimeout(e,12e4)}get db(){return this.options.db}async getUUID(t){let{id:e}=await (t??this.db).get(`
88      SELECT
89        uuid () as id
90    `);return e.replace(/-/g,"_")}async removeTriggers(t,e){for(let n of e)await t.execute(`DROP TRIGGER IF EXISTS ${n}; `)}dispose(){this.isDisposed=!0,this.cleanupTimeout&&clearTimeout(this.cleanupTimeout)}updateDefaults(t){this.defaultConfig={...this.defaultConfig,...t}}generateTriggerName(t,e,n){return`__ps_temp_trigger_${t.toLowerCase()}__${e}__${n}`}async cleanupResources(){await this.db.database.writeLock(async t=>{let e=await t.getAll(`
91        SELECT
92          name
93        FROM
94          sqlite_master
95        WHERE
96          type = 'trigger'
97          AND name LIKE '__ps_temp_trigger_%'
98      `),n=/^__ps_temp_trigger_(?:insert|update|delete)__(.+)__([a-f0-9_]{36})$/i,i=new Map;for(let t of e){let e=t.name.match(n);if(e){let[,n,a]=e,r=i.get(a);r?r.triggerNames.push(t.name):i.set(a,{table:n,id:a,triggerNames:[t.name]})}}for(let e of i.values())if(!await this.options.claimManager.checkClaim(e.id)){for(let n of(this.db.logger.log({level:o.LogLevels.debug,message:`Clearing resources for trigger ${e.id} with table ${e.table}`}),e.triggerNames))await t.execute(`DROP TRIGGER IF EXISTS ${n}`);await t.execute(`DROP TABLE IF EXISTS ${e.table}`)}})}async createDiffTrigger(t){await this.db.waitForReady();let{source:e,destination:n,columns:i,when:a,hooks:r,setupContext:s,useStorage:l=this.defaultConfig.useStorageByDefault}=t,c=Object.keys(a);if(0==c.length)throw Error("At least one WHEN operation must be specified for the trigger.");let u=l?"":"TEMP",h=Object.fromEntries(Object.entries(a).map(([t,e])=>[t,`WHEN ${e}`])),d=this.schema.tables.find(t=>t.viewName==e);if(!d)throw Error(`Source table or view "${e}" not found in the schema.`);let g=i??d.columns.map(t=>t.name),p=d.internalName,m=[],y=await this.getUUID(s),w=l?await this.options.claimManager.obtainClaim(y):null,f=(t="NEW")=>null==i?`${t}.data`:0==i.length?"'{}'":`json_object(${g.map(e=>`'${e}', json_extract(${t}.data, '$.${e}')`).join(", ")})`,b=this.db.registerListener({schemaChanged:()=>{this.db.logger.log({level:o.LogLevels.warn,message:"The PowerSync schema has changed while previously configured triggers are still operational. This might cause unexpected results."})}}),S=async t=>{let{context:e}=t??{};b();let i=async t=>{await this.removeTriggers(t,m),await t.execute(`DROP TABLE IF EXISTS ${n};`),await w?.()};e?await i(e):await this.db.writeLock(i)},E=async t=>{if(await r?.beforeCreate?.(t),await t.execute(`
99        CREATE ${u} TABLE ${n} (
100          operation_id INTEGER PRIMARY KEY AUTOINCREMENT,
101          id TEXT,
102          operation TEXT,
103          timestamp TEXT,
104          value TEXT,
105          previous_value TEXT
106        )
107      `),c.includes(O.DiffTriggerOperation.INSERT)){let e=this.generateTriggerName(O.DiffTriggerOperation.INSERT,n,y);m.push(e),await t.execute(`
108          CREATE ${u} TRIGGER ${e} AFTER INSERT ON ${p} ${h[O.DiffTriggerOperation.INSERT]} BEGIN
109          INSERT INTO
110            ${n} (id, operation, timestamp, value)
111          VALUES
112            (
113              NEW.id,
114              'INSERT',
115              strftime ('%Y-%m-%dT%H:%M:%fZ', 'now'),
116              ${f("NEW")}
117            );
118
119          END
120        `)}if(c.includes(O.DiffTriggerOperation.UPDATE)){let e=this.generateTriggerName(O.DiffTriggerOperation.UPDATE,n,y);m.push(e),await t.execute(`
121          CREATE ${u} TRIGGER ${e} AFTER
122          UPDATE ON ${p} ${h[O.DiffTriggerOperation.UPDATE]} BEGIN
123          INSERT INTO
124            ${n} (id, operation, timestamp, value, previous_value)
125          VALUES
126            (
127              NEW.id,
128              'UPDATE',
129              strftime ('%Y-%m-%dT%H:%M:%fZ', 'now'),
130              ${f("NEW")},
131              ${f("OLD")}
132            );
133
134          END;
135        `)}if(c.includes(O.DiffTriggerOperation.DELETE)){let e=this.generateTriggerName(O.DiffTriggerOperation.DELETE,n,y);m.push(e),await t.execute(`
136          CREATE ${u} TRIGGER ${e} AFTER DELETE ON ${p} ${h[O.DiffTriggerOperation.DELETE]} BEGIN
137          INSERT INTO
138            ${n} (id, operation, timestamp, value)
139          VALUES
140            (
141              OLD.id,
142              'DELETE',
143              strftime ('%Y-%m-%dT%H:%M:%fZ', 'now'),
144              ${f("OLD")}
145            );
146
147          END;
148        `)}};try{return s?await E(s):await this.db.writeLock(E),S}catch(t){try{await S(s?{context:s}:void 0)}catch(e){throw AggregateError([t,e],"Error during operation and cleanup")}throw t}}async trackTableDiff(t){let{source:e,when:n,columns:i,hooks:a,throttleMs:r=30}=t;await this.db.waitForReady();let s=this.schema.tables.find(t=>t.viewName==e);if(!s)throw Error(`Source table or view "${e}" not found in the schema.`);let o=i??s.columns.map(t=>t.name),l=await this.getUUID(),c=`__ps_temp_track_${e}_${l}`,u=new AbortController;this.db.onChange({onChange:async()=>{u.signal.aborted||await this.db.writeTransaction(async e=>{let n=await t.onChange({context:e,destinationTable:c,withDiff:async(t,n,i)=>{let a=i?.castOperationIdAsText?"id, operation, CAST(operation_id AS TEXT) as operation_id, timestamp, value, previous_value":"*",r=`
149                  WITH
150                    DIFF AS (
151                      SELECT
152                        ${a}
153                      FROM
154                        ${c}
155                      ORDER BY
156                        operation_id ASC
157                    ) ${t}
158                `;return e.getAll(r,n)},withExtractedDiff:async(t,n)=>{let i=`
159                  WITH
160                    DIFF AS (
161                      SELECT
162                        id,
163                        ${o.length>0?`${o.map(t=>`json_extract(value, '$.${t}') as ${t}`).join(", ")},`:""} operation_id as __operation_id,
164                        operation as __operation,
165                        timestamp as __timestamp,
166                        previous_value as __previous_value
167                      FROM
168                        ${c}
169                      ORDER BY
170                        __operation_id ASC
171                    ) ${t}
172                `;return e.getAll(i,n)}});return await e.execute(`DELETE FROM ${c};`),n})}},{tables:[c],signal:u.signal,throttleMs:r});try{let t=await this.createDiffTrigger({source:e,destination:c,columns:o,when:n,hooks:a});return async()=>{u.abort(),await t()}}catch(t){try{u.abort()}catch(e){throw AggregateError([t,e],"Error during operation and cleanup")}throw t}}}class I{clientId;id;op;opData;previousValues;table;transactionId;metadata;static fromRow(t){let e=JSON.parse(t.data);return new I(parseInt(t.id),e.op,e.type,e.id,t.tx_id,e.data,e.old,e.metadata)}constructor(t,e,n,i,a,r,s,o){this.clientId=t,this.id=i,this.op=e,this.opData=r,this.table=n,this.transactionId=a,this.previousValues=s,this.metadata=o}toJSON(){return{op_id:this.clientId,op:this.op,type:this.table,id:this.id,tx_id:this.transactionId,data:this.opData,old:this.previousValues,metadata:this.metadata}}equals(t){return JSON.stringify(this.toComparisonArray())==JSON.stringify(t.toComparisonArray())}toComparisonArray(){return[this.transactionId,this.clientId,this.op,this.table,this.id,this.opData,this.previousValues,this.metadata]}}var D=t.i(279933),k=h;class M extends k.BaseObserver{get listenerCounts(){let t={},e=0;for(let n of this.listeners)for(let i in n)n[i]&&(t[i]=(t[i]??0)+1,e++);return{...t,total:e}}get listenerMeta(){return{counts:this.listenerCounts,registerListener:t=>this.metaListener.registerListener(t)}}metaListener;constructor(){super(),this.metaListener=new k.BaseObserver}registerListener(t){let e=super.registerListener(t),n=this.listenerCounts;return this.metaListener.iterateListeners(t=>{t.listenersChanged?.(n)}),()=>{e();let t=this.listenerCounts;this.metaListener.iterateListeners(e=>{e.listenersChanged?.(t)})}}}class U extends M{options;state;abortController;initialized;_closed;disposeListeners;get closed(){return this._closed}constructor(t){super(),this.options=t,this.abortController=new AbortController,this._closed=!1,this.state=this.constructInitialState(),this.disposeListeners=null,this.initialized=this.init(this.abortController.signal)}constructInitialState(){return{isLoading:!0,isFetching:this.reportFetching,error:null,lastUpdated:null,data:this.options.placeholderData}}get reportFetching(){return this.options.watchOptions.reportFetching??!0}async updateSettingsInternal(t,e){this._closed||e.aborted||(this.options.watchOptions=t,this.iterateListeners(t=>t[D.WatchedQueryListenerEvent.SETTINGS_WILL_UPDATE]?.()),!this.state.isFetching&&this.reportFetching&&await this.updateState({isFetching:!0}),await this.runWithReporting(()=>this.linkQuery({abortSignal:e,settings:t})))}async updateSettings(t){this.abortController.abort();let e=new AbortController;return this.abortController=e,await this.initialized,this.updateSettingsInternal(t,e.signal)}async updateState(t){this._closed||(void 0!==t.error&&(await this.iterateAsyncListenersWithError(async e=>e.onError?.(t.error)),t.isFetching=!1,t.isLoading=!1),Object.assign(this.state,{lastUpdated:new Date},t),void 0!==t.data&&await this.iterateAsyncListenersWithError(async t=>t.onData?.(this.state.data)),await this.iterateAsyncListenersWithError(async t=>t.onStateChange?.(this.state)))}async init(t){let{db:e}=this.options,n=e.registerListener({closing:async()=>{await this.close()}});
172await e.waitForReady();let i=e.registerListener({schemaChanged:async()=>{await this.runWithReporting(async()=>{await this.updateSettings(this.options.watchOptions)})}});this.disposeListeners=()=>{n(),i()},await this.runWithReporting(async()=>{await this.updateSettingsInternal(this.options.watchOptions,t)})}async close(){this._closed=!0,this.abortController.abort(),this.disposeListeners?.(),this.disposeListeners=null,this.iterateListeners(t=>t.closed?.()),this.listeners.clear()}async runWithReporting(t){try{await t()}catch(t){await this.updateState({error:t})}}async iterateAsyncListenersWithError(t){try{await this.iterateAsyncListeners(async e=>t(e))}catch(t){try{await this.iterateAsyncListeners(async e=>e.onError?.(t))}catch(t){this.options.db.logger.log({level:o.LogLevels.error,message:"Watched query error handler threw an Error",error:t})}}}}class N extends U{options;constructor(t){super(t),this.options=t}checkEquality(t,e){return this.options.comparator?.checkEquality?.(t,e)??!1}async linkQuery(t){let{db:e,watchOptions:n}=this.options,{abortSignal:i}=t,a=n.query.compile(),r=await e.resolveTables(a.sql,a.parameters,{tables:t.settings.triggerOnTables});e.onChangeWithCallback({onChange:async()=>{if(!this.closed&&!i.aborted)try{this.reportFetching&&!this.state.isFetching&&await this.updateState({isFetching:!0});let t={},e=await n.query.execute({sql:a.sql,parameters:[...a.parameters],db:this.options.db});if(i.aborted)return;this.reportFetching&&(t.isFetching=!1),this.state.isLoading&&(t.isLoading=!1),this.checkEquality(e,this.state.data)||Object.assign(t,{data:e}),this.state.error&&(t.error=null),Object.keys(t).length>0&&await this.updateState(t)}catch(t){await this.updateState({error:t})}}},{signal:i,tables:r,throttleMs:n.throttleMs,triggerImmediate:!0})}}let P=Symbol.asyncIterator??Symbol.for("Symbol.asyncIterator"),F={done:!0,value:void 0};function q(t){return{done:!1,value:t}}class ${options;waitingConsumer;outstandingEvents;constructor(t={}){this.options=t,this.outstandingEvents=[]}get countOutstandingEvents(){return this.outstandingEvents.length}notifyInner(t){let e=this.waitingConsumer;this.waitingConsumer=void 0;let n=e=>{t(e),this.options.eventDelivered?.()};e?n(e):this.outstandingEvents.push(n)}notify(t){this.notifyInner(e=>e.resolve(t))}notifyError(t){this.notifyInner(e=>e.reject(t))}waitForEvent(t){return new Promise((e,n)=>{if(null!=this.waitingConsumer)throw Error("Illegal call to waitForEvent, already has a waiter.");let i=()=>{t?.removeEventListener("abort",a)},a=()=>{i(),this.waitingConsumer=void 0,e(void 0)},r={resolve:t=>{i(),e(t)},reject:t=>{i(),n(t)}};if(t.aborted)e(void 0);else if(this.countOutstandingEvents>0){let[t]=this.outstandingEvents.splice(0,1);t(r)}else this.waitingConsumer=r,t.addEventListener("abort",a)})}static queueBasedAsyncIterable(t,e){return{[P]:()=>{let n=new $,i=new AbortController;function a(){i.abort(),e?.removeEventListener("abort",a)}return e&&(e.aborted?i.abort():e.addEventListener("abort",a)),t(n,i.signal),{async next(){let t=await n.waitForEvent(i.signal);return null==t?F:q(t)},return:async()=>(a(),F)}}}}}class W{task;runningTask;pendingTaskParam;isThrottling;closed;constructor(t,e){this.task=t;const{throttleEnabled:n=!0}=e??{};this.isThrottling=n,this.closed=!1}schedule(t){if(!this.closed){if(!this.isThrottling)return void this.task(t);if(this.runningTask){this.pendingTaskParam=t;return}this.execute(t)}}dispose(){this.closed=!0,this.runningTask&&(this.runningTask=void 0)}async execute(t){this.runningTask=this.task(t);try{await this.runningTask}finally{if(this.runningTask=void 0,this.pendingTaskParam){let t=this.pendingTaskParam;this.pendingTaskParam=void 0,this.execute(t)}}}}let B={checkEquality:()=>!1},H={keyBy:t=>t&&"object"==typeof t&&"string"==typeof t.id?t.id:JSON.stringify(t),compareBy:t=>JSON.stringify(t)};class Q extends U{options;comparator;constructor(t){super(t),this.options=t,this.comparator=t.rowComparator??H}differentiate(t,e){let{keyBy:n,compareBy:i}=this.comparator,a=!1,r=new Map,s=new Set(e.keys()),o={all:[],added:[],removed:[],updated:[],unchanged:[]};for(let l of t){let t=n(l),c=i(l);r.set(t,{hash:c,item:l});let u=e.get(t);u?c==u.hash?(o.unchanged.push(u.item),o.all.push(u.item),r.set(t,u)):(a=!0,o.updated.push({current:l,previous:u.item}),o.all.push(l)):(a=!0,o.added.push(l),o.all.push(l)),s.delete(t)}return o.removed=Array.from(s).map(t=>e.get(t).item),a=a||o.removed.length>0,{diff:o,hasChanged:a,map:r}}
172async linkQuery(t){let{db:e,watchOptions:n}=this.options,{abortSignal:i}=t,a=n.query.compile(),r=await e.resolveTables(a.sql,a.parameters,{tables:t.settings.triggerOnTables}),s=new Map;this.state.data.forEach(t=>{s.set(this.comparator.keyBy(t),{hash:this.comparator.compareBy(t),item:t})}),e.onChangeWithCallback({onChange:async()=>{if(!this.closed&&!i.aborted)try{this.reportFetching&&!this.state.isFetching&&await this.updateState({isFetching:!0});let t={},e=await n.query.execute({sql:a.sql,parameters:[...a.parameters],db:this.options.db});if(i.aborted)return;this.reportFetching&&(t.isFetching=!1),this.state.isLoading&&(t.isLoading=!1);let{diff:r,hasChanged:o,map:l}=this.differentiate(e,s);s=l,o&&(await this.iterateAsyncListenersWithError(t=>t.onDiff?.(r)),Object.assign(t,{data:r.all})),this.state.error&&(t.error=null),Object.keys(t).length>0&&await this.updateState(t)}catch(t){await this.updateState({error:t})}}},{signal:i,tables:r,throttleMs:n.throttleMs,triggerImmediate:!0})}}class z{options;constructor(t){this.options=t}resolveOptions(t){return{reportFetching:t?.reportFetching??!0,throttleMs:t?.throttleMs??30,triggerOnTables:t?.triggerOnTables}}watch(t){return new N({db:this.options.db,comparator:t?.comparator??B,placeholderData:t?.placeholderData??[],watchOptions:{...this.resolveOptions(t),query:this.options.query}})}differentialWatch(t){return new Q({db:this.options.db,rowComparator:t?.rowComparator,placeholderData:t?.placeholderData??[],watchOptions:{...this.resolveOptions(t),query:this.options.query}})}}let j=new Map,V={async obtainClaim(t){if(j.has(t))throw Error(`A claim is already present for ${t}`);let e=async()=>{j.delete(t)};return j.set(t,e),e},checkClaim:async t=>j.has(t)},J=/(^ps_data__|^ps_data_local__)/,G={clearLocal:!0},Y={disconnect:!0};class K extends h.BaseObserver{options;closed;ready;currentStatus;sdkVersion;bucketStorageAdapter;_isReadyPromise;connectionManager;subscriptions;get syncStreamImplementation(){return this.connectionManager.syncStreamImplementation}get connector(){return this.connectionManager.connector}get connectionOptions(){return this.connectionManager.connectionOptions}_schema;_database;runExclusiveMutex;triggers;triggersImpl;logger;constructor(t){super(),this.options=t,this.logger=t.logger??(0,o.createConsoleLogger)();const{schema:e}=t;if("function"!=typeof e?.toJSON)throw Error("The `schema` option should be provided and should be an instance of `Schema`.");this._database=this.openDBAdapter(),this.bucketStorageAdapter=this.generateBucketStorageAdapter(),this.closed=!1,this.currentStatus=new w(null,{}),this.options={...t},this._schema=e,this.ready=!1,this.sdkVersion="",this.runExclusiveMutex=new A,this.subscriptions={firstStatusMatching:(t,e)=>this.waitForStatus(t,e),resolveOfflineSyncStatus:()=>this.resolveOfflineSyncStatus(),rustSubscriptionsCommand:async t=>{await this.writeTransaction(e=>e.execute("select powersync_control(?,?)",["subscriptions",JSON.stringify(t)]))}},this.connectionManager=new E({createSyncImplementation:async(t,e)=>(await this.waitForReady(),this.runExclusive(async()=>{let n=this.generateSyncStreamImplementation(t,e),i=n.registerListener({statusChanged:t=>{let e=null==t.core&&null!=this.currentStatus.core?new w(this.currentStatus.core,t.jsState):t;this.currentStatus=e,this.iterateListeners(t=>t.statusChanged?.(e))}});return await n.waitForReady(),{sync:n,onDispose:i}})),logger:this.logger,defaultConnectionMethod:this.defaultConnectionMethod}),this._isReadyPromise=this.initialize(),this.triggers=this.triggersImpl=new R({db:this,schema:this.schema,...this.generateTriggerManagerConfig()})}get defaultConnectionMethod(){return d.SyncStreamConnectionMethod.HTTP}get schema(){return this._schema}get database(){return this._database}get connected(){return this.currentStatus?.connected||!1}get connecting(){return this.currentStatus?.connecting||!1}generateTriggerManagerConfig(){return{claimManager:V}}async waitForReady(){this.ready||await this._isReadyPromise}async waitForFirstSync(t){let e=t instanceof AbortSignal?t:t?.signal,n=t&&"priority"in t?t.priority:void 0,i=void 0===n?t=>t.hasSynced:t=>t.statusForPriority(n)?.hasSynced==!0;return this.waitForStatus(i,e)}async waitForStatus(t,e){if(!t(this.currentStatus))return new Promise(n=>{let i=this.registerListener({statusChanged:e=>{t(e)&&a()}});function a(){i(),n()}e?.aborted?a():e?.addEventListener("abort",a)})}async initialize(){await this._initialize(),await this.loadVersion(),await this.updateSchema(this.options.schema),await this.resolveOfflineSyncStatus(),await this.database.execute("PRAGMA RECURSIVE_TRIGGERS=TRUE"),await this.triggersImpl.cleanupResources(),this.ready=!0,this.iterateListeners(t=>t.initialized?.())}async loadVersion(){let t,e,n;try{let{version:t}=await this.database.get("SELECT powersync_rs_version() as version");this.sdkVersion=t}catch(t){throw Error(`The powersync extension is not loaded correctly. Details: ${t.message}`)}try{[t,e,n]=this.sdkVersion.split(/[.\/]/).slice(0,3).map(t=>parseInt(t))}
172catch(t){throw Error(`Unsupported powersync extension version. Need >=0.5.2 <0.6.0, got: ${this.sdkVersion}. Details: ${t.message}`)}if(0!=t||5!=e||n<2)throw Error(`Unsupported powersync extension version. Need >=0.5.2 <0.6.0, got: ${this.sdkVersion}`)}async resolveOfflineSyncStatus(){let t=new w(JSON.parse((await this.database.get("SELECT powersync_offline_sync_status() as r")).r),this.currentStatus.jsState);t.isEqual(this.currentStatus)||(this.currentStatus=t,this.iterateListeners(t=>t.statusChanged?.(this.currentStatus)))}async updateSchema(t){if(this.syncStreamImplementation)throw Error("Cannot update schema while connected");try{t.validate()}catch(t){this.logger.log({level:o.LogLevels.warn,message:"Schema validation failed. Unexpected behaviour could occur",error:t})}this._schema=t,await this.database.writeTransaction(t=>t.execute("SELECT powersync_replace_schema(?)",[JSON.stringify(this.schema.toJSON())])),await this.database.refreshSchema(),this.iterateListeners(async e=>e.schemaChanged?.(t))}async init(){return this.waitForReady()}runExclusive(t){return this.runExclusiveMutex.runExclusive(t)}async connect(t,e){return this.connectionManager.connect(t,e??{},this.schema.toJSON())}async disconnect(){return this.connectionManager.disconnect()}async disconnectAndClear(t=G){await this.disconnect(),await this.waitForReady();let{clearLocal:e}=t;await this.database.writeTransaction(async t=>{await t.execute("SELECT powersync_clear(?)",[+!!e])}),await this.resolveOfflineSyncStatus()}syncStream(t,e){return this.connectionManager.stream(this.subscriptions,t,e??null)}async close(t=Y){if(await this.waitForReady(),this.closed)return;this.triggersImpl.dispose(),await this.iterateAsyncListeners(async t=>t.closing?.());let{disconnect:e}=t;e&&await this.disconnect(),await this.connectionManager.close(),await this.database.close(),this.closed=!0,await this.iterateAsyncListeners(async t=>t.closed?.()),super.dispose()}async getUploadQueueStats(t){return this.readTransaction(async e=>{if(t){let t=await e.get(`SELECT SUM(cast(data as blob) + 20) as size, count(*) as count FROM ${a.CRUD}`);return new u.UploadQueueStats(t.count??0,t.size??0)}{let{count:t}=await e.get(`SELECT count(*) as count FROM ${a.CRUD}`);return new u.UploadQueueStats(t??0)}})}async getCrudBatch(t=100){let e=(await this.getAll(`SELECT id, tx_id, data FROM ${a.CRUD} ORDER BY id ASC LIMIT ?`,[t+1])).map(t=>I.fromRow(t))??[],n=!1;if(e.length>t&&(e.pop(),n=!0),0==e.length)return null;let i=e[e.length-1];return new l.CrudBatch(e,n,async t=>this.bucketStorageAdapter.handleCrudCheckpoint(i.clientId,t))}async getNextCrudTransaction(){let t=this.getCrudTransactions()[P]();return(await t.next()).value}getCrudTransactions(){return{[P]:()=>{let t=-1,e=`
173WITH RECURSIVE crud_entries AS (
174  SELECT id, tx_id, data FROM ps_crud WHERE id = (SELECT min(id) FROM ps_crud WHERE id > ?)
175  UNION ALL
176  SELECT ps_crud.id, ps_crud.tx_id, ps_crud.data FROM ps_crud
177    INNER JOIN crud_entries ON crud_entries.id + 1 = rowid
178  WHERE crud_entries.tx_id = ps_crud.tx_id
179)
180SELECT * FROM crud_entries;
181    `;return{next:async()=>{let n=await this.database.getAll(e,[t]);if(0==n.length)return{done:!0,value:null};let i=n.map(t=>I.fromRow(t)),a=i[i.length-1],r=a.transactionId;return t=a.clientId,{done:!1,value:new c.CrudTransaction(i,async t=>
181this.bucketStorageAdapter.handleCrudCheckpoint(a.clientId,t),r)}}}}}}async getClientId(){return this.bucketStorageAdapter.getClientId()}async execute(t,e){return this.writeLock(n=>n.execute(t,e))}async executeRaw(t,e){return await this.waitForReady(),this.database.executeRaw(t,e)}async executeBatch(t,e){return await this.waitForReady(),this.database.executeBatch(t,e)}async getAll(t,e){return await this.waitForReady(),this.database.getAll(t,e)}async getOptional(t,e){return await this.waitForReady(),this.database.getOptional(t,e)}async get(t,e){return await this.waitForReady(),this.database.get(t,e)}async readLock(t){return await this.waitForReady(),this.database.readLock(t)}async writeLock(t){return await this.waitForReady(),this.database.writeLock(t)}async readTransaction(t,e=12e4){return await this.waitForReady(),this.database.readTransaction(async e=>{let n=await t(e);return await e.rollback(),n},{timeoutMs:e})}async writeTransaction(t,e=12e4){return await this.waitForReady(),this.database.writeTransaction(async e=>{let n=await t(e);return await e.commit(),n},{timeoutMs:e})}watch(t,e,n,i){return n&&"object"==typeof n&&"onResult"in n?this.watchWithCallback(t,e,n,i):this.watchWithAsyncGenerator(t,e,n)}query(t){let{sql:e,parameters:n=[],mapper:i}=t;return this.customQuery({compile:()=>({sql:e,parameters:n}),execute:async({sql:t,parameters:e})=>{let n=await this.getAll(t,e);return i?n.map(i):n}})}customQuery(t){return new z({db:this,query:t})}watchWithCallback(t,e,n,i){let{onResult:a,onError:r=t=>this.logger.log({level:o.LogLevels.error,message:"Error in watch",error:t})}=n??{};if(!a)throw Error("onResult is required");let{comparator:s}=i??{},l=new N({db:this,comparator:s,placeholderData:null,watchOptions:{query:{compile:()=>({sql:t,parameters:e??[]}),execute:()=>this.executeReadOnly(t,e)},reportFetching:!1,throttleMs:i?.throttleMs??30,triggerOnTables:i?.tables}}),c=l.registerListener({onData:t=>{t&&a(t)},onError:t=>{r(t)}});i?.signal?.addEventListener("abort",()=>{c(),l.close()})}watchWithAsyncGenerator(t,e,n){return $.queueBasedAsyncIterable((i,a)=>{this.watchWithCallback(t,e,{onResult:t=>{i.notify(t)},onError:t=>{i.notifyError(t)}},{...n,signal:a})},n?.signal)}async resolveTables(t,e,n){let i=n?.tables?[...n.tables]:[];if(!n?.tables){let n=(await this.getAll(`EXPLAIN ${t}`,e)).filter(t=>"OpenRead"==t.opcode&&0==t.p3&&"number"==typeof t.p2).map(t=>t.p2);for(let t of(await this.getAll("SELECT DISTINCT tbl_name FROM sqlite_master WHERE rootpage IN (SELECT json_each.value FROM json_each(?))",[JSON.stringify(n)])))i.push(t.tbl_name.replace(J,""))}return i}onChange(t,e){return t&&"object"==typeof t&&"onChange"in t?this.onChangeWithCallback(t,e):this.onChangeWithAsyncGenerator(t)}onChangeWithCallback(t,e){var n;let i,a,{onChange:r}=t??{};if(!r)throw Error("onChange is required");let s=e??{},o=new Set((s?.tables??[]).flatMap(t=>[t,`ps_data__${t}`,`ps_data_local__${t}`])),l=new Set,c=s.throttleMs??30,u=new W(r),h=(n=()=>this.handleTableChanges(l,o,t=>{s?.signal?.aborted||u.schedule({changedTables:t})}),i=null,a=()=>{n(),i=null},function(){null==i&&(i=setTimeout(a,c))});e?.triggerImmediate&&u.schedule({changedTables:[]});let d=this.database.registerListener({tablesUpdated:async t=>{this.processTableUpdates(t,l),h()}});return s.signal?.addEventListener("abort",()=>{u.dispose(),d()}),()=>d()}onChangeWithAsyncGenerator(t){return $.queueBasedAsyncIterable((e,n)=>{this.onChangeWithCallback({onChange:t=>{e.notify(t)}},{...t,signal:n})},t?.signal)}createMutex(){return new A}handleTableChanges(t,e,n){if(t.size>0){let i=Array.from(t.values()).filter(t=>e.has(t));i.length&&n(i)}t.clear()}processTableUpdates({tables:t},e){for(let n of t)e.add(n)}async executeReadOnly(t,e){return await this.waitForReady(),this.database.readLock(n=>n.execute(t,e))}}t.s(["BasePowerSyncDatabase",0,K],800664);var X=h;class Z extends X.BaseObserver{db;logger;updateListener;_clientId;constructor(t,e){super(),this.db=t,this.logger=e,this.updateListener=t.registerListener({tablesUpdated:({tables:t})=>{t.includes(a.CRUD)&&this.iterateListeners(t=>t.crudUpdate?.())}})}async dispose(){this.updateListener?.()}async _getClientId(){return(await this.db.get("SELECT powersync_client_id() as client_id")).client_id}getClientId(){return null==this._clientId&&(this._clientId=this._getClientId()),this._clientId}async updateLocalTarget(t){let e=await this.db.readTransaction(async t=>{if(await p(t)!=m)return;let e=await t.getOptional("SELECT seq FROM main.sqlite_sequence WHERE name = 'ps_crud'");return e?.seq});if(null==e)return!1;let n=await t();return this.writeTransaction(async t=>{let i=await t.execute("SELECT 1 FROM ps_crud LIMIT 1");if(i.rows?.length)return this.logger.log({level:o.LogLevels.debug,message:`New data uploaded since write checkpoint ${n} - need new write checkpoint`}),!1;let{seq:a}=await t.get("SELECT seq FROM main.sqlite_sequence WHERE name = 'ps_crud'");return a!=e?(this.logger.log({level:o.LogLevels.debug,message:`New data uploaded since write checpoint ${n} - need new write checkpoint (sequence updated)`}),!1):(this.logger.log({level:o.LogLevels.debug,message:`Updating target write checkpoint to ${n}`}),await p(t,n),!0)})}async nextCrudItem(){let t=await this.db.getOptional("SELECT * FROM ps_crud ORDER BY id ASC LIMIT 1");if(t)return I.fromRow(t)}async hasCrud(){return!!await this.db.getOptional("SELECT 1 FROM ps_crud LIMIT 1")}async getCrudBatch(t=100){if(!await this.hasCrud())return null;let e=await this.db.getAll("SELECT * FROM ps_crud ORDER BY id ASC LIMIT ?",[t]),n=[];for(let t of e)n.push(I.fromRow(t));if(0===n.length)return null;let i=n[n.length-1];return{crud:n,haveMore:!0,complete:async t=>this.handleCrudCheckpoint(i.clientId,t)}}handleCrudCheckpoint(t,e){return this.writeTransaction(async n=>{if(await n.execute("DELETE FROM ps_crud WHERE id <= ?",[t]),e){let t=await n.execute("SELECT 1 FROM ps_crud LIMIT 1");t.rows?.length&&await p(n,e)}else await p(n,m)})}async writeTransaction(t,e){return this.db.writeTransaction(t,e)}async control(t,e){return await this.writeTransaction(async n=>await g(n,t,e))}async hasMigratedSubkeys(){let{r:t}=await this.db.get("SELECT EXISTS(SELECT * FROM ps_kv WHERE key = ?) as r",[Z._subkeyMigrationKey]);return 0!=t}async migrateToFixedSubkeys(){await this.writeTransaction(async t=>{await t.execute("UPDATE ps_oplog SET key = powersync_remove_duplicate_key_encoding(key
181);"),await t.execute("INSERT OR REPLACE INTO ps_kv (key, value) VALUES (?, ?);",[Z._subkeyMigrationKey,"1"])})}static _subkeyMigrationKey="powersync_js_migrated_subkeys"}t.s(["SqliteBucketStorage",0,Z],826663);class tt extends Error{reason;constructor(t){super(t),this.reason=t,Object.setPrototypeOf(this,tt.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,tt)}}t.s(["AbortOperation",0,tt],592489);let te=/\/+$/,tn={LogLevels:o.LogLevels,EventQueue:$,AbortOperation:tt};t.s(["AbstractRemote",0,class{connector;logger;credentials=null;constructor(t,e){this.connector=t,this.logger=e}async getCredentials(){return this.credentials?this.credentials:this.prefetchCredentials()}async prefetchCredentials(){return this.credentials=await this.fetchCredentials(),this.credentials}async fetchCredentials(){let t=await this.connector.fetchCredentials();if(t?.endpoint.match(te))throw Error(`A trailing forward slash "/" was found in the fetchCredentials endpoint: "${t.endpoint}". Remove the trailing forward slash "/" to fix this error.`);return t}invalidateCredentials(){this.credentials=null,this.connector.invalidateCredentials?.()}getUserAgent(){return"powersync-js/1.1.1"}async buildRequest(t){let e=await this.getCredentials();if(null!=e&&(null==e.endpoint||""==e.endpoint))throw Error("PowerSync endpoint not configured");if(e?.token==null||e?.token==""){let t=Error("Not signed in");throw t.status=401,t}let n=this.getUserAgent();return{url:e.endpoint+t,headers:{"content-type":"application/json",Authorization:`Token ${e.token}`,"x-user-agent":n},userAgent:n,path:t}}async get(t,e){let n=await this.buildRequest(t),i=await this.fetch({resource:n.url,request:{method:"GET",headers:{...e,...n.headers}},expectStreamingResponse:!1});if(401===i.status&&this.invalidateCredentials(),!i.ok)throw Error(`Received ${i.status} - ${i.statusText} when getting from ${t}: ${await i.text()}}`);return i.json()}createTextDecoder(){return new TextDecoder}createSocket(t){return new WebSocket(t)}async socketStreamRaw(t){let e=await this.loadWebSocketSupport(tn),n=await this.buildRequest(t.path);n.url=n.url.replace(/^https?:\/\//,function(t){return"https://"===t?"wss://":"ws://"});let{fetchStrategy:i=d.FetchStrategy.Buffered,abortSignal:a,data:r}=t;
181return await e.webSocketSyncStream({remote:this,buffered:i==d.FetchStrategy.Buffered,abortSignal:a,requestPayload:r,request:n})}async fetchStreamRaw(t){let e,{data:n,path:i,abortSignal:a}=t,r=await this.buildRequest(i);if(a.aborted)throw new tt("Abort request received before making fetchStreamRaw request");let s=new AbortController,l=null;a.addEventListener("abort",()=>{let t=a.reason??new tt("Cancelling network request before it resolves. Abort signal has been received.");null==l?s.abort(t):l.cancel(t).catch(()=>{})});let c=!1;try{let t="application/vnd.powersync.bson-stream";if(!(e=await this.fetch({resource:r.url,request:{method:"POST",headers:{...r.headers,accept:`${t};q=0.9,application/x-ndjson;q=0.8`},body:JSON.stringify(n),signal:s.signal,cache:"no-store"},expectStreamingResponse:!0})).ok||!e.body){let t=await e.text(),n=Error(`HTTP ${e.statusText}: ${t}`);throw n.status=e.status,this.logger.log({level:o.LogLevels.error,message:`Could not POST streaming to ${i} - ${e.status} - ${e.statusText}: ${t}`,error:n}),401===e.status&&this.invalidateCredentials(),n}c=e.headers.get("content-type")==t}catch(t){if("AbortError"==t.name)throw new tt(`Pending fetch request to ${r.url} has been aborted.`);throw t}return l=e.body.getReader(),{isBson:c,stream:{next:async()=>{if(s.signal.aborted)return F;try{return await l.read()}catch(t){if(s.signal.aborted)return F;throw t}}}}}async fetchStream(t){var e;let n,i,a,{isBson:r,stream:s}=await this.fetchStreamRaw(t);if(r){let t,e,n,i,a;return t=[],e=!1,n=new DataView(new ArrayBuffer(4)),i=null,a=4,{async next(){for(;;){if(t.length)return q(t.shift());if(e)return F;let r=await s.next();if(r.done){if(e=!0,i||4!=a)throw Error("illegal end of stream in BSON object");return F}let o=r.value;for(let e=0;e<o.length;){let r=o.length-e;if(i){let n=Math.min(r,a),s=new Uint8Array(o.buffer,o.byteOffset+e,n);i.set(s,i.length-a),e+=n,0==(a-=n)&&(t.push(i),i=null,a=4)}else{let t=Math.min(r,a);for(let i=0;i<t;i++)n.setUint8(4-a+i,o[e+i]);if(e+=t,0==(a-=t)){let t=n.getInt32(0,!0);if((a=t-4)<1)throw Error(`invalid length for bson: ${t}`);new DataView((i=new Uint8Array(t)).buffer).setInt32(0,t,!0)}}}}}}}return e=this.createTextDecoder(),n="",i=[],a=!1,{next:async()=>{for(;;){if(a)return F;{let t=i.shift();if(t)return{done:!1,value:t}}let{done:t,value:r}=await s.next();if(t){let t=n.trim();if(0!=t.length)return a=!0,{done:!1,value:t};return F}let o=e.decode(r,{stream:!0}),l=(n+=o).split("\n");for(let t=0;t<l.length-1;t++){let e=l[t].trim();e.length>0&&i.push(e)}n=l[l.length-1]}}}}}],258472);var ti=h;(i=s||(s={})).CRUD="crud",i.SYNC="sync";class ta extends ti.BaseObserver{options;abortController;crudUpdateListener;streamingSyncPromise;logger;activeStreams;connectionMayHaveChanged=!1;crudUploadNotifier=(function(){let t=new $;return{notify(){t.countOutstandingEvents>0||t.notify()},waitForNotification:e=>t.waitForEvent(e)}})();notifyCompletedUploads;handleActiveStreamsChange;syncStatus;constructor(t){super(),this.options=t,this.activeStreams=t.subscriptions,this.logger=t.logger,this.syncStatus=new w(null,{}),this.abortController=null}triggerCrudUpload(){this.crudUploadNotifier.notify()}async waitForReady(){}waitUntilStatusMatches(t){return new Promise(e=>{if(t(this.syncStatus))return void e();let n=this.registerListener({statusChanged:()=>{t(this.syncStatus)&&(e(),n?.())}})})}get lastSyncedAt(){let t=this.syncStatus.lastSyncedAt;return t&&new Date(t)}get isConnected(){return this.syncStatus.connected}async dispose(){super.dispose(),this.crudUpdateListener?.(),this.crudUpdateListener=void 0}async getWriteCheckpoint(){let t=await this.options.adapter.getClientId(),e=`/write-checkpoint2.json?client_id=${t}`,n=(await this.options.remote.get(e)).data.write_checkpoint;return this.logger.log({level:o.LogLevels.debug,message:`Created write checkpoint: ${n}`}),n}async crudUploadLoop(t,e){for(;!t.aborted;)await Promise.all([this._uploadAllCrud(t,e),this.delayRetry(t,e.crudUploadThrottleMs)]),await this.crudUploadNotifier.waitForNotification(t)}async _uploadAllCrud(t,e){return this.obtainLock({type:s.CRUD,signal:t,callback:async()=>{let n;for(;!t.aborted;)try{let t=await this.options.adapter.nextCrudItem();if(t){if(this.updateJsSyncState({uploading:!0}),t.clientId==n?.clientId)throw this.logger.log({level:o.LogLevels.warn,message:`Potentially previously uploaded CRUD entries are still present in the upload queue.
182Make sure to handle uploads and complete CRUD transactions or batches by calling and awaiting their [.complete()] method.
183The next upload iteration will be delayed.`}),Error("Delaying due to previously encountered CRUD item.");n=t,await this.options.uploadCrud(),this.updateJsSyncState({uploadError:void 0})}else{await this.options.adapter.updateLocalTarget(()=>this.getWriteCheckpoint())?this.notifyCompletedUploads?.():null!=n&&this.logger.log({level:o.LogLevels.debug,message:"Upload complete, no write checkpoint needed."});break}}catch(i){if(n=void 0,this.updateJsSyncState({uploading:!1,uploadError:i}),await this.delayRetry(t,e.retryDelayMs),!this.isConnected)break;this.logger.log({level:o.LogLevels.debug,message:"Caught exception when uploading. Upload will retry after a delay.",error:i})}finally{this.updateJsSyncState({uploading:!1})}}})}async connect(t){this.abortController&&await this.disconnect();let e=new AbortController;return this.abortController=e,this.streamingSyncPromise=Promise.all([this.crudUploadLoop(e.signal,t).catch(t=>this.logger.log({level:o.LogLevels.error,message:"Error in crud upload loop",error:t})),this.streamingSync(e.signal,t)]),new Promise(t=>{let e=!1,n=this.registerListener({statusChanged:i=>{if(i.connecting&&(e=!0),null!=i.downloadError)this.logger.log({level:o.LogLevels.warn,message:"Initial connect attempt did n
183ot successfully connect to server"});else if(!e||i.connecting)return;n(),t()}})})}async disconnect(){if(this.abortController){this.abortController.signal.aborted||this.abortController.abort(new tt("Disconnect has been requested"));try{await this.streamingSyncPromise}catch(t){this.logger.log({level:o.LogLevels.warn,message:"Error in sync while disconnecting",error:t})}this.streamingSyncPromise=void 0,this.abortController=null,this.markAsDisconnected()}}markAsDisconnected(){let t=this.syncStatus.core;null!=t&&this.updateSyncStatus({connected:!1,connecting:!1,priority_status:t.priority_status,downloading:null,streams:t.streams})}async streamingSync(t,e){this.crudUpdateListener=this.options.adapter.registerListener({crudUpdate:()=>this.triggerCrudUpload()});let n=new AbortController;for(t.addEventListener("abort",()=>{n.abort(t?.reason??new tt("Received command to disconnect from upstream")),this.crudUpdateListener?.(),this.crudUpdateListener=void 0,this.markAsDisconnected()});;){let i=!0,a=null;try{if(t?.aborted)break;a=await this.streamingSyncIteration(n.signal,e)}catch(t){t instanceof tt?(this.logger.log({level:o.LogLevels.warn,message:"Sync aborted",error:t}),i=!1):this.connectionMayHaveChanged&&t.message?.indexOf("No iteration is active")>=0?(this.connectionMayHaveChanged=!1,this.logger.log({level:o.LogLevels.info,message:"Sync error after changed connection, retrying immediately"}),i=!1):this.logger.log({level:o.LogLevels.error,message:"Sync error",error:t}),this.updateJsSyncState({downloadError:t})}finally{this.notifyCompletedUploads=void 0,t.aborted||(n.abort(new tt("Closing sync stream network requests before retry.")),n=new AbortController),a?.immediateRestart!=!0&&(this.markAsDisconnected(),i&&await this.delayRetry(n.signal,e.retryDelayMs))}}this.markAsDisconnected()}markConnectionMayHaveChanged(){this.connectionMayHaveChanged=!0,this.handleActiveStreamsChange?.()}async requireKeyFormat(t){let e=await this.options.adapter.hasMigratedSubkeys();return t&&!e?(await this.options.adapter.migrateToFixedSubkeys(),!0):e}streamingSyncIteration(t,e){return this.obtainLock({type:s.SYNC,signal:t,callback:async()=>{let n=Object.entries(e.appMetadata).filter(([t,e])=>"string"!=typeof e);if(n.length>0)throw Error(`Invalid appMetadata provided. Only string values are allowed. Invalid values: ${n.map(([t,e])=>`${t}: ${e}`).join(", ")}`);return await this.requireKeyFormat(!0),await this.rustSyncIteration(t,e)}})}receiveSyncLines(t){let e,{options:n,connection:i}=t,a=this.options.remote,s=async()=>i.connectionMethod==d.SyncStreamConnectionMethod.HTTP?await a.fetchStream(n):await this.options.remote.socketStreamRaw({...n,...{fetchStrategy:i.fetchStrategy}}),o=!1;return{async next(){if(o)return F;if(null==e)return e=await s(),q({command:r.CONNECTION_STATE,payload:"established"});{let t=await e.next();return t.done?(o=!0,q({command:r.CONNECTION_STATE,payload:"end"})):q({command:"string"==typeof t.value?r.PROCESS_TEXT_LINE:r.PROCESS_BSON_LINE,payload:t.value})}}}}async rustSyncIteration(t,e){let n,i=this,a=this.options.adapter,s=this.options.remote,l=!1;if(t.aborted)throw new tt("Connection request has been aborted");let c=this.options.serializedSchema;async function u(){for(let t of(await h(r.STOP)))"EstablishSyncStream"in t||"CloseSyncStream"in t||await d(t)}async function h(t,e){let n=await a.control(t,e??null),s=null==e||"string"==typeof e?e:"<bytes>";return i.logger.log({level:o.LogLevels.trace,message:`powersync_control(${t}, ${s}) -> ${n}`}),t!=r.STOP&&(i.connectionMayHaveChanged=!1),JSON.parse(n)}async function d(t){if("LogLine"in t){let{severity:e,line:n}=t.LogLine;switch(e){case"DEBUG":i.logger.log({level:o.LogLevels.debug,message:n});break;case"INFO":i.logger.log({level:o.LogLevels.info,message:n});break;case"WARNING":i.logger.log({level:o.LogLevels.warn,message:n})}}else"UpdateSyncStatus"in t?i.updateSyncStatus(t.UpdateSyncStatus.status):"FetchCredentials"in t?t.FetchCredentials.did_expire?s.invalidateCredentials():(s.invalidateCredentials(),s.fetchCredentials().then(t=>{n?.()},t=>{i.logger.log({level:o.LogLevels.warn,message:"Could not prefetch credentials",error:t})})):"FlushFileSystem"in t||"DidCompleteSync"in t&&i.updateJsSyncState({downloadError:void 0})}try{let a,s={immediateRestart:!1},o=null;for(let n of(await (a={parameters:e.params,app_metadata:e.appMetadata,active_streams:i.activeStreams,include_defaults:e.includeDefaultStreams},c&&(a.schema=c),h(r.START,JSON.stringify(a)))))if("EstablishSyncStream"in n){let a={path:"/sync/stream",abortSignal:t,data:n.EstablishSyncStream.request};o=function(t){let e,n=!1,i=null,a=!1,r=[],s=()=>{let t=e;return e=void 0,t};return{next:()=>new Promise((o,l)=>{let c;if(n)return o(F);if(i){i({resolve:o,reject:l}),i=null;return}if(r.length)return o(q(r.shift()));e={resolve:o,reject:l},a||(c=t=>{a=!1;let e=s();e?t(e):i=t},a=!0,t.next().then(t=>{n=!0==t.done,c(e=>e.resolve(t))},t=>{c(e=>e.reject(t))}))}),inject:t=>{let e=s();null!=e?e.resolve(q(t)):r.push(t)}}}(i.receiveSyncLines({options:a,connection:e}))}else{if("CloseSyncStream"in n)return s;await d(n)}if(null==o)return s;this.notifyCompletedUploads=()=>{o.inject({command:r.NOTIFY_CRUD_UPLOAD_COMPLETED})},this.handleActiveStreamsChange=()=>{o.inject({command:r.UPDATE_SUBSCRIPTIONS,payload:JSON.stringify(this.activeStreams)})},n=()=>{o.inject({command:r.NOTIFY_TOKEN_REFRESHED})};let u=!1;t:for(;;){let{done:t,value:e}=await o.next();if(t)break;for(let t of(u||e.command!=r.PROCESS_TEXT_LINE&&e.command!=r.PROCESS_BSON_LINE||(u=!0,this.triggerCrudUpload?.()),await h(e.command,e.payload)))if("EstablishSyncStream"in t)throw Error("Received EstablishSyncStream while already connected.");else if("CloseSyncStream"in t){l=t.CloseSyncStream.hide_disconnect;break t}else await d(t)}}finally{this.notifyCompletedUploads=this.handleActiveStreamsChange=void 0,n=void 0,await u()}return{immediateRestart:l}}updateSyncStatus(t,e){let n=new w(t,{...this.syncStatus.jsState,...e});this.syncStatus.isEqual(n)||(this.syncStatus=n,this.iterateListeners(t=>t.statusChanged?.(n)))}updateJsSyncState(t){this.updateSyncStatus(this.syncStatus.core,t)}async delayRetry(t,e){return new Promise(n=>{let i;if(t?.aborted)return void n();let a=()=>{n(),i&&(clearTimeout(i),i=void 0),t?.removeEventListener("abort",a)};t?.addEventListener("abort",a,{once:!0}),i=setTimeout(a,e)})}updateSubscriptions(t){this.activeStreams=t,this.handleActiveStreamsChange?.()}}
183t.s(["AbstractStreamingSyncImplementation",0,ta,"LockType",0,s],944955),t.s([],993150)},278918,521290,t=>{"use strict";t.i(533243);var e=t.i(736207),n=t.i(941981),i=t.i(255519);t.i(993150);class a extends Error{static NAME="ConnectionClosedError";static MATCHES(t){return t instanceof a||t instanceof Error&&t.name==a.NAME}constructor(t){super(t),this.name=a.NAME}}class r extends e.DBAdapter{options;config;#t;#e=new AbortController;#n;constructor(t,e){super(),this.options=t,this.config=e,this.#t={connection:t.connection,notifyRemoteClosed:t.remoteCanCloseUnexpectedly?new AbortController:void 0,traceQueries:!0===e.debugMode};const{port1:n,port2:a}=new MessageChannel;t.connection.setUpdateListener(i.transfer(n,[n])),this.#n=a,a.onmessage=t=>{let e={tables:t.data};this.iterateListeners(t=>{t.tablesUpdated&&t.tablesUpdated(e)})}}get name(){return this.config.dbFilename}markRemoteClosed(){this.#t.notifyRemoteClosed.abort()}async close(){this.#e.abort(),this.#n.close(),await o(this.#t,t=>t.close(),!0),this.options.onClose?.(),this.options.source?.[i.releaseProxy]()}readLock(t,e){return this.#i(!1,t,e)}writeLock(t,e){return this.#i(!0,t,e)}async #i(t,e,n){let i=await o(this.#t,e=>e.requestAccess(t,n?.timeoutMs));try{return await e(new s(this.#t,i))}finally{await o(this.#t,t=>t.completeAccess(i))}}async refreshSchema(){}async shareConnection(){let t=this.#e,e=this.options.source;if(null==e)throw Error("shareConnection() is only available for connections based by workers.");return await new Promise((e,n)=>navigator.locks.request(`shared-connection-${this.name}-${Date.now()}-${Math.round(1e4*Math.random())}`,{signal:t.signal},async()=>{e(),t.signal.aborted||await new Promise(e=>{t.signal.addEventListener("abort",()=>{e()})})}).catch(t=>{"AbortError"==t.name?e():n(t)})),{port:await e[i.createEndpoint](),identifier:this.name}}getConfiguration(){return this.config}}class s extends e.LockContext{#t;#a;constructor(t,e){super(),this.#t=t,this.#a=e}async maybeTrace(t,e){if(!this.#t.traceQueries)return o(this.#t,t);{let n=performance.now(),i=e();try{let e=await o(this.#t,t);return performance.measure(`[SQL] ${i}`,{start:n}),e}catch(t){throw performance.measure(`[SQL] [ERROR: ${t.message}] ${i}`,{start:n}),t}}}async executeRaw(t,e){return await this.#r(t,e)}async #r(t,e){return this.maybeTrace(n=>n.execute(this.#a,t,e),()=>t)}async executeBatch(t,e=[]){let i=await this.maybeTrace(n=>n.executeBatch(this.#a,t,e),()=>`${t} (batch of ${e.length})`),a={insertId:void 0,rowsAffected:0};for(let t of i)a.insertId=t.insertId,a.rowsAffected=(a.rowsAffected??0)+t.rowsAffected;return(0,n.queryResultWithoutRows)(a)}}async function o(t,e,n=!1){let i=t.notifyRemoteClosed;return i?new Promise((r,s)=>{function o(){s(new a("Remote peer closed with request in flight"))}function l(t){i.signal.removeEventListener("abort",o),t()}(!i.signal.aborted||(s(new a("Called operation on closed remote")),n))&&(i.signal.addEventListener("abort",o),e(t.connection).then(t=>l(()=>r(t))).catch(t=>l(()=>s(t))))}):e(t.connection)}t.s(["DatabaseClient",0,r],278918);var l=t.i(468595);t.s(["generateTabCloseSignal",0,function(t){return new Promise((e,n)=>{(0,l.getNavigatorLocks)().request(`tab-close-signal-${crypto.randomUUID()}`,{signal:t},n=>(e(n.name),new Promise(e=>{t&&t.addEventListener("abort",()=>e())}))).catch(n)})}],521290)},435973,468595,733542,t=>{"use strict";t.i(533243);var e=t.i(297007);class n{#s;#o=0;#l=new Set;#c;#u=new Set;constructor(t){this.#s=t;const e=t.inner;this.#c=new BroadcastChannel(`${e.options.filename}-table-updates`),this.#c.onmessage=({data:t})=>{this.#h(t)}}#h(t){for(let e of this.#u)e.postMessage(t)}get #d(){return this.#s.inner}get #g(){return this.#s.logger}async connect(t){let n,i=!0,a=this.#o++;this.#l.add(a);let r=new Map;function s(){if(!i)throw Error("Client has already been closed")}function o(t){s();let e=r.get(t);if(!e)throw Error("Attempted to use a connection lease that has already been returned.");return e}let l=async()=>{if(i){for(let{lease:t}of(i=!1,n&&this.#u.delete(n),r.values()))this.#g.log({level:e.LogLevels.debug,message:"Closing connection lease that hasn't been returned."}),await t.returnLease();
183this.#l.delete(a),0==this.#l.size?await this.forceClose():this.#g.log({level:e.LogLevels.debug,message:"Keeping underlying connection active since its used by other clients."})}};return t&&navigator.locks.request(t,{},()=>{l()}),{close:l,debugIsAutoCommit:async()=>this.#d.unsafeUseInner().isAutoCommit(),requestAccess:async(t,e)=>{s();let n=await this.#d.acquireConnection(null!=e?AbortSignal.timeout(e):void 0);if(!i)return await n.returnLease(),s();let a=crypto.randomUUID();return r.set(a,{lease:n,write:t}),a},completeAccess:async t=>{let e=o(t);r.delete(t);try{if(e.write){let{rawRows:t}=await e.lease.use(t=>t.execute("SELECT powersync_update_hooks('get')"));if(t.length){let e=JSON.parse(t[0][0]);e.length&&(this.#c.postMessage(e),this.#h(e))}}}finally{await e.lease.returnLease()}},execute:async(t,e,n)=>{let{lease:i}=o(t);return await i.use(t=>t.execute(e,n))},executeBatch:async(t,e,n)=>{let{lease:i}=o(t);return await i.use(t=>t.executeBatch(e,n))},setUpdateListener:async t=>{s(),n&&this.#u.delete(n),n=t,t&&this.#u.add(t)}}}async forceClose(){this.#g.log({level:e.LogLevels.debug,message:`Closing connection to ${JSON.stringify(this.#d.options)}.`});let t=this.#d;this.#s.onClose(),this.#c.close(),await t.close()}}t.s(["DatabaseServer",0,n],435973),t.s(["getNavigatorLocks",0,()=>{if("locks"in navigator&&navigator.locks)return navigator.locks;throw Error("Navigator locks are not available in an insecure context. Use a secure context such as HTTPS or http://localhost.")}],468595);var i=t.i(657075);void 0===BigInt.prototype.toJSON&&(BigInt.prototype.toJSON=function(){return this.toString()});let a=-0x8000000000000000n,r=Object.getPrototypeOf(async function(){}).constructor;class s extends Error{constructor(t,e){super(t),this.code=e}}function o(t){let e=[],n=t.match(/([ns@]*):([nsv@])/);switch(n[2]){case"n":e.push("number");break;case"s":e.push("string");break;case"v":e.push(null)}let i=[];for(let t of n[1])switch(t){case"n":i.push("number");break;case"s":i.push("string")}return e.push(i),e}t.s(["Factory",0,function(t){let e,n,l,c,u,h,d,g,p,m,y,w,f,b,S,E,v,_,C,L,T,A,O,x,R,I,D,k,M,U,N,P,F,q,$,W,B,H,Q,z,j,V,J,G,Y,K,X={};t.retryOps=[],t.pendingOps=[];let Z=t._getSqliteFree(),tt=t._malloc(8),te=[tt,tt+4],tn=new TextEncoder;function ti(e){if("string"!=typeof e)return 0;let n=tn.encode(e),i=t._sqlite3_malloc(n.byteLength+1);return t.HEAPU8.set(n,i),t.HEAPU8[i+n.byteLength]=0,i}function ta(t,e){return BigInt(e)<<32n|4294967295n&BigInt(t)}let tr=(e=BigInt(Number.MAX_SAFE_INTEGER)>>32n,n=BigInt(Number.MIN_SAFE_INTEGER)>>32n,function(t,i){return i>e||i<n?ta(t,i):0x100000000*i+(0x7fffffff&t)-(0x80000000&t)}),ts=new Set;function to(t){if(!ts.has(t))throw new s("not a database",i.SQLITE_MISUSE)}let tl=new Map;function tc(t){if(!tl.has(t))throw new s("not a statement",i.SQLITE_MISUSE)}function tu(e,n,a=null,r=[i.SQLITE_OK]){if(r.includes(n))return n;throw new s(a?t.ccall("sqlite3_errmsg","string",["number"],[a]):e,n)}async function th(e){let n;for(let a=0;a<2;++a){if(t.retryOps.length)try{await Promise.all(t.retryOps)}finally{t.retryOps=[]}if((n=await e())===i.SQLITE_OK||0===t.retryOps.length){if(t.pendingOps.length)try{await Promise.all(t.pendingOps)}catch(t){return console.error("Error in pendingOps:",t),t.code||i.SQLITE_ERROR}finally{t.pendingOps=[]}break}}return n}return X.bind_collection=function(t,e){tc(t);let n=Array.isArray(e),a=X.bind_parameter_count(t);for(let i=1;i<=a;++i){let a=e[n?i-1:X.bind_parameter_name(t,i)];void 0!==a&&X.bind(t,i,a)}return i.SQLITE_OK},X.bind=function(t,e,n){switch(tc(t),typeof n){case"number":if(n===(0|n))return X.bind_int(t,e,n);return X.bind_double(t,e,n);case"string":return X.bind_text(t,e,n);case"boolean":return X.bind_int(t,e,+!!n);default:if(n instanceof Uint8Array||Array.isArray(n))return X.bind_blob(t,e,n);if(null===n)return X.bind_null(t,e);if("bigint"==typeof n)return X.bind_int64(t,e,n);if(void 0===n)return i.SQLITE_NOTICE;return console.warn("unknown binding converted to null",n),X.bind_null(t,e)}},l=t.cwrap("sqlite3_bind_blob",...o("nnnnn:n")),X.bind_blob=function(e,n,i){tc(e);let a=i.byteLength??i.length,r=t._sqlite3_malloc(a);return t.HEAPU8.subarray(r).set(i),tu("sqlite3_bind_blob",l(e,n,r,a,Z),tl.get(e))},c=t.cwrap("sqlite3_bind_parameter_count",...o("n:n")),X.bind_parameter_count=function(t){return tc(t),
183c(t)},u=t.cwrap("sqlite3_bind_double",...o("nnn:n")),X.bind_double=function(t,e,n){return tc(t),tu("sqlite3_bind_double",u(t,e,n),tl.get(t))},h=t.cwrap("sqlite3_bind_int",...o("nnn:n")),X.bind_int=function(t,e,n){return(tc(t),n>0x7fffffff||n<-0x80000000)?i.SQLITE_RANGE:tu("sqlite3_bind_int",h(t,e,n),tl.get(t))},d=t.cwrap("sqlite3_bind_int64",...o("nnnn:n")),X.bind_int64=function(t,e,n){return(tc(t),n>0x7fffffffffffffffn||n<a)?i.SQLITE_RANGE:tu("sqlite3_bind_int64",d(t,e,Number(4294967295n&n),Number(n>>32n)),tl.get(t))},g=t.cwrap("sqlite3_bind_null",...o("nn:n")),X.bind_null=function(t,e){return tc(t),tu("sqlite3_bind_null",g(t,e),tl.get(t))},p=t.cwrap("sqlite3_bind_parameter_name",...o("n:s")),X.bind_parameter_name=function(t,e){return tc(t),p(t,e)},m=t.cwrap("sqlite3_bind_text",...o("nnnnn:n")),X.bind_text=function(t,e,n){return tc(t),tu("sqlite3_bind_text",m(t,e,ti(n),-1,Z),tl.get(t))},y=t.cwrap("sqlite3_changes",...o("n:n")),X.changes=function(t){return to(t),y(t)},w=t.cwrap("sqlite3_clear_bindings",...o("n:n")),X.clear_bindings=function(t){return tc(t),tu("sqlite3_clear_bindings",w(t),tl.get(t))},f=t.cwrap("sqlite3_last_insert_rowid",...o("n:n")),X.last_insert_id=function(t){return to(t),f(t)},b=t.cwrap("sqlite3_close",...o("n:n"),{async:!0}),X.close=async function(t){to(t);let e=await b(t);return ts.delete(t),tu("sqlite3_close",e,t)},X.column=function(e,n){tc(e);let a=X.column_type(e,n);switch(a){case i.SQLITE_BLOB:return X.column_blob(e,n);case i.SQLITE_FLOAT:return X.column_double(e,n);case i.SQLITE_INTEGER:return tr(X.column_int(e,n),t.getTempRet0());case i.SQLITE_NULL:return null;case i.SQLITE_TEXT:return X.column_text(e,n);default:throw new s("unknown type",a)}},S=t.cwrap("sqlite3_column_blob",...o("nn:n")),X.column_blob=function(e,n){tc(e);let i=X.column_bytes(e,n),a=S(e,n);return t.HEAPU8.subarray(a,a+i)},E=t.cwrap("sqlite3_column_bytes",...o("nn:n")),X.column_bytes=function(t,e){return tc(t),E(t,e)},v=t.cwrap("sqlite3_column_count",...o("n:n")),X.column_count=function(t){return tc(t),v(t)},_=t.cwrap("sqlite3_column_double",...o("nn:n")),X.column_double=function(t,e){return tc(t),_(t,e)},C=t.cwrap("sqlite3_column_int64",...o("nn:n")),X.column_int=function(t,e){return tc(t),C(t,e)},L=t.cwrap("sqlite3_column_int64",...o("nn:n")),X.column_int64=function(e,n){return tc(e),ta(L(e,n),t.getTempRet0())},T=t.cwrap("sqlite3_column_name",...o("nn:s")),X.column_name=function(t,e){return tc(t),T(t,e)},X.column_names=function(t){let e=[],n=X.column_count(t);for(let i=0;i<n;++i)e.push(X.column_name(t,i));return e},A=t.cwrap("sqlite3_column_text",...o("nn:s")),X.column_text=function(t,e){return tc(t),A(t,e)},O=t.cwrap("sqlite3_column_type",...o("nn:n")),X.column_type=function(t,e){return tc(t),O(t,e)},X.create_function=function(e,n,i,a,s,o,l,c){function u(e){return e instanceof r?async(n,i,a)=>e(n,t.HEAP32.subarray(a/4,a/4+i)):(n,i,a)=>e(n,t.HEAP32.subarray(a/4,a/4+i))}return to(e),tu("sqlite3_create_function",t.create_function(e,n,i,a,s,o&&u(o),l&&u(l),c),e)},x=t.cwrap("sqlite3_data_count",...o("n:n")),X.data_count=function(t){return tc(t),x(t)},X.exec=async function(t,e,n){for await(let a of X.statements(t,e)){let t;for(;await X.step(a)===i.SQLITE_ROW;)if(n){t=t??X.column_names(a);let e=X.row(a);await n(e,t)}}return i.SQLITE_OK},R=t.cwrap("sqlite3_finalize",...o("n:n"),{async:!0}),X.finalize=async function(t){let e=await R(t);return tl.delete(t),e},I=t.cwrap("sqlite3_get_autocommit",...o("n:n")),X.get_autocommit=function(t){return I(t)},D=t.cwrap("sqlite3_libversion",...o(":s")),X.libversion=function(){return D()},k=t.cwrap("sqlite3_libversion_number",...o(":n")),X.libversion_number=function(){return k()},M=t.cwrap("sqlite3_limit",...o("nnn:n")),X.limit=function(t,e,n){return M(t,e,n)},U=t.cwrap("sqlite3_open_v2",...o("snnn:n"),{async:!0}),X.open_v2=async function(e,n,a){n=n||i.SQLITE_OPEN_CREATE|i.SQLITE_OPEN_READWRITE,a=ti(a);try{let i=await th(()=>U(e,te[0],n,a)),r=t.getValue(te[0],"*");return ts.add(r),t.ccall("RegisterExtensionFunctions","number",["number"],[r]),tu("sqlite3_open_v2",i),r}finally{t._sqlite3_free(a)}},X.progress_handler=function(e,n,i,a){to(e),t.progress_handler(e,n,i,a)},N=t.cwrap("sqlite3_reset",...o("n:n"),{async:!0}),X.reset=async function(t){return tc(t),tu("sqlite3_reset",await N(t),tl.get(t))},X.result=function(t,e){switch(typeof e){case"number":e===(0|e)?X.result_int(t,e):X.result_double(t,e);break;case"string":X.result_text(t,e);break;default:if(e instanceof Uint8Array||Array.isArray(e))X.result_blob(t,e);else if(null===e)X.result_null(t);else{if("bigint"==typeof e)return X.result_int64(t,e);console.warn("unknown result converted to null",e),X.result_null(t)}}},P=t.cwrap("sqlite3_result_blob",...o("nnnn:n")),X.result_blob=function(e,n){let i=n.byteLength??n.length,a=t._sqlite3_malloc(i);t.HEAPU8.subarray(a).set(n),P(e,a,i,Z)},F=t.cwrap("sqlite3_result_double",...o("nn:n")),X.result_double=function(t,e){F(t,e)},q=t.cwrap("sqlite3_result_int",...o("nn:n")),X.result_int=function(t,e){q(t,e)},$=t.cwrap("sqlite3_result_int64",...o("nnn:n")),X.result_int64=function(t,e){if(e>0x7fffffffffffffffn||e<a)return i.SQLITE_RANGE;$(t,Number(4294967295n&e),Number(e>>32n))},W=t.cwrap("sqlite3_result_null",...o("n:n")),X.result_null=function(t){W(t)},B=t.cwrap("sqlite3_result_text",...o("nnnn:n")),X.result_text=function(t,e){B(t,ti(e),-1,Z)},X.row=function(e){let n=[],i=X.data_count(e);for(let a=0;a<i;++a){let i=X.column(e,a);n.push(i?.buffer===t.HEAPU8.buffer?i.slice():i)}return n},X.set_authorizer=function(e,n,i){function a(e,n,i,a,r,s){return[e,n,t.UTF8ToString(i),t.UTF8ToString(a),t.UTF8ToString(r),t.UTF8ToString(s)]}return to(e),tu("sqlite3_set_authorizer",t.set_authorizer(e,n instanceof r?async(t,e,i,r,s,o)=>
183n(...a(t,e,i,r,s,o)):(t,e,i,r,s,o)=>n(...a(t,e,i,r,s,o)),i),e)},H=t.cwrap("sqlite3_sql",...o("n:s")),X.sql=function(t){return tc(t),H(t)},X.statements=function(e,n,a={}){let r=t.cwrap("sqlite3_prepare_v3","number",["number","number","number","number","number","number"],{async:!0});return async function*(){let s=[];try{let l,c=tn.encode(n),u=c.byteLength-c.byteLength%4+12,h=t._sqlite3_malloc(u),d=h+c.byteLength+1;s.push(()=>t._sqlite3_free(h)),t.HEAPU8.set(c,h),t.HEAPU8[d-1]=0;let g=h+u-8,p=h+u-4;function o(){l&&!a.unscoped&&X.finalize(l),l=0}s.push(o),t.setValue(p,h,"*");do{o();let n=t.getValue(p,"*"),s=await th(()=>r(e,n,d-p,a.flags||0,g,p));s!==i.SQLITE_OK&&tu("sqlite3_prepare_v3",s,e),(l=t.getValue(g,"*"))&&(tl.set(l,e),yield l)}while(l)}finally{for(;s.length;)s.pop()()}}()},Q=t.cwrap("sqlite3_step",...o("n:n"),{async:!0}),X.step=async function(t){return tc(t),tu("sqlite3_step",await th(()=>Q(t)),tl.get(t),[i.SQLITE_ROW,i.SQLITE_DONE])},X.commit_hook=function(e,n){to(e),t.commit_hook(e,n)},X.update_hook=function(e,n){function i(e,n,i,a,r){return[e,t.UTF8ToString(n),t.UTF8ToString(i),ta(a,r)]}to(e),t.update_hook(e,n instanceof r?async(t,e,a,r,s)=>n(...i(t,e,a,r,s)):(t,e,a,r,s)=>n(...i(t,e,a,r,s)))},X.value=function(e){let n=X.value_type(e);switch(n){case i.SQLITE_BLOB:return X.value_blob(e);case i.SQLITE_FLOAT:return X.value_double(e);case i.SQLITE_INTEGER:return tr(X.value_int(e),t.getTempRet0());case i.SQLITE_NULL:return null;case i.SQLITE_TEXT:return X.value_text(e);default:throw new s("unknown type",n)}},z=t.cwrap("sqlite3_value_blob",...o("n:n")),X.value_blob=function(e){let n=X.value_bytes(e),i=z(e);return t.HEAPU8.subarray(i,i+n)},j=t.cwrap("sqlite3_value_bytes",...o("n:n")),X.value_bytes=function(t){return j(t)},V=t.cwrap("sqlite3_value_double",...o("n:n")),X.value_double=function(t){return V(t)},J=t.cwrap("sqlite3_value_int64",...o("n:n")),X.value_int=function(t){return J(t)},G=t.cwrap("sqlite3_value_int64",...o("n:n")),X.value_int64=function(e){return ta(G(e),t.getTempRet0())},Y=t.cwrap("sqlite3_value_text",...o("n:s")),X.value_text=function(t){return Y(t)},K=t.cwrap("sqlite3_value_type",...o("n:n")),X.value_type=function(t){return K(t)},X.vfs_register=function(e,n){return tu("sqlite3_vfs_register",t.vfs_register(e,n))},X}],733542)},171969,189820,350721,t=>{"use strict";var e,n,i=t.i(733542),a=t.i(657075),r=t.i(989402);t.i(533243);var s=t.i(297007);(e=n||(n={})).MEMORY="memory",e.FILESYSTEM="file",t.s(["TemporaryStorageOption",0,n],189820),t.s(["maxPathNameLength",0,128,"resolveAndValidateOptions",0,function(t){let e=Object.assign({disableSSRWarning:!1,ssrMode:!("window"in globalThis),enableMultiTabs:void 0!==globalThis.navigator&&"u">typeof SharedWorker&&!navigator.userAgent.match(/(Android|iPhone|iPod|iPad)/i)&&!window.safari,useWebWorker:!0,databaseWorkerLogLevel:s.LogLevels.info,temporaryStorage:n.MEMORY,cacheSizeKb:51200,encryptionKey:void 0,vfs:r.WASQLiteVFS.IDBBatchAtomicVFS,additionalReaders:1},t);if((0,r.vfsRequiresDedicatedWorkers)(e.vfs)&&!e.useWebWorker)throw Error(`Invalid configuration: The 'useWebWorker' flag must be true when using an OPFS-based VFS (${e.vfs}).`);return e}],350721);class o{#p;#m=new Map;constructor(t){this.#p=t}lookup(t){let e=this.#m.get(t);return null!=e?(this.#m.delete(t),this.#m.set(t,e),e):null}
183addStatement(t,e){if(this.#m.set(t,e),this.#m.size>this.#p)for(let[t,e]of this.#m.entries())return this.#m.delete(t),e;return null}drain(){let t=[...this.#m.values()];return this.#m.clear(),t}}t.s(["RawSqliteConnection",0,class{options;_sqliteAPI=null;sqlite3_stmt_isexplain;db=0;statementCache;constructor(t){this.options=t,this.statementCache=t.preparedStatementsCache>0?new o(t.preparedStatementsCache):null}get isOpen(){return 0!=this.db}async init(){let{module:t,vfs:e}=await (0,r.loadModuleAndVfs)(this.options);await this.initWithModule(t,e)}async initWithModule(t,e){let n=this._sqliteAPI=await this.openSQLiteAPI(t,e);if(this.db=await n.open_v2(this.options.filename,this.options.readonly?1:6),await this.executeRaw(`PRAGMA temp_store = ${this.options.temporaryStorage};`),this.options.encryptionKey){let t=this.options.encryptionKey.replaceAll("'","''");await this.executeRaw(`PRAGMA key = '${t}';`)}await this.executeRaw(`PRAGMA cache_size = -${this.options.cacheSizeKb};`),await this.executeRaw("SELECT powersync_update_hooks('install');")}async openSQLiteAPI(t,e){e.mxPathname=128,this.sqlite3_stmt_isexplain=t.cwrap("sqlite3_stmt_isexplain","int",["int"]);let n=(0,i.Factory)(t);if(n.vfs_register(e,!0),t.ccall("powersync_init_static","int",[]),this.options.encryptionKey&&0!==t.ccall("sqlite3mc_vfs_create","int",["string","int"],[this.options.filename,1]))throw Error("Failed to create multiple cipher vfs, Database encryption will not work");return n}requireSqlite(){if(!this._sqliteAPI)throw Error("Initialization has not completed");return this._sqliteAPI}isAutoCommit(){return 0!=this.requireSqlite().get_autocommit(this.db)}async execute(t,e){let n=await this.executeSingleStatementRaw(t,e);return this.wrapQueryResults(this.requireSqlite(),n)}async executeBatch(t,e){let n=[],i=this.requireSqlite();for await(let a of i.statements(this.db,t)){let t;for(let r of e){let e=await this.stepThroughStatement(i,a,r,t,!1);n.push(this.wrapQueryResults(i,e))}break}return n}wrapQueryResults(t,{rawRows:e,columnNames:n}){return{rowsAffected:t.changes(this.db),insertId:t.last_insert_id(this.db),autocommit:0!=t.get_autocommit(this.db),rawRows:e,columnNames:n}}async executeSingleStatementRaw(t,e){let n=await this.executeRaw(t,e);return n.length?n[0]:{columnNames:[],rawRows:[]}}async executeRaw(t,e){let n=[],i=this.requireSqlite();for await(let a of this.cachedStatements(i,t)){let t,r=await this.stepThroughStatement(i,a,e??[],t);if((t=r.columnNames).length&&n.push(r),e)break}return n}async stepThroughStatement(t,e,n,i,r=!0){n.forEach((t,e,n)=>{"boolean"==typeof t&&(n[e]=+!!t)}),t.reset(e),n&&t.bind_collection(e,n);let s=[];for(;await t.step(e)===a.SQLITE_ROW;)if(r){let n=t.row(e);s.push(n)}return{columnNames:i??=t.column_names(e),rawRows:s}}async close(){if(this.isOpen){let t=this.requireSqlite();if(this.statementCache)for(let e of this.statementCache.drain())await t.finalize(e);await t.close(this.db),this.db=0}}async *cachedStatements(t,e){{let t=this.statementCache?.lookup(e);if(null!=t)return void(yield t)}let n=t.statements(this.db,e,{unscoped:!0}),i=[];try{for await(let t of n)i.push(t),yield t}finally{if(1===i.length&&this.statementCache){let n=i[0];if(0==this.sqlite3_stmt_isexplain(n)){let i=this.statementCache.addStatement(e,n);null!=i&&await t.finalize(i);return}}for(let e of i)await t.finalize(e)}}}],171969)},989402,t=>{"use strict";var e,n;async function i(e){if(e){let{default:e}=await t.A(497401);return e()}{let{default:e}=await t.A(927296);return e()}}async function a(e){if(e){let{default:e}=await t.A(999754);return e()}{let{default:e}=await t.A(392234);return e()}}async function r({vfs:n,filename:s,encryptionKey:o}){let l,c=a;switch(n){case e.IDBBatchAtomicVFS:{c=i;let{IDBBatchAtomicVFS:e}=await t.A(600076);l=t=>e.create(s,t,{lockPolicy:"exclusive"});break}case e.AccessHandlePoolVFS:{let{AccessHandlePoolVFS:e}=await t.A(170248);l=t=>e.create(s,t);break}case e.OPFSCoopSyncVFS:{let{OPFSCoopSyncVFS:e}=await t.A(623158);l=t=>e.create(s,t);break}case e.OPFSWriteAheadVFS:{let{OPFSWriteAheadVFS:e}=await t.A(880259);l=t=>e.create(s,t,{});break}case e.InMemoryVfs:{let{MemoryVFS:e}=await t.A(922948);l=t=>e.create(s,t)}}let u=await c(o);return{module:u,vfs:await l(u)}}(n=e||(e={})).IDBBatchAtomicVFS="IDBBatchAtomicVFS",n.OPFSCoopSyncVFS="OPFSCoopSyncVFS",n.AccessHandlePoolVFS="AccessHandlePoolVFS",n.OPFSWriteAheadVFS="OPFSWriteAheadVFS",n.InMemoryVfs="InMemoryVFS",t.s(["WASQLiteVFS",0,e,"loadModuleAndVfs",0,r,"vfsRequiresDedicatedWorkers",0,function(t){return t!=e.IDBBatchAtomicVFS&&t!=e.InMemoryVfs}])},101014,590523,114435,t=>{"use strict";let e;t.i(533243);var n=t.i(297007);t.i(993150);var i=t.i(258472);class a extends i.AbstractRemote{connector;constructor(t,e){super(t,e),this.connector=t}fetch({resource:t,request:e}){return fetch(t,e)}async loadWebSocketSupport(n){return e||(e=new(await t.A(469191)).WebSocketSupport(n)),e}getUserAgent(){let t=[super.getUserAgent(),"powersync-web"];try{var e;t.push(...[function(t){let e=t.userAgentData?.brands;if(null!=e)for(let{name:t,value:n}of[{name:"Google Chrome",value:"Chrome"},{name:"Opera",value:"Opera"},{name:"Edge",value:"Edge"},{name:"Chromium",value:"Chromium"}]){let i=e.find(e=>e.brand==t);if(null!=i)return`${n}/${i.version}`}let n=t.userAgent;for(let{re:t,value:e}of[{re:/(?:firefox|fxios)\/(\d+)/i,value:"Firefox"},{re:/(?:edg|edge|edga|edgios)\/(\d+)/i,value:"Edge"},{re:/opr\/(\d+)/i,value:"Opera"},{re:/(?:chrome|chromium|crios)\/(\d+)/i,value:"Chrome"},{re:/version\/(\d+).*safari/i,value:"Safari"}]){let i=t.exec(n);if(null!=i)return`${e}/${i[1]}`}return null}(e??=navigator),function(t){if(t.userAgentData?.platform!=null)return t.userAgentData.platform.toLowerCase();let e=t.userAgent;for(let{re:t,value:n}of[{re:/windows/i,value:"windows"},{re:/android/i,value:"android"},{re:/linux/i,value:"linux"},{re:/iphone|ipad|ipod/i,value:"ios"},{re:/macintosh|mac os x/i,value:"macos"}])if(t.test(e))return n;return null}(e)].filter(t=>null!=t))}catch(t){this.logger.log({level:n.LogLevels.warn,message:"Failed to get user agent info",error:t})}return t.join(" ")}}t.s(["WebRemote",0,a],101014);var r=t.i(944955),s=t.i(468595);class o extends r.AbstractStreamingSyncImplementation{constructor(t){super(t)}get webOptions(){return this.options}async obtainLock(t){let e=`streaming-sync-${t.type}-${this.webOptions.identifier}`;return t.type==r.LockType.SYNC&&this.logger.log({level:n.LogLevels.debug,message:`requesting lock for ${e}`}),(0,s.getNavigatorLocks)().request(e,{signal:t.signal},t.callback)}}t.s(["WebStreamingSyncImplementation",0,o],590523);class l{clients;inner;currentLevel=n.LogLevels.info;sendBroadcasts=!0;constructor(t,e){this.clients=e,this.inner=(0,n.createConsoleLogger)({prefix:t})}log(t){if(this.inner.log(t),this.sendBroadcasts&&t.level>=this.currentLevel){let e=this.sanitizeRecord(t);this.iterateClients(t=>t.clientProvider.log(e))}}setLevel(t){this.inner.minLevel=t,this.currentLevel=t}async iterateClients(t){for(let e of this.clients)try{await t(e)}catch(t){console.error("Caught exception when iterating client",t)}}sanitizeRecord(t){let e;if(!t.error)return t;try{e=structuredClone(t.error)}catch(t){console.error(t),e="Could not serialize log params. Check shared worker logs for more details."}return{...t,error:e}}}t.s(["BroadcastLogger",0,l],114435)},919709,t=>{"use strict";t.i(533243);var e=t.i(297007),n=t.i(255519),i=t.i(435973),a=t.i(468595),r=t.i(171969);t.i(993150);var s=t.i(799386);class o{inner;leaseMutex;constructor(t,e){this.inner=t,this.leaseMutex=e?null:new s.Mutex}get options(){return this.inner.options}acquireMutex(t){return this.leaseMutex?this.leaseMutex.acquire(t):new Promise((e,n
183)=>{navigator.locks.request(`db-lock-${this.options.filename}`,{signal:t},t=>new Promise(t=>e(()=>{t()}))).catch(n)})}unsafeUseInner(){return this.inner}async acquireConnection(t){let e=await this.acquireMutex(t),n=new l(e,this.inner);try{this.inner.requireSqlite(),this.inner.isAutoCommit()||await this.inner.executeRaw("ROLLBACK")}catch(t){throw e(),t}return n}async close(){let t=await this.acquireMutex();try{await this.inner.close()}finally{t()}}}class l{returnMutex;connection;useMutex=new s.Mutex;closed=!1;constructor(t,e){this.returnMutex=t,this.connection=e}async returnLease(){await this.useMutex.runExclusive(async()=>{this.closed||(this.closed=!0,this.returnMutex())})}async use(t){return await this.useMutex.runExclusive(async()=>{if(this.closed)throw Error("lease token has already been closed");return await t(this.connection)})}}var c=t.i(989402);let u="open-wasqlite-db";class h{logger;#y=new Map;#w=new s.Mutex;constructor(t){this.logger=t}async handleConnection({logLevel:t,database:e,lockName:i}){return n.proxy(await this.openConnectionLocally({log:e=>{e.level>=t&&this.logger.log(e)}},e,i))}async connectToExisting(t,e){return(0,a.getNavigatorLocks)().request(u,async()=>{let i=this.#y.get(t);if(null==i)throw Error(`connectToExisting(${t}) failed because the worker doesn't own a database with that name.`);return n.proxy(await i.connect(e))})}async openConnectionLocally(t,n,i){let a;for(let i=0;i<2;i++)try{a=await this.#f(t,n)}catch(t){this.logger.log({level:e.LogLevels.warn,message:`Attempt ${i+1} of 3 to open database failed, retrying in 1 second...`,error:t}),await new Promise(t=>setTimeout(t,1e3))}return(a??=await this.#f(t,n)).connect(i)}async #f(t,e){let{filename:n,readonly:s,vfs:l}=e,h=!(d||s||l==c.WASQLiteVFS.InMemoryVfs),g=this.#y;async function p(){let a=g.get(n);if(null==a){let s=new r.RawSqliteConnection(e),l=new o(s,h),c=await l.acquireMutex();try{await s.init()}catch(t){throw c(),await s.close(),t}c(),a=new i.DatabaseServer({inner:l,logger:t,onClose:()=>g.delete(n)}),g.set(n,a)}return a}return h?(0,a.getNavigatorLocks)().request(u,p):this.#w.runExclusive(p)}closeAll(){return Promise.all([...this.#y.values()].map(t=>{t.forceClose()}))}}let d="SharedWorkerGlobalScope"in globalThis;t.s(["MultiDatabaseServer",0,h,"isSharedWorker",0,d],919709)},741895,t=>{"use strict";t.i(533243);var e,n,i=t.i(327007),a=t.i(736207),r=t.i(297007),s=t.i(426057);t.i(993150);var o=t.i(592489),l=t.i(675995),c=t.i(826663),u=t.i(799386),h=t.i(255519),d=t.i(101014),g=t.i(590523),p=t.i(114435),m=t.i(278918),y=t.i(521290);(e=n||(n={})).CLOSE_CLIENT="close-client",e.CLOSE_ACK="close-ack";let w={};class f extends i.BaseObserver{ports;isInitialized;statusListener;fetchCredentialsController;uploadDataController;syncParams;lastConnectOptions;portMutex;subscriptions=[];connectionManager;syncStatus;logger;database=this.generateReconnectableDatabase();sharedCloseSignal=(0,y.generateTabCloseSignal)();constructor(){super(),this.ports=[],this.syncParams=null,this.lastConnectOptions=void 0,this.portMutex=new u.Mutex,this.isInitialized=new Promise(t=>{let e=this.registerListener({initialized:()=>{t(),e?.()}})}),this.logger=new p.BroadcastLogger("shared-sync",this.ports),this.connectionManager=new l.ConnectionManager({createSyncImplementation:async()=>{await this.waitForReady();let t=this.generateStreamingImplementation(),e=t.registerListener({statusChanged:t=>{this.syncStatus=t;let e=t.toJSON();this.ports.forEach(t=>t.clientProvider.statusChanged(e))}});return{sync:t,onDispose:e}},logger:this.logger,defaultConnectionMethod:s.SyncStreamConnectionMethod.HTTP})}get isConnected(){return this.connectionManager.syncStreamImplementation?.isConnected??!1}async getLastWrappedPort(){return await this.portMutex.runExclusive(()=>{for(let t=this.ports.length-1;t>=0;t--)if(!this.ports[t].isClosing)return this.ports[t]})}async getRandomWrappedPort(){return await this.portMutex.runExclusive(()=>{let t=this.ports.filter(t=>!t.isClosing);return t[Math.floor(Math.random()*t.length)]})}async waitUntilStatusMatches(t){return this.withSyncImplementation(async e=>e.waitUntilStatusMatches(t))}async waitForReady(){return this.isInitialized}collectActiveSubscriptions(){this.logger.log({level:r.LogLevels.debug,message:"Collecting active stream subscriptions across tabs"});let t=new Map;for(let e of this.ports)for(let n of e.currentSubscriptions){let e=JSON.stringify(n);t.set(e,n)}this.subscriptions=[...t.values()],this.logger.log({level:r.LogLevels.debug,message:`Collected stream subscriptions, ${JSON.stringify(this.subscriptions)}`}),this.connectionManager.syncStreamImplementation?.updateSubscriptions(this.subscriptions)}updateSubscriptions(t,e){t.currentSubscriptions=e,this.collectActiveSubscriptions()}setLogLevel(t){this.logger.setLevel(t)}
183async setParams(t){await this.portMutex.runExclusive(async()=>{this.collectActiveSubscriptions()}),this.syncParams||(this.syncParams=t,this.logger.sendBroadcasts=t.enableBroadcastLogs,await this.database.readLock(async()=>{}),self.onerror=t=>{this.logger.log({level:r.LogLevels.error,message:"Uncaught exception in PowerSync shared sync worker",error:t})},this.iterateListeners(t=>t.initialized?.()))}async dispose(){return await this.waitForReady(),this.statusListener?.(),this.connectionManager.close()}async connect(t,e){return this.lastConnectOptions=t,this.connectionManager.connect(w,t??{},e)}async disconnect(){return this.connectionManager.disconnect()}async addPort(t){return await this.portMutex.runExclusive(()=>{let e={port:t,clientProvider:h.wrap(t),currentSubscriptions:[],closeListeners:[],isClosing:!1};this.ports.push(e);let n=this.syncStatus;return n&&e.clientProvider.statusChanged(n.toJSON()),e})}async removePort(t){return t.isClosing=!0,await this.portMutex.runExclusive(async()=>{let e=this.ports.findIndex(e=>e==t);if(e<0)return this.logger.log({level:r.LogLevels.warn,message:`Could not remove port ${t} since it is not present in active ports.`}),()=>{};let n=this.ports[e];for(let i of(this.ports.splice(e,1),[this.fetchCredentialsController,this.uploadDataController].forEach(e=>{e?.activePort==t&&e.controller.abort(new o.AbortOperation("Closing pending requests after client port is removed"))}),n.closeListeners))await i();return this.collectActiveSubscriptions(),()=>n.clientProvider[h.releaseProxy]()})}triggerCrudUpload(){this.withSyncImplementation(async t=>{t.triggerCrudUpload()})}async getWriteCheckpoint(){return this.withSyncImplementation(async t=>t.getWriteCheckpoint())}async withSyncImplementation(t){return(await this.waitForReady(),this.connectionManager.syncStreamImplementation)?t(this.connectionManager.syncStreamImplementation):t(await new Promise(t=>{let e=this.connectionManager.registerListener({syncStreamCreated:n=>{t(n),e?.()}})}))}generateStreamingImplementation(){let t=this.syncParams;return new g.WebStreamingSyncImplementation({adapter:new c.SqliteBucketStorage(this.database,this.logger),remote:new d.WebRemote({invalidateCredentials:async()=>{let t=await this.getLastWrappedPort();if(!t)throw Error("No client port found to invalidate credentials");try{this.logger.log({level:r.LogLevels.info,message:"calling the last port client provider to invalidate credentials"}),t.clientProvider.invalidateCredentials()}catch(t){this.logger.log({level:r.LogLevels.error,message:"error invalidating credentials",error:t})}},fetchCredentials:async()=>{let t=await this.getLastWrappedPort();if(!t)throw Error("No client port found to fetch credentials");return new Promise(async(e,n)=>{let i=new AbortController;this.fetchCredentialsController={controller:i,activePort:t},i.signal.onabort=n;try{this.logger.log({level:r.LogLevels.info,message:"calling the last port client provider for credentials"}),e(await t.clientProvider.fetchCredentials())}catch(t){n(t)}finally{this.fetchCredentialsController=void 0}})}},this.logger),uploadCrud:async()=>{let t=await this.getLastWrappedPort();if(!t)throw Error("No client port found to upload crud");return new Promise(async(e,n)=>{let i=new AbortController;this.uploadDataController={controller:i,activePort:t},i.signal.onabort=()=>e();try{e(await t.clientProvider.uploadCrud())}catch(t){n(t)}finally{this.uploadDataController=void 0}})},...t.streamOptions,subscriptions:this.subscriptions,logger:this.logger})}async openInternalDB(t){let e=await this.getRandomWrappedPort();if(!e)throw Error("Could not open DB connection since no client is connected.");let n=setTimeout(()=>{i.abort()},1e4),i=new AbortController,a=()=>{i.abort()},s=()=>{let t=e.closeListeners.indexOf(a);t>=0&&e.closeListeners.splice(t,1)};e.closeListeners.push(a);let o=await b({action:()=>e.clientProvider.getDBWorkerPort(),signal:i.signal,cleanupOnAbort:t=>{t.close()}}).catch(t=>{throw s(),t}),l=h.wrap(o),c=this.syncParams.dbParams.dbFilename,u=await this.sharedCloseSignal,d=await b({action:async()=>{let t=await l.connectToExisting({identifier:c,lockName:u});return new m.DatabaseClient({connection:t,source:l,remoteCanCloseUnexpectedly:!0},this.syncParams.dbParams)},signal:i.signal,cleanupOnAbort:t=>{t.close()}}).finally(()=>{s()});return clearTimeout(n),e.closeListeners.push(async()=>{this.logger.log({level:r.LogLevels.info,message:"Aborting open connection because associated tab closed."}),t(d),d.markRemoteClosed(),d.close().catch(t=>this.logger.log({level:r.LogLevels.warn,message:"error closing database connection",error:t}))}),d}generateReconnectableDatabase(){let t=this.syncParams,e=this;return new class extends a.DBAdapter{connectionState=null;get name(){return t?.dbParams.dbFilename}async connect(){if(null==this.connectionState){let t=this.handleClientClosed.bind(this);this.connectionState=(async()=>{try{let n=await e.openInternalDB(t);return n.registerListener({tablesUpdated:t=>{this.iterateListeners(e=>e.tablesUpdated?.(t))}}),this.connectionState=n,n}catch(t){throw this.connectionState=null,t}})()}return await this.connectionState}async close(){null!=this.connectionState&&await (await this.connectionState).close()}handleClientClosed(t){if(t===this.connectionState){this.connectionState=null;let t=e.connectionManager.syncStreamImplementation;t?.triggerCrudUpload(),t?.markConnectionMayHaveChanged()}}async readLock(t,e){return(await this.connect()).readLock(t,e)}async writeLock(t,e){return(await this.connect()).writeLock(t,e)}async refreshSchema(){}}}}function b(t){let{action:e,signal:n,cleanupOnAbort:i}=t;return new Promise((t,a)=>{if(n.aborted)return void a(new o.AbortOperation("Operation aborted by abort controller"));function r(){n.removeEventListener("abort",r),a(new o.AbortOperation("Operation aborted by abort controller"))}function s(t){n.removeEventListener("abort",r),t()}n.addEventListener("abort",r,{once:!0}),e().then(e=>{if(n.aborted)return s(()=>i?.(e));s(()=>t(e))}).catch(t=>s(()=>a(t)))})}t.s(["SharedSyncClientEvent",0,n,"SharedSyncImplementation",0,f])},255519,t=>{"use strict";let e=Symbol("Comlink.proxy"),n=Symbol("Comlink.endpoint"),i=Symbol("Comlink.releaseProxy"),a=Symbol("Comlink.finalizer"),r=Symbol("Comlink.thrown"),s=t=>"object"==typeof t&&null!==t||"function"==typeof t,o=new Map([["proxy",{canHandle:t=>
183s(t)&&t[e],serialize(t){let{port1:e,port2:n}=new MessageChannel;return l(t,e),[n,[n]]},deserialize:t=>(t.start(),u(t))}],["throw",{canHandle:t=>s(t)&&r in t,serialize:({value:t})=>[t instanceof Error?{isError:!0,value:{message:t.message,name:t.name,stack:t.stack}}:{isError:!1,value:t},[]],deserialize(t){if(t.isError)throw Object.assign(Error(t.value.message),t.value);throw t.value}}]]);function l(t,e=globalThis,n=["*"]){e.addEventListener("message",function i(s){let o;if(!s||!s.data)return;if(!function(t,e){for(let n of t)if(e===n||"*"===n||n instanceof RegExp&&n.test(e))return!0;return!1}(n,s.origin))return void console.warn(`Invalid origin '${s.origin}' for comlink proxy`);let{id:u,type:h,path:d}=Object.assign({path:[]},s.data),g=(s.data.argumentList||[]).map(S);try{let e=d.slice(0,-1).reduce((t,e)=>t[e],t),n=d.reduce((t,e)=>t[e],t);switch(h){case"GET":o=n;break;case"SET":e[d.slice(-1)[0]]=S(s.data.value),o=!0;break;case"APPLY":o=n.apply(e,g);break;case"CONSTRUCT":{let t=new n(...g);o=f(t)}break;case"ENDPOINT":{let{port1:e,port2:n}=new MessageChannel;l(t,n),o=w(e,[e])}break;case"RELEASE":o=void 0;break;default:return}}catch(t){o={value:t,[r]:0}}Promise.resolve(o).catch(t=>({value:t,[r]:0})).then(n=>{let[r,s]=b(n);e.postMessage(Object.assign(Object.assign({},r),{id:u}
183),s),"RELEASE"===h&&(e.removeEventListener("message",i),c(e),a in t&&"function"==typeof t[a]&&t[a]())}).catch(t=>{let[n,i]=b({value:TypeError("Unserializable return value"),[r]:0});e.postMessage(Object.assign(Object.assign({},n),{id:u}),i)})}),e.start&&e.start()}function c(t){"MessagePort"===t.constructor.name&&t.close()}function u(t,e){let a=new Map;return t.addEventListener("message",function(t){let{data:e}=t;if(!e||!e.id)return;let n=a.get(e.id);if(n)try{n(e)}finally{a.delete(e.id)}}),function t(e,a,r=[],s=function(){}){let o,l=!1,c=new Proxy(s,{get(n,s){if(h(l),s===i)return()=>{p&&p.unregister(c),d(e),a.clear(),l=!0};if("then"===s){if(0===r.length)return{then:()=>c};let t=E(e,a,{type:"GET",path:r.map(t=>t.toString())}).then(S);return t.then.bind(t)}return t(e,a,[...r,s])},set(t,n,i){h(l);let[s,o]=b(i);return E(e,a,{type:"SET",path:[...r,n].map(t=>t.toString()),value:s},o).then(S)},apply(i,s,o){h(l);let c=r[r.length-1];if(c===n)return E(e,a,{type:"ENDPOINT"}).then(S);if("bind"===c)return t(e,a,r.slice(0,-1));let[u,d]=m(o);return E(e,a,{type:"APPLY",path:r.map(t=>t.toString()),argumentList:u},d).then(S)},construct(t,n){h(l);let[i,s]=m(n);return E(e,a,{type:"CONSTRUCT",path:r.map(t=>t.toString()),argumentList:i},s).then(S)}});return o=(g.get(e)||0)+1,g.set(e,o),p&&p.register(c,e,c),c}(t,a,[],e)}function h(t){if(t)throw Error("Proxy has been released and is not useable")}function d(t){return E(t,new Map,{type:"RELEASE"}).then(()=>{c(t)})}let g=new WeakMap,p="FinalizationRegistry"in globalThis&&new FinalizationRegistry(t=>{let e=(g.get(t)||0)-1;g.set(t,e),0===e&&d(t)});function m(t){var e;let n=t.map(b);return[n.map(t=>t[0]),(e=n.map(t=>t[1]),Array.prototype.concat.apply([],e))]}let y=new WeakMap;function w(t,e){return y.set(t,e),t}function f(t){return Object.assign(t,{[e]:!0})}function b(t){for(let[e,n]of o)if(n.canHandle(t)){let[i,a]=n.serialize(t);return[{type:"HANDLER",name:e,value:i},a]}return[{type:"RAW",value:t},y.get(t)||[]]}function S(t){switch(t.type){case"HANDLER":return o.get(t.name).deserialize(t.value);case"RAW":return t.value}}function E(t,e,n,i){return new Promise(a=>{let r=[,,,,].fill(0).map(()=>Math.floor(Math.random()*Number.MAX_SAFE_INTEGER).toString(16)).join("-");e.set(r,a),t.start&&t.start(),t.postMessage(Object.assign({id:r},n),i)})}t.s(["createEndpoint",0,n,"expose",0,l,"proxy",0,f,"releaseProxy",0,i,"transfer",0,w,"wrap",0,u])}]);
184
185//# chunkId=fb6b2677-70b6-515e-9498-3aa9fd87465c

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.