feat(api): bind encrypted workspaces to accounts and devices
This commit is contained in:
1 parent
019b15041a
commit
c7d8ef15bc
49 files changed
+1904
-278
No files matched your search
@@ -57,13 +57,15 @@ class ByteQueue {
|
||||
async function* bytesOf(source: ReadableStream<Uint8Array> | AsyncIterable<Uint8Array>): AsyncGenerator<Uint8Array, void, void> {
|
||||
if (typeof ReadableStream !== 'undefined' && source instanceof ReadableStream) {
|
||||
const reader = source.getReader();
|
||||
let finished = false;
|
||||
try {
|
||||
for (;;) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) return;
|
||||
if (done) { finished = true; return; }
|
||||
yield value;
|
||||
}
|
||||
} finally {
|
||||
if (!finished) await reader.cancel().catch(() => {});
|
||||
reader.releaseLock();
|
||||
}
|
||||
}
|
||||
@@ -136,21 +138,19 @@ export async function* decryptItemFrames(
|
||||
if (finalSeen) throw new IntegrityError('frame_after_final');
|
||||
if (env.frameIndex !== expected) throw new IntegrityError('gap');
|
||||
|
||||
const itemFlags = env.flags & (Flags.Gated | Flags.Snapshot);
|
||||
const itemFlags = env.flags & (Flags.Gated | Flags.Snapshot | Flags.Control);
|
||||
if (flagsMask === undefined) flagsMask = itemFlags;
|
||||
else if (flagsMask !== itemFlags) throw new IntegrityError('flags_changed');
|
||||
|
||||
let data: Bytes;
|
||||
if (ctx.mode === 'enc') {
|
||||
data = await openFrame(await ctx.itemKey(env.itemId), ctx.channelId, env);
|
||||
if (env.frameIndex === 0) {
|
||||
const first = decodeFirstFrame(data);
|
||||
meta = first.meta;
|
||||
data = first.content;
|
||||
}
|
||||
} else {
|
||||
data = env.payload;
|
||||
}
|
||||
if (env.frameIndex === 0) {
|
||||
const first = decodeFirstFrame(data); meta = first.meta; data = first.content;
|
||||
}
|
||||
|
||||
expected++;
|
||||
if ((env.flags & Flags.Final) !== 0) finalSeen = true;
|
||||
@@ -190,7 +190,8 @@ export function decryptItemStream(
|
||||
controller.error(e);
|
||||
}
|
||||
},
|
||||
async cancel() {
|
||||
async cancel(reason) {
|
||||
reject(reason ?? new DOMException('解密已取消', 'AbortError'));
|
||||
await gen.return({ complete: false, nextIndex: opts.fromIndex ?? 0, meta: undefined });
|
||||
},
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user