docs(tests): explain asset authorization and byte retention lifecycle

This commit is contained in:
2026-11-12 17:39:05 +08:00
parent 1c549724e8
commit b768c2d6bf
5 changed files with 11 additions and 1 deletions
+2
View File
@@ -36,6 +36,7 @@ test('last release aborts a load; a late source cannot replace or evict a newly
const cancelled = assert.rejects(old.ready, { code: 'display_released' }); old.release(); await cancelled; assert.equal(signal.aborted, true);
const next = cache.acquire(owner, 'asset', async () => ({ url: 'blob:new', release: () => newDisposed++ })); assert.equal(await next.ready, 'blob:new');
gate.resolve({ url: 'blob:old', release: () => oldDisposed++ }); await tick(); assert.equal(oldDisposed, 1); assert.equal(newDisposed, 0);
// peer 的 load 一旦调用就抛错;成功读到 blob:new 证明迟到旧源没有逐出当前同键条目。
const peer = cache.acquire(owner, 'asset', async () => { throw Error('unexpected duplicate read'); }); assert.equal(await peer.ready, 'blob:new'); peer.release(); next.release(); assert.equal(newDisposed, 1);
});
// 读取失败保留原错误码并移除失败条目,新 acquire 可重新读取成功,不永久缓存错误。
@@ -63,6 +64,7 @@ test('cache close rejects waiting readers immediately and disposes late data wit
assert.throws(() => cache.acquire({}, 'asset', async () => ({ url: '/late' })), { code: 'display_scope_closed' }); cache.close();
});
// 空 URL 等非法源需清理已分配资源;某个 release 抛错通过 onError 报告,不能阻止其他 owner 的清理。
// disposed 在这里直接累加每次底层 release 调用,与幂等句柄内部去重后的有效释放计数不同。
test('invalid sources clean their allocation and cleanup errors do not interrupt other owners', async () => {
const errors = [], cache = createDisplayCache({ onError: error => errors.push(error) }); let disposed = 0;
const invalid = cache.acquire({}, 'invalid', async () => ({ url: '', release: () => disposed++ })); await assert.rejects(invalid.ready, { code: 'invalid_display_source' }); assert.equal(disposed, 1);