summaryrefslogtreecommitdiffhomepage
path: root/packages/enterprise/src/core/share.ts
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-12-01 16:58:59 -0500
committerDax Raad <[email protected]>2025-12-01 16:58:59 -0500
commit01e2c9cc21c5a0a5d23928cab7b3100c4d6f79a1 (patch)
tree1dc17ad9c7854bb6815477732cdc96c970c6f203 /packages/enterprise/src/core/share.ts
parent4acb645f04aacf0d8bad8ea526e6ba895d123d57 (diff)
downloadopencode-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.ts52
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
}