A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: improve atproto sync

+20 -4
+4 -3
src/components/output/raw/atproto/element.js
··· 125 125 }; 126 126 127 127 await this.putRecords("sh.diffuse.output.trackBundle", [bundle]); 128 - 129 128 lastPersistedTracks = data; 130 129 }, 131 130 }, ··· 143 142 #isOnline = signal(navigator.onLine); 144 143 #rev = signal(/** @type {string | null} */ (null)); 145 144 #revFetchedAt = 0; 145 + #ownRevs = new Set(); 146 146 #writing = 0; 147 147 148 148 /** @type {Array<{ fn: () => Promise<void>, resolve: () => void, reject: (err: unknown) => void }>} */ ··· 337 337 if (message.$type !== "com.atproto.sync.subscribeRepos#commit") return; 338 338 if (message.repo !== this.#did.value) return; 339 339 340 - // Skip commits we made ourselves (rev already reflects current state) 341 - if (message.rev === this.#rev.value) return; 340 + // Skip commits we made ourselves (all intermediate revs, not just the last) 341 + if (this.#ownRevs.delete(message.rev)) return; 342 342 343 343 const touched = new Set( 344 344 (message.ops ?? []) ··· 642 642 643 643 if (result?.commit?.rev) { 644 644 this.#rev.value = result.commit.rev; 645 + this.#ownRevs.add(result.commit.rev); 645 646 } 646 647 }; 647 648
+16 -1
src/components/transformer/output/raw/atproto-sync/element.js
··· 157 157 const l = this.#localOutput.get(); 158 158 const remote = this.base(); 159 159 const atproto = this.#atproto(); 160 + 160 161 if (!l || !atproto || !remote.ready()) return; 161 162 162 163 const remoteRev = await atproto.getLatestCommit(); ··· 212 213 213 214 this.#trackIds(name, merged); 214 215 await l[name].save(merged); 215 - await remote[name].save(merged); 216 + 217 + if (this.#differFromRemote(merged, remoteArr)) { 218 + await remote[name].save(merged); 219 + } 216 220 } 217 221 } 218 222 ··· 279 283 } 280 284 281 285 return [...merged.values()]; 286 + } 287 + 288 + /** 289 + * @param {Array<{ id: string, updatedAt?: string }>} merged 290 + * @param {Array<{ id: string, updatedAt?: string }>} remote 291 + * @returns {boolean} 292 + */ 293 + #differFromRemote(merged, remote) { 294 + if (merged.length !== remote.length) return true; 295 + const remoteMap = new Map(remote.map((r) => [r.id, r.updatedAt])); 296 + return merged.some((r) => remoteMap.get(r.id) !== r.updatedAt); 282 297 } 283 298 284 299 // TOMBSTONES & KNOWN IDS