Skip to content

SCORM

Both SCORM standards, behind one interface. A course writes to IScormDataModel and does not branch on the version; the differences between 1.2 and 2004 are absorbed here.

Folder What lives here
Runtime/ Scorm12Runtime, Scorm2004Runtime, and the stubs used off-WebGL
Helpers/ Vocabulary mapping, time formatting, error decoding, suspend-data packing
Data/ Objective and ScormInteraction — the two things courses report in bulk

What actually differs between the two standards

Worth knowing, because it is why this folder is not one class:

Element names. 1.2 puts the core data model under cmi.core.* (cmi.core.lesson_status, cmi.core.score.raw); 2004 drops the core segment and renames most of it (cmi.completion_status, cmi.success_status, cmi.score.scaled).

One status versus two. 1.2 has a single lesson_status carrying passed, failed, completed, incomplete, browsed and not attempted — success and completion share a slot. 2004 splits them into completion_status and success_status, which are genuinely independent: a learner can complete without passing.

That split is the source of the one real asymmetry in this package. On 1.2, writing Completed over a recorded passed would throw away the pass, so a Completed write is ignored once success is on record. Incomplete still overwrites, because the learner genuinely is not finished. Browsed is left alone too — it is valid 1.2 vocabulary with no 2004 equivalent, so routing the setter through the version projection would have made it a silent no-op.

Vocabulary. A wrong answer is wrong in 1.2 and incorrect in 2004; a timed-out interaction is time-out, with the hyphen, in 2004. ScormStatusMap.InteractionResult translates, so a course can use either spelling.

Suspend-data size. 4096 characters on 1.2, 64000 on 2004 (3rd/4th Edition — 2nd allowed only 4096). SuspendDataUtil compresses to fit and refuses rather than truncating, because a truncated payload will not deserialize and would destroy the last save that did.

Scaled score. 2004 only. On 1.2 there is nowhere to put it.