@superbuilders/primer-tives 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +18 -1
- package/dist/client.js.map +3 -3
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAIX,WAAW,EAMX,MAAM,mCAAmC,CAAA;AAG1C,UAAU,YAAY;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAClE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAClE;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAY,MAAM,iCAAiC,CAAA;AACtE,OAAO,KAAK,EAIX,WAAW,EAMX,MAAM,mCAAmC,CAAA;AAG1C,UAAU,YAAY;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IAClE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;IACjE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAClE;AAkCD,QAAA,MAAM,cAAc,iCAAiC,CAAA;AACrD,QAAA,MAAM,YAAY,oBAAoB,CAAA;AAEtC,UAAU,MAAM,CAAC,IAAI,SAAS,KAAK,GAAG,KAAK;IAC1C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,IAAI,EAAE,CAAA;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAC9B;AAED,UAAU,MAAM,CAAC,IAAI,SAAS,KAAK,GAAG,KAAK;IAC1C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAA;CACpD;AA+CD,iBAAS,MAAM,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAoc5E;AAED,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,CAAA;AAC/C,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/client.js
CHANGED
|
@@ -268,6 +268,9 @@ function create(config) {
|
|
|
268
268
|
}
|
|
269
269
|
return execute({ kind: "interaction", submission: { type: "choice", selectedKeys } }, "interaction");
|
|
270
270
|
},
|
|
271
|
+
timeout: function timeout() {
|
|
272
|
+
return execute({ kind: "timeout" }, "timeout");
|
|
273
|
+
},
|
|
271
274
|
toJSON: poisonToJSON
|
|
272
275
|
};
|
|
273
276
|
}
|
|
@@ -280,6 +283,9 @@ function create(config) {
|
|
|
280
283
|
submitText: function submitText(value) {
|
|
281
284
|
return execute({ kind: "interaction", submission: { type: "text-entry", value } }, "interaction");
|
|
282
285
|
},
|
|
286
|
+
timeout: function timeout() {
|
|
287
|
+
return execute({ kind: "timeout" }, "timeout");
|
|
288
|
+
},
|
|
283
289
|
toJSON: poisonToJSON
|
|
284
290
|
};
|
|
285
291
|
}
|
|
@@ -307,6 +313,9 @@ function create(config) {
|
|
|
307
313
|
submitText: function submitText(value) {
|
|
308
314
|
return execute({ kind: "interaction", submission: { type: "extended-text", values: [value] } }, "interaction");
|
|
309
315
|
},
|
|
316
|
+
timeout: function timeout() {
|
|
317
|
+
return execute({ kind: "timeout" }, "timeout");
|
|
318
|
+
},
|
|
310
319
|
toJSON: poisonToJSON
|
|
311
320
|
};
|
|
312
321
|
}
|
|
@@ -328,6 +337,9 @@ function create(config) {
|
|
|
328
337
|
}
|
|
329
338
|
return execute({ kind: "interaction", submission: { type: "extended-text", values } }, "interaction");
|
|
330
339
|
},
|
|
340
|
+
timeout: function timeout() {
|
|
341
|
+
return execute({ kind: "timeout" }, "timeout");
|
|
342
|
+
},
|
|
331
343
|
toJSON: poisonToJSON
|
|
332
344
|
};
|
|
333
345
|
}
|
|
@@ -338,6 +350,10 @@ function create(config) {
|
|
|
338
350
|
const submission = { type: "portable-custom", pciId, value };
|
|
339
351
|
return execute({ kind: "interaction", submission }, "interaction");
|
|
340
352
|
}
|
|
353
|
+
function timeout() {
|
|
354
|
+
log?.debug("pci timeout", { pciId });
|
|
355
|
+
return execute({ kind: "timeout" }, "timeout");
|
|
356
|
+
}
|
|
341
357
|
return {
|
|
342
358
|
phase: "interaction",
|
|
343
359
|
kind: "portable-custom",
|
|
@@ -346,6 +362,7 @@ function create(config) {
|
|
|
346
362
|
pciId,
|
|
347
363
|
properties,
|
|
348
364
|
submit,
|
|
365
|
+
timeout,
|
|
349
366
|
toJSON: poisonToJSON
|
|
350
367
|
};
|
|
351
368
|
}
|
|
@@ -380,4 +397,4 @@ export {
|
|
|
380
397
|
ADVANCE_PATH
|
|
381
398
|
};
|
|
382
399
|
|
|
383
|
-
//# debugId=
|
|
400
|
+
//# debugId=85D227CDC0814FAC64756E2164756E21
|
package/dist/client.js.map
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"sources": ["../src/errors.ts", "../src/client.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"import * as errors from \"@superbuilders/errors\"\n\nconst ErrNetwork = errors.new(\"network\")\nconst ErrJsonParse = errors.new(\"json parse\")\nconst ErrUnsupportedPci = errors.new(\"unsupported pci\")\nconst ErrInvalidPublishableKey = errors.new(\"invalid publishable key\")\nconst ErrBadRequest = errors.new(\"bad request\")\nconst ErrServerError = errors.new(\"server error\")\nconst ErrTimeout = errors.new(\"timeout\")\nconst ErrForbidden = errors.new(\"forbidden\")\nconst ErrNotFound = errors.new(\"not found\")\nconst ErrConflict = errors.new(\"conflict\")\nconst ErrRateLimited = errors.new(\"rate limited\")\nconst ErrServiceUnavailable = errors.new(\"service unavailable\")\nconst ErrNotSerializable = errors.new(\n\t\"PrimerState is live in-memory state and must not be serialized or stored\"\n)\nconst ErrInvalidSubmission = errors.new(\"invalid submission\")\nconst ErrMalformedPublishableKey = errors.new(\"malformed publishable key\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidPublishableKey,\n\tErrInvalidSubmission,\n\tErrMalformedPublishableKey,\n\tErrJsonParse,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrUnsupportedPci\n}\n",
|
|
6
|
-
"import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidPublishableKey,\n\tErrJsonParse,\n\tErrMalformedPublishableKey,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrUnsupportedPci,\n\tErrInvalidSubmission\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PciId, PciValue } from \"@superbuilders/primer-tives/pci\"\nimport type {\n\tErroredState,\n\tPciInteraction,\n\tPciInteractionState,\n\tPrimerState,\n\tRendererChoice,\n\tRendererCorrectAnswer,\n\tRendererInteraction,\n\tRendererStimulus,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/types\"\nimport type { ContentInline } from \"@superbuilders/primer-tives/content\"\n\ninterface PrimerLogger {\n\tdebug(message: string, attributes?: Record<string, unknown>): void\n\tinfo(message: string, attributes?: Record<string, unknown>): void\n\twarn(message: string, attributes?: Record<string, unknown>): void\n\terror(message: string, attributes?: Record<string, unknown>): void\n}\n\ntype WireIntent<Pcis extends PciId = PciId> =\n\t| { kind: \"observation\" }\n\t| { kind: \"interaction\"; submission: RendererSubmission<Pcis> }\n\ntype WireResult<Pcis extends PciId = PciId> =\n\t| {\n\t\t\toutcome: \"advanced\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis> | null\n\t }\n\t| {\n\t\t\toutcome: \"submitted\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis>\n\t\t\tsubmission: RendererSubmission<Pcis>\n\t\t\tisCorrect: boolean\n\t\t\tfeedbackContent: ContentInline[]\n\t\t\tcorrectAnswer: RendererCorrectAnswer | null\n\t }\n\t| { outcome: \"completed\" }\n\ninterface WireRequestBody<Pcis extends PciId = PciId> {\n\tstudentId: string\n\tsupportedPcis: readonly PciId[]\n\tintent: WireIntent<Pcis>\n}\n\ntype TransportResult<Pcis extends PciId = PciId> =\n\t| { ok: true; data: WireResult<Pcis> }\n\t| { ok: false; error: Error }\n\nconst DEFAULT_ORIGIN = \"https://sb-primer.vercel.app\"\nconst ADVANCE_PATH = \"/api/v0/advance\"\n\ninterface Config<Pcis extends PciId = PciId> {\n\treadonly publishableKey: string\n\treadonly supportedPcis: readonly Pcis[]\n\treadonly origin?: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger?: PrimerLogger\n}\n\ninterface Client<Pcis extends PciId = PciId> {\n\tstart(studentId: string): Promise<PrimerState<Pcis>>\n}\n\nfunction poisonToJSON(): never {\n\t// biome-ignore lint/plugin: intentional toJSON trap — logging here would spam on every accidental serialize attempt\n\tthrow ErrNotSerializable\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidPublishableKey\n\t}\n\tif (status === 403) {\n\t\treturn ErrForbidden\n\t}\n\tif (status === 404) {\n\t\treturn ErrNotFound\n\t}\n\tif (status === 409) {\n\t\treturn ErrConflict\n\t}\n\tif (status === 422) {\n\t\treturn ErrUnsupportedPci\n\t}\n\tif (status === 429) {\n\t\treturn ErrRateLimited\n\t}\n\tif (status === 502 || status === 503 || status === 504) {\n\t\treturn ErrServiceUnavailable\n\t}\n\treturn ErrServerError\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\treturn true\n\t}\n\tif (err instanceof DOMException && err.name === \"TimeoutError\") {\n\t\treturn true\n\t}\n\treturn false\n}\n\nconst PK_PREFIX = \"pk_\"\n\nfunction create<const Pcis extends PciId>(config: Config<Pcis>): Client<Pcis> {\n\tconst configFetch = config.fetch\n\tconst fetchFn = configFetch ? configFetch : globalThis.fetch\n\tconst log = config.logger\n\n\tif (!config.publishableKey.startsWith(PK_PREFIX)) {\n\t\tlog?.error(\"malformed publishable key\", { prefix: PK_PREFIX })\n\t\t// biome-ignore lint/plugin: client SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrMalformedPublishableKey, `key must start with '${PK_PREFIX}'`)\n\t}\n\n\tfunction transportSignal(): AbortSignal | undefined {\n\t\tif (config.abort) {\n\t\t\treturn config.abort.signal\n\t\t}\n\t\treturn undefined\n\t}\n\n\tasync function transport(body: WireRequestBody<Pcis>): Promise<TransportResult<Pcis>> {\n\t\tlog?.debug(\"transport request\", {\n\t\t\tstudentId: body.studentId,\n\t\t\tintentKind: body.intent.kind\n\t\t})\n\n\t\tconst url = config.origin ? `${config.origin}${ADVANCE_PATH}` : ADVANCE_PATH\n\t\tconst fetchResult = await fetchFn(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-Primer-Publishable-Key\": config.publishableKey\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: transportSignal()\n\t\t}).then(\n\t\t\tfunction ok(r: Response) {\n\t\t\t\treturn { ok: true, response: r } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!fetchResult.ok) {\n\t\t\tif (isAbortError(fetchResult.error)) {\n\t\t\t\tlog?.error(\"transport timeout\", {\n\t\t\t\t\tstudentId: body.studentId,\n\t\t\t\t\tintentKind: body.intent.kind\n\t\t\t\t})\n\t\t\t\treturn { ok: false, error: errors.wrap(ErrTimeout, fetchResult.error.message) }\n\t\t\t}\n\t\t\tlog?.error(\"transport network error\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\terror: fetchResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrNetwork, fetchResult.error.message) }\n\t\t}\n\n\t\tconst res = fetchResult.response\n\n\t\tif (!res.ok) {\n\t\t\tconst text = await res.text().catch(function fallback() {\n\t\t\t\treturn \"\"\n\t\t\t})\n\t\t\tconst sentinel = httpSentinel(res.status)\n\t\t\tlog?.error(\"transport http error\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(sentinel, text) }\n\t\t}\n\n\t\tconst jsonResult = await res.json().then(\n\t\t\tfunction ok(data: WireResult<Pcis>) {\n\t\t\t\treturn { ok: true, data } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!jsonResult.ok) {\n\t\t\tlog?.error(\"transport json parse failed\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\terror: jsonResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrJsonParse, jsonResult.error.message) }\n\t\t}\n\n\t\tlog?.debug(\"transport success\", {\n\t\t\tstudentId: body.studentId,\n\t\t\tintentKind: body.intent.kind\n\t\t})\n\n\t\treturn { ok: true, data: jsonResult.data }\n\t}\n\n\tfunction makeSession(studentId: string) {\n\t\tfunction resolve(result: WireResult<Pcis>): PrimerState<Pcis> {\n\t\t\tswitch (result.outcome) {\n\t\t\t\tcase \"advanced\":\n\t\t\t\t\treturn fromAdvanced(result.stimulus, result.interaction)\n\t\t\t\tcase \"submitted\":\n\t\t\t\t\treturn feedbackState(\n\t\t\t\t\t\tresult.stimulus,\n\t\t\t\t\t\tresult.interaction,\n\t\t\t\t\t\tresult.submission,\n\t\t\t\t\t\tresult.isCorrect,\n\t\t\t\t\t\tresult.feedbackContent,\n\t\t\t\t\t\tresult.correctAnswer\n\t\t\t\t\t)\n\t\t\t\tcase \"completed\":\n\t\t\t\t\treturn { phase: \"completed\", toJSON: poisonToJSON }\n\t\t\t}\n\t\t}\n\n\t\tfunction errored(\n\t\t\terror: Error,\n\t\t\tfailedPhase: \"observation\" | \"interaction\",\n\t\t\tintent: WireIntent<Pcis>\n\t\t): ErroredState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"errored\",\n\t\t\t\terror,\n\t\t\t\tfailedPhase,\n\t\t\t\tretry: function retry() {\n\t\t\t\t\tlog?.debug(\"retrying from errored state\", { failedPhase })\n\t\t\t\t\treturn execute(intent, failedPhase)\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tasync function execute(\n\t\t\tintent: WireIntent<Pcis>,\n\t\t\tphase: \"observation\" | \"interaction\"\n\t\t): Promise<PrimerState<Pcis>> {\n\t\t\tconst body: WireRequestBody<Pcis> = {\n\t\t\t\tstudentId,\n\t\t\t\tsupportedPcis: config.supportedPcis,\n\t\t\t\tintent\n\t\t\t}\n\n\t\t\tconst result = await transport(body)\n\t\t\tif (!result.ok) {\n\t\t\t\treturn errored(result.error, phase, intent)\n\t\t\t}\n\n\t\t\treturn resolve(result.data)\n\t\t}\n\n\t\tfunction isPciSupported(pciId: string): boolean {\n\t\t\tfor (const id of config.supportedPcis) {\n\t\t\t\tif (id === pciId) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\tfunction fromAdvanced(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis> | null\n\t\t): PrimerState<Pcis> {\n\t\t\tif (interaction === null) {\n\t\t\t\treturn observationState(stimulus)\n\t\t\t}\n\t\t\tif (interaction.type === \"portable-custom\") {\n\t\t\t\tif (!isPciSupported(interaction.pciId)) {\n\t\t\t\t\tlog?.error(\"unsupported pci in frame\", { pciId: interaction.pciId })\n\t\t\t\t\treturn {\n\t\t\t\t\t\tphase: \"fatal\",\n\t\t\t\t\t\terror: errors.wrap(ErrUnsupportedPci, `pci '${interaction.pciId}'`),\n\t\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pendingInteractionState(stimulus, interaction)\n\t\t}\n\n\t\tfunction observationState(stimulus: RendererStimulus | null): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"observation\",\n\t\t\t\tstimulus,\n\t\t\t\tadvance: function advance() {\n\t\t\t\t\treturn execute({ kind: \"observation\" }, \"observation\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction pendingInteractionState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis>\n\t\t): PrimerState<Pcis> {\n\t\t\tswitch (interaction.type) {\n\t\t\t\tcase \"choice\":\n\t\t\t\t\treturn choiceState(\n\t\t\t\t\t\tstimulus,\n\t\t\t\t\t\tinteraction,\n\t\t\t\t\t\tinteraction.options,\n\t\t\t\t\t\tinteraction.maxChoices,\n\t\t\t\t\t\tinteraction.minChoices\n\t\t\t\t\t)\n\t\t\t\tcase \"text-entry\":\n\t\t\t\t\treturn textEntryState(stimulus, interaction)\n\t\t\t\tcase \"extended-text\":\n\t\t\t\t\treturn extendedTextState(stimulus, interaction)\n\t\t\t\tcase \"portable-custom\":\n\t\t\t\t\treturn pciInteractionState(stimulus, interaction)\n\t\t\t}\n\t\t}\n\n\t\tfunction findUnknownKey(selectedKeys: string[], options: RendererChoice[]): string | null {\n\t\t\tconst optionIds = new Set(\n\t\t\t\toptions.map(function getId(o) {\n\t\t\t\t\treturn o.identifier\n\t\t\t\t})\n\t\t\t)\n\t\t\tfor (const key of selectedKeys) {\n\t\t\t\tif (!optionIds.has(key)) {\n\t\t\t\t\treturn key\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction validateChoiceSubmission(\n\t\t\tselectedKeys: string[],\n\t\t\toptions: RendererChoice[],\n\t\t\tmaxChoices: number,\n\t\t\tminChoices: number\n\t\t): Error | null {\n\t\t\tif (selectedKeys.length < minChoices) {\n\t\t\t\tlog?.error(\"choice submit below minChoices\", { selectedKeys, minChoices })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minChoices} selections`)\n\t\t\t}\n\t\t\tif (selectedKeys.length > maxChoices) {\n\t\t\t\tlog?.error(\"choice submit above maxChoices\", { selectedKeys, maxChoices })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxChoices} selections`)\n\t\t\t}\n\t\t\tconst uniqueKeys = new Set(selectedKeys)\n\t\t\tif (uniqueKeys.size !== selectedKeys.length) {\n\t\t\t\tlog?.error(\"choice submit has duplicates\", { selectedKeys })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, \"duplicate selections\")\n\t\t\t}\n\t\t\tconst unknownKey = findUnknownKey(selectedKeys, options)\n\t\t\tif (unknownKey) {\n\t\t\t\tlog?.error(\"choice submit has unknown key\", { key: unknownKey })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `unknown option '${unknownKey}'`)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction choiceState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"choice\" }>,\n\t\t\toptions: RendererChoice[],\n\t\t\tmaxChoices: number,\n\t\t\tminChoices: number\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"choice\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\toptions,\n\t\t\t\tmaxChoices,\n\t\t\t\tminChoices,\n\t\t\t\tsubmitChoice: function submitChoice(selectedKeys: string[]) {\n\t\t\t\t\tconst validationError = validateChoiceSubmission(\n\t\t\t\t\t\tselectedKeys,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tmaxChoices,\n\t\t\t\t\t\tminChoices\n\t\t\t\t\t)\n\t\t\t\t\tif (validationError) {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\terrored(validationError, \"interaction\", {\n\t\t\t\t\t\t\t\tkind: \"interaction\",\n\t\t\t\t\t\t\t\tsubmission: { type: \"choice\", selectedKeys }\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"choice\", selectedKeys } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction textEntryState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"text-entry\" }>\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"text-entry\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tsubmitText: function submitText(value: string) {\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"text-entry\", value } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction validateExtendedTextSubmission(\n\t\t\tvalues: string[],\n\t\t\tminStrings: number,\n\t\t\tmaxStrings: number\n\t\t): Error | null {\n\t\t\tif (values.length < minStrings) {\n\t\t\t\tlog?.error(\"extended-text submit below minStrings\", { count: values.length, minStrings })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minStrings} values`)\n\t\t\t}\n\t\t\tif (values.length > maxStrings) {\n\t\t\t\tlog?.error(\"extended-text submit above maxStrings\", { count: values.length, maxStrings })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxStrings} values`)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction extendedTextState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis> & { type: \"extended-text\" }\n\t\t): PrimerState<Pcis> {\n\t\t\tconst maxStrings = interaction.maxStrings\n\t\t\tconst minStrings = interaction.minStrings\n\t\t\tif (maxStrings === 1) {\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"interaction\",\n\t\t\t\t\tkind: \"extended-text\",\n\t\t\t\t\tcardinality: \"single\",\n\t\t\t\t\tstimulus,\n\t\t\t\t\tinteraction,\n\t\t\t\t\tsubmitText: function submitText(value: string) {\n\t\t\t\t\t\treturn execute(\n\t\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"extended-text\", values: [value] } },\n\t\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"extended-text\",\n\t\t\t\tcardinality: \"multiple\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tmaxStrings,\n\t\t\t\tminStrings,\n\t\t\t\tsubmitTexts: function submitTexts(values: string[]) {\n\t\t\t\t\tconst validationError = validateExtendedTextSubmission(values, minStrings, maxStrings)\n\t\t\t\t\tif (validationError) {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\terrored(validationError, \"interaction\", {\n\t\t\t\t\t\t\t\tkind: \"interaction\",\n\t\t\t\t\t\t\t\tsubmission: { type: \"extended-text\", values }\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"extended-text\", values } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\t// Safe cast: TS cannot verify mapped-union construction from generic Pcis.\n\t\t// The input `interaction: PciInteraction<Pcis>` guarantees pciId↔properties\n\t\t// correlation; destructuring loses TS tracking but runtime is correct.\n\t\tfunction pciInteractionState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: PciInteraction<Pcis>\n\t\t): PciInteractionState<Pcis> {\n\t\t\tconst { pciId, properties } = interaction\n\t\t\tfunction submit(value: PciValue<typeof pciId>): Promise<PrimerState<Pcis>> {\n\t\t\t\tlog?.debug(\"pci submit\", { pciId })\n\t\t\t\tconst submission = { type: \"portable-custom\" as const, pciId, value }\n\t\t\t\treturn execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t}\n\t\t\t// biome-ignore lint/plugin: TS cannot verify mapped-union construction from generic Pcis — pciId↔properties correlation preserved by input\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"portable-custom\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tpciId,\n\t\t\t\tproperties,\n\t\t\t\tsubmit,\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t} as PciInteractionState<Pcis>\n\t\t}\n\n\t\tfunction feedbackState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis>,\n\t\t\tsubmission: RendererSubmission<Pcis>,\n\t\t\tisCorrect: boolean,\n\t\t\tfeedbackContent: ContentInline[],\n\t\t\tcorrectAnswer: RendererCorrectAnswer | null\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"feedback\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tsubmission,\n\t\t\t\tisCorrect,\n\t\t\t\tfeedbackContent,\n\t\t\t\tcorrectAnswer,\n\t\t\t\tadvance: function advance() {\n\t\t\t\t\treturn execute({ kind: \"observation\" }, \"observation\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\treturn { execute }\n\t}\n\n\treturn {\n\t\tasync start(studentId: string): Promise<PrimerState<Pcis>> {\n\t\t\tlog?.debug(\"start\", { studentId })\n\t\t\tconst s = makeSession(studentId)\n\t\t\treturn s.execute({ kind: \"observation\" }, \"observation\")\n\t\t}\n\t}\n}\n\nexport { ADVANCE_PATH, DEFAULT_ORIGIN, create }\nexport type { Client, Config, PrimerLogger }\n"
|
|
6
|
+
"import * as errors from \"@superbuilders/errors\"\nimport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrForbidden,\n\tErrInvalidPublishableKey,\n\tErrJsonParse,\n\tErrMalformedPublishableKey,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrTimeout,\n\tErrUnsupportedPci,\n\tErrInvalidSubmission\n} from \"@superbuilders/primer-tives/errors\"\nimport type { PciId, PciValue } from \"@superbuilders/primer-tives/pci\"\nimport type {\n\tErroredState,\n\tPciInteraction,\n\tPciInteractionState,\n\tPrimerState,\n\tRendererChoice,\n\tRendererCorrectAnswer,\n\tRendererInteraction,\n\tRendererStimulus,\n\tRendererSubmission\n} from \"@superbuilders/primer-tives/types\"\nimport type { ContentInline } from \"@superbuilders/primer-tives/content\"\n\ninterface PrimerLogger {\n\tdebug(message: string, attributes?: Record<string, unknown>): void\n\tinfo(message: string, attributes?: Record<string, unknown>): void\n\twarn(message: string, attributes?: Record<string, unknown>): void\n\terror(message: string, attributes?: Record<string, unknown>): void\n}\n\ntype WireIntent<Pcis extends PciId = PciId> =\n\t| { kind: \"observation\" }\n\t| { kind: \"interaction\"; submission: RendererSubmission<Pcis> }\n\t| { kind: \"timeout\" }\n\ntype WireResult<Pcis extends PciId = PciId> =\n\t| {\n\t\t\toutcome: \"advanced\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis> | null\n\t }\n\t| {\n\t\t\toutcome: \"submitted\"\n\t\t\tstimulus: RendererStimulus | null\n\t\t\tinteraction: RendererInteraction<Pcis>\n\t\t\tsubmission: RendererSubmission<Pcis>\n\t\t\tisCorrect: boolean\n\t\t\tfeedbackContent: ContentInline[]\n\t\t\tcorrectAnswer: RendererCorrectAnswer | null\n\t }\n\t| { outcome: \"completed\" }\n\ninterface WireRequestBody<Pcis extends PciId = PciId> {\n\tstudentId: string\n\tsupportedPcis: readonly PciId[]\n\tintent: WireIntent<Pcis>\n}\n\ntype TransportResult<Pcis extends PciId = PciId> =\n\t| { ok: true; data: WireResult<Pcis> }\n\t| { ok: false; error: Error }\n\nconst DEFAULT_ORIGIN = \"https://sb-primer.vercel.app\"\nconst ADVANCE_PATH = \"/api/v0/advance\"\n\ninterface Config<Pcis extends PciId = PciId> {\n\treadonly publishableKey: string\n\treadonly supportedPcis: readonly Pcis[]\n\treadonly origin?: string\n\treadonly fetch?: typeof globalThis.fetch\n\treadonly abort?: AbortController\n\treadonly logger?: PrimerLogger\n}\n\ninterface Client<Pcis extends PciId = PciId> {\n\tstart(studentId: string): Promise<PrimerState<Pcis>>\n}\n\nfunction poisonToJSON(): never {\n\t// biome-ignore lint/plugin: intentional toJSON trap — logging here would spam on every accidental serialize attempt\n\tthrow ErrNotSerializable\n}\n\nfunction httpSentinel(status: number): Error {\n\tif (status === 400) {\n\t\treturn ErrBadRequest\n\t}\n\tif (status === 401) {\n\t\treturn ErrInvalidPublishableKey\n\t}\n\tif (status === 403) {\n\t\treturn ErrForbidden\n\t}\n\tif (status === 404) {\n\t\treturn ErrNotFound\n\t}\n\tif (status === 409) {\n\t\treturn ErrConflict\n\t}\n\tif (status === 422) {\n\t\treturn ErrUnsupportedPci\n\t}\n\tif (status === 429) {\n\t\treturn ErrRateLimited\n\t}\n\tif (status === 502 || status === 503 || status === 504) {\n\t\treturn ErrServiceUnavailable\n\t}\n\treturn ErrServerError\n}\n\nfunction isAbortError(err: unknown): boolean {\n\tif (err instanceof DOMException && err.name === \"AbortError\") {\n\t\treturn true\n\t}\n\tif (err instanceof DOMException && err.name === \"TimeoutError\") {\n\t\treturn true\n\t}\n\treturn false\n}\n\nconst PK_PREFIX = \"pk_\"\n\nfunction create<const Pcis extends PciId>(config: Config<Pcis>): Client<Pcis> {\n\tconst configFetch = config.fetch\n\tconst fetchFn = configFetch ? configFetch : globalThis.fetch\n\tconst log = config.logger\n\n\tif (!config.publishableKey.startsWith(PK_PREFIX)) {\n\t\tlog?.error(\"malformed publishable key\", { prefix: PK_PREFIX })\n\t\t// biome-ignore lint/plugin: client SDK — log is optional config.logger, not slog\n\t\tthrow errors.wrap(ErrMalformedPublishableKey, `key must start with '${PK_PREFIX}'`)\n\t}\n\n\tfunction transportSignal(): AbortSignal | undefined {\n\t\tif (config.abort) {\n\t\t\treturn config.abort.signal\n\t\t}\n\t\treturn undefined\n\t}\n\n\tasync function transport(body: WireRequestBody<Pcis>): Promise<TransportResult<Pcis>> {\n\t\tlog?.debug(\"transport request\", {\n\t\t\tstudentId: body.studentId,\n\t\t\tintentKind: body.intent.kind\n\t\t})\n\n\t\tconst url = config.origin ? `${config.origin}${ADVANCE_PATH}` : ADVANCE_PATH\n\t\tconst fetchResult = await fetchFn(url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-Primer-Publishable-Key\": config.publishableKey\n\t\t\t},\n\t\t\tbody: JSON.stringify(body),\n\t\t\tsignal: transportSignal()\n\t\t}).then(\n\t\t\tfunction ok(r: Response) {\n\t\t\t\treturn { ok: true, response: r } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!fetchResult.ok) {\n\t\t\tif (isAbortError(fetchResult.error)) {\n\t\t\t\tlog?.error(\"transport timeout\", {\n\t\t\t\t\tstudentId: body.studentId,\n\t\t\t\t\tintentKind: body.intent.kind\n\t\t\t\t})\n\t\t\t\treturn { ok: false, error: errors.wrap(ErrTimeout, fetchResult.error.message) }\n\t\t\t}\n\t\t\tlog?.error(\"transport network error\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\terror: fetchResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrNetwork, fetchResult.error.message) }\n\t\t}\n\n\t\tconst res = fetchResult.response\n\n\t\tif (!res.ok) {\n\t\t\tconst text = await res.text().catch(function fallback() {\n\t\t\t\treturn \"\"\n\t\t\t})\n\t\t\tconst sentinel = httpSentinel(res.status)\n\t\t\tlog?.error(\"transport http error\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(sentinel, text) }\n\t\t}\n\n\t\tconst jsonResult = await res.json().then(\n\t\t\tfunction ok(data: WireResult<Pcis>) {\n\t\t\t\treturn { ok: true, data } as const\n\t\t\t},\n\t\t\tfunction fail(err: Error) {\n\t\t\t\treturn { ok: false, error: err } as const\n\t\t\t}\n\t\t)\n\n\t\tif (!jsonResult.ok) {\n\t\t\tlog?.error(\"transport json parse failed\", {\n\t\t\t\tstudentId: body.studentId,\n\t\t\t\terror: jsonResult.error\n\t\t\t})\n\t\t\treturn { ok: false, error: errors.wrap(ErrJsonParse, jsonResult.error.message) }\n\t\t}\n\n\t\tlog?.debug(\"transport success\", {\n\t\t\tstudentId: body.studentId,\n\t\t\tintentKind: body.intent.kind\n\t\t})\n\n\t\treturn { ok: true, data: jsonResult.data }\n\t}\n\n\tfunction makeSession(studentId: string) {\n\t\tfunction resolve(result: WireResult<Pcis>): PrimerState<Pcis> {\n\t\t\tswitch (result.outcome) {\n\t\t\t\tcase \"advanced\":\n\t\t\t\t\treturn fromAdvanced(result.stimulus, result.interaction)\n\t\t\t\tcase \"submitted\":\n\t\t\t\t\treturn feedbackState(\n\t\t\t\t\t\tresult.stimulus,\n\t\t\t\t\t\tresult.interaction,\n\t\t\t\t\t\tresult.submission,\n\t\t\t\t\t\tresult.isCorrect,\n\t\t\t\t\t\tresult.feedbackContent,\n\t\t\t\t\t\tresult.correctAnswer\n\t\t\t\t\t)\n\t\t\t\tcase \"completed\":\n\t\t\t\t\treturn { phase: \"completed\", toJSON: poisonToJSON }\n\t\t\t}\n\t\t}\n\n\t\tfunction errored(\n\t\t\terror: Error,\n\t\t\tfailedPhase: \"observation\" | \"interaction\" | \"timeout\",\n\t\t\tintent: WireIntent<Pcis>\n\t\t): ErroredState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"errored\",\n\t\t\t\terror,\n\t\t\t\tfailedPhase,\n\t\t\t\tretry: function retry() {\n\t\t\t\t\tlog?.debug(\"retrying from errored state\", { failedPhase })\n\t\t\t\t\treturn execute(intent, failedPhase)\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tasync function execute(\n\t\t\tintent: WireIntent<Pcis>,\n\t\t\tphase: \"observation\" | \"interaction\" | \"timeout\"\n\t\t): Promise<PrimerState<Pcis>> {\n\t\t\tconst body: WireRequestBody<Pcis> = {\n\t\t\t\tstudentId,\n\t\t\t\tsupportedPcis: config.supportedPcis,\n\t\t\t\tintent\n\t\t\t}\n\n\t\t\tconst result = await transport(body)\n\t\t\tif (!result.ok) {\n\t\t\t\treturn errored(result.error, phase, intent)\n\t\t\t}\n\n\t\t\treturn resolve(result.data)\n\t\t}\n\n\t\tfunction isPciSupported(pciId: string): boolean {\n\t\t\tfor (const id of config.supportedPcis) {\n\t\t\t\tif (id === pciId) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\tfunction fromAdvanced(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis> | null\n\t\t): PrimerState<Pcis> {\n\t\t\tif (interaction === null) {\n\t\t\t\treturn observationState(stimulus)\n\t\t\t}\n\t\t\tif (interaction.type === \"portable-custom\") {\n\t\t\t\tif (!isPciSupported(interaction.pciId)) {\n\t\t\t\t\tlog?.error(\"unsupported pci in frame\", { pciId: interaction.pciId })\n\t\t\t\t\treturn {\n\t\t\t\t\t\tphase: \"fatal\",\n\t\t\t\t\t\terror: errors.wrap(ErrUnsupportedPci, `pci '${interaction.pciId}'`),\n\t\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pendingInteractionState(stimulus, interaction)\n\t\t}\n\n\t\tfunction observationState(stimulus: RendererStimulus | null): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"observation\",\n\t\t\t\tstimulus,\n\t\t\t\tadvance: function advance() {\n\t\t\t\t\treturn execute({ kind: \"observation\" }, \"observation\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction pendingInteractionState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis>\n\t\t): PrimerState<Pcis> {\n\t\t\tswitch (interaction.type) {\n\t\t\t\tcase \"choice\":\n\t\t\t\t\treturn choiceState(\n\t\t\t\t\t\tstimulus,\n\t\t\t\t\t\tinteraction,\n\t\t\t\t\t\tinteraction.options,\n\t\t\t\t\t\tinteraction.maxChoices,\n\t\t\t\t\t\tinteraction.minChoices\n\t\t\t\t\t)\n\t\t\t\tcase \"text-entry\":\n\t\t\t\t\treturn textEntryState(stimulus, interaction)\n\t\t\t\tcase \"extended-text\":\n\t\t\t\t\treturn extendedTextState(stimulus, interaction)\n\t\t\t\tcase \"portable-custom\":\n\t\t\t\t\treturn pciInteractionState(stimulus, interaction)\n\t\t\t}\n\t\t}\n\n\t\tfunction findUnknownKey(selectedKeys: string[], options: RendererChoice[]): string | null {\n\t\t\tconst optionIds = new Set(\n\t\t\t\toptions.map(function getId(o) {\n\t\t\t\t\treturn o.identifier\n\t\t\t\t})\n\t\t\t)\n\t\t\tfor (const key of selectedKeys) {\n\t\t\t\tif (!optionIds.has(key)) {\n\t\t\t\t\treturn key\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction validateChoiceSubmission(\n\t\t\tselectedKeys: string[],\n\t\t\toptions: RendererChoice[],\n\t\t\tmaxChoices: number,\n\t\t\tminChoices: number\n\t\t): Error | null {\n\t\t\tif (selectedKeys.length < minChoices) {\n\t\t\t\tlog?.error(\"choice submit below minChoices\", { selectedKeys, minChoices })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minChoices} selections`)\n\t\t\t}\n\t\t\tif (selectedKeys.length > maxChoices) {\n\t\t\t\tlog?.error(\"choice submit above maxChoices\", { selectedKeys, maxChoices })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxChoices} selections`)\n\t\t\t}\n\t\t\tconst uniqueKeys = new Set(selectedKeys)\n\t\t\tif (uniqueKeys.size !== selectedKeys.length) {\n\t\t\t\tlog?.error(\"choice submit has duplicates\", { selectedKeys })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, \"duplicate selections\")\n\t\t\t}\n\t\t\tconst unknownKey = findUnknownKey(selectedKeys, options)\n\t\t\tif (unknownKey) {\n\t\t\t\tlog?.error(\"choice submit has unknown key\", { key: unknownKey })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `unknown option '${unknownKey}'`)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction choiceState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"choice\" }>,\n\t\t\toptions: RendererChoice[],\n\t\t\tmaxChoices: number,\n\t\t\tminChoices: number\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"choice\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\toptions,\n\t\t\t\tmaxChoices,\n\t\t\t\tminChoices,\n\t\t\t\tsubmitChoice: function submitChoice(selectedKeys: string[]) {\n\t\t\t\t\tconst validationError = validateChoiceSubmission(\n\t\t\t\t\t\tselectedKeys,\n\t\t\t\t\t\toptions,\n\t\t\t\t\t\tmaxChoices,\n\t\t\t\t\t\tminChoices\n\t\t\t\t\t)\n\t\t\t\t\tif (validationError) {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\terrored(validationError, \"interaction\", {\n\t\t\t\t\t\t\t\tkind: \"interaction\",\n\t\t\t\t\t\t\t\tsubmission: { type: \"choice\", selectedKeys }\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"choice\", selectedKeys } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttimeout: function timeout() {\n\t\t\t\t\treturn execute({ kind: \"timeout\" }, \"timeout\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction textEntryState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: Extract<RendererInteraction<Pcis>, { type: \"text-entry\" }>\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"text-entry\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tsubmitText: function submitText(value: string) {\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"text-entry\", value } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttimeout: function timeout() {\n\t\t\t\t\treturn execute({ kind: \"timeout\" }, \"timeout\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\tfunction validateExtendedTextSubmission(\n\t\t\tvalues: string[],\n\t\t\tminStrings: number,\n\t\t\tmaxStrings: number\n\t\t): Error | null {\n\t\t\tif (values.length < minStrings) {\n\t\t\t\tlog?.error(\"extended-text submit below minStrings\", { count: values.length, minStrings })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `need at least ${minStrings} values`)\n\t\t\t}\n\t\t\tif (values.length > maxStrings) {\n\t\t\t\tlog?.error(\"extended-text submit above maxStrings\", { count: values.length, maxStrings })\n\t\t\t\treturn errors.wrap(ErrInvalidSubmission, `at most ${maxStrings} values`)\n\t\t\t}\n\t\t\treturn null\n\t\t}\n\n\t\tfunction extendedTextState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis> & { type: \"extended-text\" }\n\t\t): PrimerState<Pcis> {\n\t\t\tconst maxStrings = interaction.maxStrings\n\t\t\tconst minStrings = interaction.minStrings\n\t\t\tif (maxStrings === 1) {\n\t\t\t\treturn {\n\t\t\t\t\tphase: \"interaction\",\n\t\t\t\t\tkind: \"extended-text\",\n\t\t\t\t\tcardinality: \"single\",\n\t\t\t\t\tstimulus,\n\t\t\t\t\tinteraction,\n\t\t\t\t\tsubmitText: function submitText(value: string) {\n\t\t\t\t\t\treturn execute(\n\t\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"extended-text\", values: [value] } },\n\t\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\ttimeout: function timeout() {\n\t\t\t\t\t\treturn execute({ kind: \"timeout\" }, \"timeout\")\n\t\t\t\t\t},\n\t\t\t\t\ttoJSON: poisonToJSON\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"extended-text\",\n\t\t\t\tcardinality: \"multiple\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tmaxStrings,\n\t\t\t\tminStrings,\n\t\t\t\tsubmitTexts: function submitTexts(values: string[]) {\n\t\t\t\t\tconst validationError = validateExtendedTextSubmission(values, minStrings, maxStrings)\n\t\t\t\t\tif (validationError) {\n\t\t\t\t\t\treturn Promise.resolve(\n\t\t\t\t\t\t\terrored(validationError, \"interaction\", {\n\t\t\t\t\t\t\t\tkind: \"interaction\",\n\t\t\t\t\t\t\t\tsubmission: { type: \"extended-text\", values }\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn execute(\n\t\t\t\t\t\t{ kind: \"interaction\", submission: { type: \"extended-text\", values } },\n\t\t\t\t\t\t\"interaction\"\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\ttimeout: function timeout() {\n\t\t\t\t\treturn execute({ kind: \"timeout\" }, \"timeout\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\t// Safe cast: TS cannot verify mapped-union construction from generic Pcis.\n\t\t// The input `interaction: PciInteraction<Pcis>` guarantees pciId↔properties\n\t\t// correlation; destructuring loses TS tracking but runtime is correct.\n\t\tfunction pciInteractionState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: PciInteraction<Pcis>\n\t\t): PciInteractionState<Pcis> {\n\t\t\tconst { pciId, properties } = interaction\n\t\t\tfunction submit(value: PciValue<typeof pciId>): Promise<PrimerState<Pcis>> {\n\t\t\t\tlog?.debug(\"pci submit\", { pciId })\n\t\t\t\tconst submission = { type: \"portable-custom\" as const, pciId, value }\n\t\t\t\treturn execute({ kind: \"interaction\", submission }, \"interaction\")\n\t\t\t}\n\t\t\tfunction timeout(): Promise<PrimerState<Pcis>> {\n\t\t\t\tlog?.debug(\"pci timeout\", { pciId })\n\t\t\t\treturn execute({ kind: \"timeout\" }, \"timeout\")\n\t\t\t}\n\t\t\t// biome-ignore lint/plugin: TS cannot verify mapped-union construction from generic Pcis — pciId↔properties correlation preserved by input\n\t\t\treturn {\n\t\t\t\tphase: \"interaction\",\n\t\t\t\tkind: \"portable-custom\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tpciId,\n\t\t\t\tproperties,\n\t\t\t\tsubmit,\n\t\t\t\ttimeout,\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t} as PciInteractionState<Pcis>\n\t\t}\n\n\t\tfunction feedbackState(\n\t\t\tstimulus: RendererStimulus | null,\n\t\t\tinteraction: RendererInteraction<Pcis>,\n\t\t\tsubmission: RendererSubmission<Pcis>,\n\t\t\tisCorrect: boolean,\n\t\t\tfeedbackContent: ContentInline[],\n\t\t\tcorrectAnswer: RendererCorrectAnswer | null\n\t\t): PrimerState<Pcis> {\n\t\t\treturn {\n\t\t\t\tphase: \"feedback\",\n\t\t\t\tstimulus,\n\t\t\t\tinteraction,\n\t\t\t\tsubmission,\n\t\t\t\tisCorrect,\n\t\t\t\tfeedbackContent,\n\t\t\t\tcorrectAnswer,\n\t\t\t\tadvance: function advance() {\n\t\t\t\t\treturn execute({ kind: \"observation\" }, \"observation\")\n\t\t\t\t},\n\t\t\t\ttoJSON: poisonToJSON\n\t\t\t}\n\t\t}\n\n\t\treturn { execute }\n\t}\n\n\treturn {\n\t\tasync start(studentId: string): Promise<PrimerState<Pcis>> {\n\t\t\tlog?.debug(\"start\", { studentId })\n\t\t\tconst s = makeSession(studentId)\n\t\t\treturn s.execute({ kind: \"observation\" }, \"observation\")\n\t\t}\n\t}\n}\n\nexport { ADVANCE_PATH, DEFAULT_ORIGIN, create }\nexport type { Client, Config, PrimerLogger }\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";AAAA;AAEA,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,YAAY;AAC5C,IAAM,oBAA2B,WAAI,iBAAiB;AACtD,IAAM,2BAAkC,WAAI,yBAAyB;AACrE,IAAM,gBAAuB,WAAI,aAAa;AAC9C,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,WAAW;AAC3C,IAAM,cAAqB,WAAI,WAAW;AAC1C,IAAM,cAAqB,WAAI,UAAU;AACzC,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,wBAA+B,WAAI,qBAAqB;AAC9D,IAAM,qBAA4B,WACjC,0EACD;AACA,IAAM,uBAA8B,WAAI,oBAAoB;AAC5D,IAAM,6BAAoC,WAAI,2BAA2B;;AClBzE;
|
|
9
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "85D227CDC0814FAC64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -110,6 +110,7 @@ interface ChoiceState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
|
110
110
|
readonly maxChoices: number;
|
|
111
111
|
readonly minChoices: number;
|
|
112
112
|
submitChoice(selectedKeys: string[]): Promise<PrimerState<Pcis>>;
|
|
113
|
+
timeout(): Promise<PrimerState<Pcis>>;
|
|
113
114
|
}
|
|
114
115
|
interface TextEntryState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
115
116
|
readonly phase: "interaction";
|
|
@@ -119,6 +120,7 @@ interface TextEntryState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
|
119
120
|
type: "text-entry";
|
|
120
121
|
}>;
|
|
121
122
|
submitText(value: string): Promise<PrimerState<Pcis>>;
|
|
123
|
+
timeout(): Promise<PrimerState<Pcis>>;
|
|
122
124
|
}
|
|
123
125
|
interface ExtendedTextSingleState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
124
126
|
readonly phase: "interaction";
|
|
@@ -129,6 +131,7 @@ interface ExtendedTextSingleState<Pcis extends PciId = PciId> extends NonSeriali
|
|
|
129
131
|
type: "extended-text";
|
|
130
132
|
}>;
|
|
131
133
|
submitText(value: string): Promise<PrimerState<Pcis>>;
|
|
134
|
+
timeout(): Promise<PrimerState<Pcis>>;
|
|
132
135
|
}
|
|
133
136
|
interface ExtendedTextMultipleState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
134
137
|
readonly phase: "interaction";
|
|
@@ -141,6 +144,7 @@ interface ExtendedTextMultipleState<Pcis extends PciId = PciId> extends NonSeria
|
|
|
141
144
|
readonly maxStrings: number;
|
|
142
145
|
readonly minStrings: number;
|
|
143
146
|
submitTexts(values: string[]): Promise<PrimerState<Pcis>>;
|
|
147
|
+
timeout(): Promise<PrimerState<Pcis>>;
|
|
144
148
|
}
|
|
145
149
|
type ExtendedTextState<Pcis extends PciId = PciId> = ExtendedTextSingleState<Pcis> | ExtendedTextMultipleState<Pcis>;
|
|
146
150
|
type PciInteractionState<Pcis extends PciId = PciId> = {
|
|
@@ -152,6 +156,7 @@ type PciInteractionState<Pcis extends PciId = PciId> = {
|
|
|
152
156
|
readonly pciId: K;
|
|
153
157
|
readonly properties: PciProps<K>;
|
|
154
158
|
submit(value: PciValue<K>): Promise<PrimerState<Pcis>>;
|
|
159
|
+
timeout(): Promise<PrimerState<Pcis>>;
|
|
155
160
|
};
|
|
156
161
|
}[Pcis];
|
|
157
162
|
type InteractionState<Pcis extends PciId = PciId> = ChoiceState<Pcis> | TextEntryState<Pcis> | ExtendedTextState<Pcis> | PciInteractionState<Pcis>;
|
|
@@ -171,7 +176,7 @@ interface CompletedState extends NonSerializable {
|
|
|
171
176
|
interface ErroredState<Pcis extends PciId = PciId> extends NonSerializable {
|
|
172
177
|
readonly phase: "errored";
|
|
173
178
|
readonly error: Error;
|
|
174
|
-
readonly failedPhase: "observation" | "interaction";
|
|
179
|
+
readonly failedPhase: "observation" | "interaction" | "timeout";
|
|
175
180
|
retry(): Promise<PrimerState<Pcis>>;
|
|
176
181
|
}
|
|
177
182
|
interface FatalState extends NonSerializable {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|