// the find
jcputney/scorm-again
A modern SCORM JavaScript runtime library.
A TypeScript SCORM 1.2 and SCORM 2004 runtime that sits in your LMS host page and exposes the API globals that SCORM content packages expect. It handles the full spec surface: CMI data model, commit lifecycle, sequencing, and cross-origin iframe communication. Aimed at teams building custom LMS players or integrating SCORM content without a full commercial LMS.
The cross-frame postMessage bridge is genuinely well-thought-out — it uses a Proxy façade so SCORM content gets synchronous-looking calls while the real work happens async, and it avoids SharedArrayBuffer so you're not fighting COOP/COEP headers. The v3 decision to make commits synchronous by default is correct; async commits were the source of real data loss at termination, and the library now documents why useAsynchronousCommits is non-compliant. Per-API entry points (scorm-again/scorm12, scorm-again/scorm2004) mean you can drop half the bundle if you only need one standard. The Beacon API support on terminate is a practical fix for the classic 'page unload kills your XHR' problem that catches LMS developers off guard.
SCORM 2004 sequencing is a 600-page spec appendix and the 'complete implementation' claim should be treated with skepticism until you run your actual content against it — sequencing edge cases around rollup rules and flow traversal are where every implementation eventually cracks. The offline support is flagged in the README as still being developed for v3, meaning you're taking on unfinished code if you rely on it. The cross-frame cache-first approach means GetValue returns stale data synchronously while the async refresh happens behind the scenes — fine for most CMI reads, but any content that sets a value and immediately reads it back in the same tick can see the old value, which is a subtle invariant that isn't prominently documented. The dist directory is committed to the repo, so every release creates a large churn of generated files in diffs and the GOD-CLASS-REFACTORING.md sitting at the root is a flag that significant internal debt was recently tackled, meaning some of the refactored code is newer than its test coverage suggests.