Skip to content

fix: release DeckOps 4.0.1 — browser runtime fixes - #3

Open
iguangfei wants to merge 2 commits into
mainfrom
fix/4.0.1
Open

iguangfei wants to merge 2 commits into
mainfrom
fix/4.0.1

Conversation

@iguangfei

Copy link
Copy Markdown
Member

Summary

Patch release from runtime checks of the installed 4.0.0 browser entry in platform-slide-editor (45 checks against the fixture with fault injection: 43 passed, 2 SDK defects, 3 improvements).

Fixes

  • Shared uploads (SDK-1). When two calls on one client converted/extracted the same File, the second inherited the first call's end: if the first was cancelled with its own reason or timed out, the second failed at once with the first's error. A joined upload that fails for any reason now leaves the caller to upload for itself; the caller ends only by its own signal or timeout, also while it waits.
  • SSE network failures (SDK-2, M7). A task's event stream that failed at the network layer (no HTTP status) was retried every 5 s for up to 100 attempts, so a finished task was never seen. Waiting now falls back to polling on any stream failure at once; tasks.subscribe keeps reconnecting by default.

Improvements

  • Late 401s (M1). A 401 for a request sent before a shared refresh finished retries once with the new token instead of calling onUnauthorized again. Found while testing it: a refresh that returned a bare token rewrote the retried request into the client's default space, so a call with its own spaceId created its task in the wrong space. That is fixed too.
  • 402 message (M14). A 402 now rejects with the server's message instead of a generic checkout text; the body stays in details.
  • Device id. authUuid, localStorage df_uuid and the Node device id accept any 1–100 visible ASCII characters (the server hashes the value and stores it in a 100-character column), so an app's nanoid df_uuid is reused instead of overwritten.

Known limitations (unchanged, documented in the CHANGELOG): axios registers a window message listener at import in browser-like environments; createClient() reads/writes df_uuid right after construction; a single signed PUT reports progress only at completion.

Verification

  • Each fix has a test that fails on 4.0.0 and passes here: two shared-upload failover cases (custom abort reason, owner timeout) plus a joined call ending by its own signal; an injected SSE TypeError('Failed to fetch') with the task finishing at 300 ms, which now resolves in under 1 s; a late 401 refreshing once; a call-level space surviving a refresh; the server's 402 message; nanoid authUuid and df_uuid.
  • pnpm check: 13 files / 219 tests, typecheck, build, browser export (39,239 bytes gzip, budget 43,163 = measured + 10 %), boundaries, built CLI contract. Also run in a clean worktree without local samples.
  • pnpm check:package: tarball 363 KiB; --omit=optional install 4.43 MiB; default install 9.00 MiB with probe; cold start P95 59 ms.

🤖 Generated with Claude Code

iguangfei and others added 2 commits October 20, 2026 21:17
Runtime checks of the 4.0.0 browser entry in platform-slide-editor found:

- A call that joined another call's upload of the same File failed at
  once with that call's error when it was cancelled with its own reason or
  timed out; only a bare AbortError made it upload again. A joined upload
  that fails for any reason now leaves the caller to upload for itself,
  and the caller ends only by its own signal, also while it waits.
- An event stream that failed at the network layer (no status) was
  retried every 5 s for up to 100 attempts, on top of fetch retries,
  instead of falling back to polling. Waiting now subscribes without
  reconnecting, so any stream failure falls back to polling at once;
  tasks.subscribe keeps reconnecting by default.
- A 401 for a request sent before a shared refresh finished called
  onUnauthorized again. Requests record the token version they were sent
  with and retry once with a newer token without refreshing. A refresh
  that returns a bare token also no longer rewrites the retried request
  into the client's default space, which created a call-level-space task
  in the wrong space.
- A 402 used a generic checkout message; it now carries the server's.
- authUuid, df_uuid and the Node device id accept any 1-100 visible ASCII
  characters (the server hashes and stores them in a 100-character
  column), so an app's nanoid df_uuid is reused instead of overwritten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CHANGELOG entry with known limitations, skill tested version, and the
browser gzip budget at the measured 39,239 bytes plus 10 %.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant