diff options
| author | Dax Raad <[email protected]> | 2025-12-01 16:58:59 -0500 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-12-01 16:58:59 -0500 |
| commit | 01e2c9cc21c5a0a5d23928cab7b3100c4d6f79a1 (patch) | |
| tree | 1dc17ad9c7854bb6815477732cdc96c970c6f203 /packages/enterprise/src/core/share.ts | |
| parent | 4acb645f04aacf0d8bad8ea526e6ba895d123d57 (diff) | |
| download | opencode-01e2c9cc21c5a0a5d23928cab7b3100c4d6f79a1.tar.gz opencode-01e2c9cc21c5a0a5d23928cab7b3100c4d6f79a1.zip | |
core: fix share compaction reprocessing same events by making storage list boundaries exclusive
Diffstat (limited to 'packages/enterprise/src/core/share.ts')
| -rw-r--r-- | packages/enterprise/src/core/share.ts | 52 |
1 files changed, 27 insertions, 25 deletions
diff --git a/packages/enterprise/src/core/share.ts b/packages/enterprise/src/core/share.ts index 46b277d12..a85994c31 100644 --- a/packages/enterprise/src/core/share.ts +++ b/packages/enterprise/src/core/share.ts @@ -93,38 +93,40 @@ export namespace Share { console.log("reading pending events") const list = await Storage.list({ prefix: ["share_event", shareID], - end: compaction.event, + before: compaction.event, }).then((x) => x.toReversed()) console.log("compacting", list.length) - const data = await Promise.all(list.map(async (event) => await Storage.read<Data[]>(event))).then((x) => x.flat()) - for (const item of data) { - if (!item) continue - const key = (item: Data) => { - switch (item.type) { - case "session": - return "session" - case "message": - return `message/${item.data.id}` - case "part": - return `${item.data.messageID}/${item.data.id}` - case "session_diff": - return "session_diff" - case "model": - return "model" + if (list.length > 0) { + const data = await Promise.all(list.map(async (event) => await Storage.read<Data[]>(event))).then((x) => x.flat()) + for (const item of data) { + if (!item) continue + const key = (item: Data) => { + switch (item.type) { + case "session": + return "session" + case "message": + return `message/${item.data.id}` + case "part": + return `${item.data.messageID}/${item.data.id}` + case "session_diff": + return "session_diff" + case "model": + return "model" + } + } + const id = key(item) + const result = Binary.search(compaction.data, id, key) + if (result.found) { + compaction.data[result.index] = item + } else { + compaction.data.splice(result.index, 0, item) } } - const id = key(item) - const result = Binary.search(compaction.data, id, key) - if (result.found) { - compaction.data[result.index] = item - } else { - compaction.data.splice(result.index, 0, item) - } + compaction.event = list.at(-1)?.at(-1) + await Storage.write(["share_compaction", shareID], compaction) } - compaction.event = list.at(-1)?.at(-1) - await Storage.write(["share_compaction", shareID], compaction) return compaction.data } |
