@superbuilders/primer-tives 0.9.0 → 1.1.0

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.
Files changed (41) hide show
  1. package/README.md +298 -63
  2. package/dist/client/choice-state.d.ts.map +1 -1
  3. package/dist/client/extended-text-state.d.ts.map +1 -1
  4. package/dist/client/index.d.ts.map +1 -1
  5. package/dist/client/index.js +338 -179
  6. package/dist/client/index.js.map +13 -11
  7. package/dist/client/match-state.d.ts.map +1 -1
  8. package/dist/client/order-state.d.ts.map +1 -1
  9. package/dist/client/session.d.ts.map +1 -1
  10. package/dist/client/text-entry-state.d.ts.map +1 -1
  11. package/dist/client/transport.d.ts +1 -1
  12. package/dist/client/transport.d.ts.map +1 -1
  13. package/dist/client/types.d.ts +2 -115
  14. package/dist/client/types.d.ts.map +1 -1
  15. package/dist/contracts/index.d.ts +4 -0
  16. package/dist/contracts/index.d.ts.map +1 -0
  17. package/dist/contracts/index.js +305 -0
  18. package/dist/contracts/index.js.map +11 -0
  19. package/dist/contracts/pci-schemas.d.ts +25 -0
  20. package/dist/contracts/pci-schemas.d.ts.map +1 -0
  21. package/dist/contracts/types.d.ts +118 -0
  22. package/dist/contracts/types.d.ts.map +1 -0
  23. package/dist/contracts/validation.d.ts +132 -0
  24. package/dist/contracts/validation.d.ts.map +1 -0
  25. package/dist/errors.d.ts +2 -1
  26. package/dist/errors.d.ts.map +1 -1
  27. package/dist/errors.js +48 -0
  28. package/dist/errors.js.map +10 -0
  29. package/dist/server/create-server.d.ts +21 -19
  30. package/dist/server/create-server.d.ts.map +1 -1
  31. package/dist/server/exchange.d.ts +10 -5
  32. package/dist/server/exchange.d.ts.map +1 -1
  33. package/dist/server/hints.d.ts +25 -0
  34. package/dist/server/hints.d.ts.map +1 -0
  35. package/dist/server/index.d.ts +4 -3
  36. package/dist/server/index.d.ts.map +1 -1
  37. package/dist/server/index.js +355 -83
  38. package/dist/server/index.js.map +9 -8
  39. package/dist/server/students.d.ts +3 -5
  40. package/dist/server/students.d.ts.map +1 -1
  41. package/package.json +17 -4
@@ -0,0 +1,132 @@
1
+ import { z } from "zod";
2
+ import type { MatchPair, PciInteraction, RendererInteraction, RendererSubmission } from "./types";
3
+ import type { PciId } from "../client/pci";
4
+ declare const MatchPairSchema: z.ZodObject<{
5
+ source: z.ZodString;
6
+ target: z.ZodString;
7
+ }, z.core.$strip>;
8
+ declare const ChoiceSubmissionSchema: z.ZodObject<{
9
+ type: z.ZodLiteral<"choice">;
10
+ selectedKeys: z.ZodArray<z.ZodString>;
11
+ }, z.core.$strip>;
12
+ declare const TextEntrySubmissionSchema: z.ZodObject<{
13
+ type: z.ZodLiteral<"text-entry">;
14
+ value: z.ZodString;
15
+ }, z.core.$strip>;
16
+ declare const ExtendedTextSubmissionSchema: z.ZodObject<{
17
+ type: z.ZodLiteral<"extended-text">;
18
+ values: z.ZodArray<z.ZodString>;
19
+ }, z.core.$strip>;
20
+ declare const OrderSubmissionSchema: z.ZodObject<{
21
+ type: z.ZodLiteral<"order">;
22
+ orderedKeys: z.ZodArray<z.ZodString>;
23
+ }, z.core.$strip>;
24
+ declare const MatchSubmissionSchema: z.ZodObject<{
25
+ type: z.ZodLiteral<"match">;
26
+ pairs: z.ZodArray<z.ZodObject<{
27
+ source: z.ZodString;
28
+ target: z.ZodString;
29
+ }, z.core.$strip>>;
30
+ }, z.core.$strip>;
31
+ declare const DivisionRemainderPciSubmissionSchema: z.ZodObject<{
32
+ type: z.ZodLiteral<"portable-custom">;
33
+ pciId: z.ZodLiteral<"urn:primer:pci:division-remainder">;
34
+ value: z.ZodObject<{
35
+ quotient: z.ZodString;
36
+ remainder: z.ZodString;
37
+ }, z.core.$strip>;
38
+ }, z.core.$strip>;
39
+ declare const FractionAdditionPciSubmissionSchema: z.ZodObject<{
40
+ type: z.ZodLiteral<"portable-custom">;
41
+ pciId: z.ZodLiteral<"urn:primer:pci:fraction-addition">;
42
+ value: z.ZodObject<{
43
+ numerator: z.ZodString;
44
+ denominator: z.ZodString;
45
+ }, z.core.$strip>;
46
+ }, z.core.$strip>;
47
+ declare const RendererSubmissionSchema: z.ZodUnion<readonly [z.ZodObject<{
48
+ type: z.ZodLiteral<"choice">;
49
+ selectedKeys: z.ZodArray<z.ZodString>;
50
+ }, z.core.$strip>, z.ZodObject<{
51
+ type: z.ZodLiteral<"text-entry">;
52
+ value: z.ZodString;
53
+ }, z.core.$strip>, z.ZodObject<{
54
+ type: z.ZodLiteral<"extended-text">;
55
+ values: z.ZodArray<z.ZodString>;
56
+ }, z.core.$strip>, z.ZodObject<{
57
+ type: z.ZodLiteral<"order">;
58
+ orderedKeys: z.ZodArray<z.ZodString>;
59
+ }, z.core.$strip>, z.ZodObject<{
60
+ type: z.ZodLiteral<"match">;
61
+ pairs: z.ZodArray<z.ZodObject<{
62
+ source: z.ZodString;
63
+ target: z.ZodString;
64
+ }, z.core.$strip>>;
65
+ }, z.core.$strip>, z.ZodObject<{
66
+ type: z.ZodLiteral<"portable-custom">;
67
+ pciId: z.ZodLiteral<"urn:primer:pci:division-remainder">;
68
+ value: z.ZodObject<{
69
+ quotient: z.ZodString;
70
+ remainder: z.ZodString;
71
+ }, z.core.$strip>;
72
+ }, z.core.$strip>, z.ZodObject<{
73
+ type: z.ZodLiteral<"portable-custom">;
74
+ pciId: z.ZodLiteral<"urn:primer:pci:fraction-addition">;
75
+ value: z.ZodObject<{
76
+ numerator: z.ZodString;
77
+ denominator: z.ZodString;
78
+ }, z.core.$strip>;
79
+ }, z.core.$strip>]>;
80
+ declare const validatedSubmissionBrand: unique symbol;
81
+ type RendererSubmissionFor<I extends RendererInteraction = RendererInteraction> = I extends {
82
+ type: "choice";
83
+ } ? {
84
+ type: "choice";
85
+ selectedKeys: string[];
86
+ } : I extends {
87
+ type: "text-entry";
88
+ } ? {
89
+ type: "text-entry";
90
+ value: string;
91
+ } : I extends {
92
+ type: "extended-text";
93
+ } ? {
94
+ type: "extended-text";
95
+ values: string[];
96
+ } : I extends {
97
+ type: "order";
98
+ } ? {
99
+ type: "order";
100
+ orderedKeys: string[];
101
+ } : I extends {
102
+ type: "match";
103
+ } ? {
104
+ type: "match";
105
+ pairs: MatchPair[];
106
+ } : I extends PciInteraction<infer SupportedPcis extends PciId> ? {
107
+ [K in SupportedPcis]: {
108
+ type: "portable-custom";
109
+ pciId: K;
110
+ value: Extract<RendererSubmission, {
111
+ type: "portable-custom";
112
+ pciId: K;
113
+ }>["value"];
114
+ };
115
+ }[SupportedPcis] : never;
116
+ type ValidatedRendererSubmission<I extends RendererInteraction = RendererInteraction> = RendererSubmissionFor<I> & {
117
+ readonly [validatedSubmissionBrand]: true;
118
+ };
119
+ type SubmissionValidationSuccess<I extends RendererInteraction = RendererInteraction> = {
120
+ ok: true;
121
+ value: ValidatedRendererSubmission<I>;
122
+ };
123
+ type SubmissionValidationFailure = {
124
+ ok: false;
125
+ issues: string[];
126
+ };
127
+ type SubmissionValidationResult<I extends RendererInteraction = RendererInteraction> = SubmissionValidationSuccess<I> | SubmissionValidationFailure;
128
+ declare function validateSubmissionForInteraction<I extends RendererInteraction>(interaction: I, submission: RendererSubmission): SubmissionValidationResult<I>;
129
+ declare function submissionValidationMessage(result: SubmissionValidationFailure): string;
130
+ export { ChoiceSubmissionSchema, DivisionRemainderPciSubmissionSchema, ExtendedTextSubmissionSchema, FractionAdditionPciSubmissionSchema, MatchPairSchema, MatchSubmissionSchema, OrderSubmissionSchema, RendererSubmissionSchema, TextEntrySubmissionSchema, submissionValidationMessage, validateSubmissionForInteraction };
131
+ export type { RendererSubmissionFor, SubmissionValidationFailure, SubmissionValidationResult, SubmissionValidationSuccess, ValidatedRendererSubmission };
132
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/contracts/validation.ts"],"names":[],"mappings":"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"}
package/dist/errors.d.ts CHANGED
@@ -10,6 +10,7 @@ declare const ErrTimeout: Error;
10
10
  declare const ErrForbidden: Error;
11
11
  declare const ErrNotFound: Error;
12
12
  declare const ErrConflict: Error;
13
+ declare const ErrExternalAuthorityRequired: Error;
13
14
  declare const ErrRateLimited: Error;
14
15
  declare const ErrServiceUnavailable: Error;
15
16
  declare const ErrNotSerializable: Error;
@@ -18,5 +19,5 @@ declare const ErrInvalidSecretKey: Error;
18
19
  declare const ErrStudentNotFound: Error;
19
20
  declare const ErrUnsupportedGrade: Error;
20
21
  declare const ErrTimebackUnavailable: Error;
21
- export { ErrBadRequest, ErrConflict, ErrForbidden, ErrInvalidAccessToken, ErrInvalidSecretKey, ErrInvalidSubmission, ErrJsonParse, ErrMalformedAccessToken, ErrNetwork, ErrNotFound, ErrNotSerializable, ErrRateLimited, ErrServerError, ErrServiceUnavailable, ErrStudentNotFound, ErrTimebackUnavailable, ErrTimeout, ErrTokenExpired, ErrUnsupportedGrade, ErrUnsupportedPci };
22
+ export { ErrBadRequest, ErrConflict, ErrExternalAuthorityRequired, ErrForbidden, ErrInvalidAccessToken, ErrInvalidSecretKey, ErrInvalidSubmission, ErrJsonParse, ErrMalformedAccessToken, ErrNetwork, ErrNotFound, ErrNotSerializable, ErrRateLimited, ErrServerError, ErrServiceUnavailable, ErrStudentNotFound, ErrTimebackUnavailable, ErrTimeout, ErrTokenExpired, ErrUnsupportedGrade, ErrUnsupportedPci };
22
23
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA2B,CAAA;AAC7C,QAAA,MAAM,iBAAiB,OAAgC,CAAA;AACvD,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAChE,QAAA,MAAM,uBAAuB,OAAuC,CAAA;AACpE,QAAA,MAAM,eAAe,OAAqC,CAAA;AAC1D,QAAA,MAAM,aAAa,OAA4B,CAAA;AAC/C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA0B,CAAA;AAC5C,QAAA,MAAM,WAAW,OAA0B,CAAA;AAC3C,QAAA,MAAM,WAAW,OAAyB,CAAA;AAC1C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,qBAAqB,OAAoC,CAAA;AAC/D,QAAA,MAAM,kBAAkB,OAEvB,CAAA;AACD,QAAA,MAAM,oBAAoB,OAAmC,CAAA;AAE7D,QAAA,MAAM,mBAAmB,OAAmC,CAAA;AAC5D,QAAA,MAAM,kBAAkB,OAAkC,CAAA;AAC1D,QAAA,MAAM,mBAAmB,OAAkC,CAAA;AAC3D,QAAA,MAAM,sBAAsB,OAAqC,CAAA;AAEjE,OAAO,EACN,aAAa,EACb,WAAW,EACX,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,CAAA"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA2B,CAAA;AAC7C,QAAA,MAAM,iBAAiB,OAAgC,CAAA;AACvD,QAAA,MAAM,qBAAqB,OAAqC,CAAA;AAChE,QAAA,MAAM,uBAAuB,OAAuC,CAAA;AACpE,QAAA,MAAM,eAAe,OAAqC,CAAA;AAC1D,QAAA,MAAM,aAAa,OAA4B,CAAA;AAC/C,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,UAAU,OAAwB,CAAA;AACxC,QAAA,MAAM,YAAY,OAA0B,CAAA;AAC5C,QAAA,MAAM,WAAW,OAA0B,CAAA;AAC3C,QAAA,MAAM,WAAW,OAAyB,CAAA;AAC1C,QAAA,MAAM,4BAA4B,OAA4C,CAAA;AAC9E,QAAA,MAAM,cAAc,OAA6B,CAAA;AACjD,QAAA,MAAM,qBAAqB,OAAoC,CAAA;AAC/D,QAAA,MAAM,kBAAkB,OAEvB,CAAA;AACD,QAAA,MAAM,oBAAoB,OAAmC,CAAA;AAE7D,QAAA,MAAM,mBAAmB,OAAmC,CAAA;AAC5D,QAAA,MAAM,kBAAkB,OAAkC,CAAA;AAC1D,QAAA,MAAM,mBAAmB,OAAkC,CAAA;AAC3D,QAAA,MAAM,sBAAsB,OAAqC,CAAA;AAEjE,OAAO,EACN,aAAa,EACb,WAAW,EACX,4BAA4B,EAC5B,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,EACZ,uBAAuB,EACvB,UAAU,EACV,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,CAAA"}
package/dist/errors.js ADDED
@@ -0,0 +1,48 @@
1
+ // src/errors.ts
2
+ import * as errors from "@superbuilders/errors";
3
+ var ErrNetwork = errors.new("network");
4
+ var ErrJsonParse = errors.new("json parse");
5
+ var ErrUnsupportedPci = errors.new("unsupported pci");
6
+ var ErrInvalidAccessToken = errors.new("invalid access token");
7
+ var ErrMalformedAccessToken = errors.new("malformed access token");
8
+ var ErrTokenExpired = errors.new("access token expired");
9
+ var ErrBadRequest = errors.new("bad request");
10
+ var ErrServerError = errors.new("server error");
11
+ var ErrTimeout = errors.new("timeout");
12
+ var ErrForbidden = errors.new("forbidden");
13
+ var ErrNotFound = errors.new("not found");
14
+ var ErrConflict = errors.new("conflict");
15
+ var ErrExternalAuthorityRequired = errors.new("external authority required");
16
+ var ErrRateLimited = errors.new("rate limited");
17
+ var ErrServiceUnavailable = errors.new("service unavailable");
18
+ var ErrNotSerializable = errors.new("PrimerState is live in-memory state and must not be serialized or stored");
19
+ var ErrInvalidSubmission = errors.new("invalid submission");
20
+ var ErrInvalidSecretKey = errors.new("invalid secret key");
21
+ var ErrStudentNotFound = errors.new("student not found");
22
+ var ErrUnsupportedGrade = errors.new("unsupported grade");
23
+ var ErrTimebackUnavailable = errors.new("timeback unavailable");
24
+ export {
25
+ ErrUnsupportedPci,
26
+ ErrUnsupportedGrade,
27
+ ErrTokenExpired,
28
+ ErrTimeout,
29
+ ErrTimebackUnavailable,
30
+ ErrStudentNotFound,
31
+ ErrServiceUnavailable,
32
+ ErrServerError,
33
+ ErrRateLimited,
34
+ ErrNotSerializable,
35
+ ErrNotFound,
36
+ ErrNetwork,
37
+ ErrMalformedAccessToken,
38
+ ErrJsonParse,
39
+ ErrInvalidSubmission,
40
+ ErrInvalidSecretKey,
41
+ ErrInvalidAccessToken,
42
+ ErrForbidden,
43
+ ErrExternalAuthorityRequired,
44
+ ErrConflict,
45
+ ErrBadRequest
46
+ };
47
+
48
+ //# debugId=4F60AD86845EC38864756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/errors.ts"],
4
+ "sourcesContent": [
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 ErrInvalidAccessToken = errors.new(\"invalid access token\")\nconst ErrMalformedAccessToken = errors.new(\"malformed access token\")\nconst ErrTokenExpired = errors.new(\"access token expired\")\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 ErrExternalAuthorityRequired = errors.new(\"external authority required\")\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\")\n\nconst ErrInvalidSecretKey = errors.new(\"invalid secret key\")\nconst ErrStudentNotFound = errors.new(\"student not found\")\nconst ErrUnsupportedGrade = errors.new(\"unsupported grade\")\nconst ErrTimebackUnavailable = errors.new(\"timeback unavailable\")\n\nexport {\n\tErrBadRequest,\n\tErrConflict,\n\tErrExternalAuthorityRequired,\n\tErrForbidden,\n\tErrInvalidAccessToken,\n\tErrInvalidSecretKey,\n\tErrInvalidSubmission,\n\tErrJsonParse,\n\tErrMalformedAccessToken,\n\tErrNetwork,\n\tErrNotFound,\n\tErrNotSerializable,\n\tErrRateLimited,\n\tErrServerError,\n\tErrServiceUnavailable,\n\tErrStudentNotFound,\n\tErrTimebackUnavailable,\n\tErrTimeout,\n\tErrTokenExpired,\n\tErrUnsupportedGrade,\n\tErrUnsupportedPci\n}\n"
6
+ ],
7
+ "mappings": ";AAAA;AAEA,IAAM,aAAoB,WAAI,SAAS;AACvC,IAAM,eAAsB,WAAI,YAAY;AAC5C,IAAM,oBAA2B,WAAI,iBAAiB;AACtD,IAAM,wBAA+B,WAAI,sBAAsB;AAC/D,IAAM,0BAAiC,WAAI,wBAAwB;AACnE,IAAM,kBAAyB,WAAI,sBAAsB;AACzD,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,+BAAsC,WAAI,6BAA6B;AAC7E,IAAM,iBAAwB,WAAI,cAAc;AAChD,IAAM,wBAA+B,WAAI,qBAAqB;AAC9D,IAAM,qBAA4B,WACjC,0EACD;AACA,IAAM,uBAA8B,WAAI,oBAAoB;AAE5D,IAAM,sBAA6B,WAAI,oBAAoB;AAC3D,IAAM,qBAA4B,WAAI,mBAAmB;AACzD,IAAM,sBAA6B,WAAI,mBAAmB;AAC1D,IAAM,yBAAgC,WAAI,sBAAsB;",
8
+ "debugId": "4F60AD86845EC38864756E2164756E21",
9
+ "names": []
10
+ }
@@ -1,40 +1,42 @@
1
- import type { GradeLevel } from "../grade-level";
2
1
  import type { PrimerLogger } from "../logger";
3
- import { type SessionToken } from "./exchange";
2
+ import { type SessionToken, type TimebackSession } from "./exchange";
3
+ import { type PlacementHints, type PlacementHintsResult } from "./hints";
4
4
  interface PrimerServerConfig {
5
5
  readonly origin: string;
6
6
  readonly secretKey: string;
7
7
  readonly fetch?: typeof globalThis.fetch;
8
8
  readonly abort?: AbortController;
9
- readonly logger?: PrimerLogger;
9
+ readonly logger: PrimerLogger;
10
10
  }
11
11
  interface PrimerServer {
12
12
  /**
13
- * Native only: provision a new Primer-owned student. Returns a stable
14
- * studentId string you persist in your own DB keyed by your user. Pair
15
- * this value with `exchangeNativeStudentForAccessToken` on every
16
- * session start. Timeback integrations do NOT call this they
17
- * provision automatically on exchange.
13
+ * Provisions a frontend-owned Primer student and returns the stable
14
+ * student id you persist in your own DB keyed by your user. Native
15
+ * students are created hint-less; call `setStudentHints` at least
16
+ * once (with a `gradeLevel`) before the student's first session, or
17
+ * the first `/advance` call will 500.
18
18
  */
19
- createNativeStudent(gradeLevel: GradeLevel): Promise<string>;
19
+ createStudent(): Promise<string>;
20
20
  /**
21
- * Native only: update an existing Primer student's grade level. For
22
- * Timeback, grade changes flow from the SIS do not call this.
21
+ * Partial update of a student's placement-routing hints. Pass only
22
+ * the fields you want to set; omitted fields are left untouched.
23
+ * Returns the persisted state after upsert. Today the only hint is
24
+ * `gradeLevel`; future hint kinds (raw context, interests, etc.)
25
+ * will appear as additional optional fields.
23
26
  */
24
- updateNativeStudentGradeLevel(studentId: string, gradeLevel: GradeLevel): Promise<void>;
27
+ setStudentHints(studentId: string, hints: PlacementHints): Promise<PlacementHintsResult>;
25
28
  /**
26
- * Native only: exchange a Primer-minted studentId for a short-lived
29
+ * Exchanges a frontend-owned native/manual student id for a short-lived
27
30
  * access token. Pass `accessToken` from the returned `SessionToken` to
28
31
  * `create()` on the browser SDK.
29
32
  */
30
- exchangeNativeStudentForAccessToken(studentId: string): Promise<SessionToken>;
33
+ exchangeStudentForAccessToken(studentId: string): Promise<SessionToken>;
31
34
  /**
32
- * Timeback only: exchange a OneRoster sourcedId for a short-lived
33
- * access token. The underlying Primer student is auto-provisioned on
34
- * first exchange. Pass `accessToken` from the returned `SessionToken`
35
- * to `create()` on the browser SDK.
35
+ * Verifies the learner against live Timeback authority, resolves or
36
+ * provisions the corresponding frontend-owned Primer student, and
37
+ * returns both the stable student id and a short-lived access token.
36
38
  */
37
- exchangeTimebackStudentForAccessToken(sourcedId: string): Promise<SessionToken>;
39
+ exchangeTimebackStudentForAccessToken(sourcedId: string): Promise<TimebackSession>;
38
40
  }
39
41
  declare function createPrimerServer(config: PrimerServerConfig): PrimerServer;
40
42
  export type { PrimerServer, PrimerServerConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EAAE,KAAK,YAAY,EAAiB,MAAM,6CAA6C,CAAA;AAG9F,UAAU,kBAAkB;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,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,YAAY;IACrB;;;;;;OAMG;IACH,mBAAmB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAE5D;;;OAGG;IACH,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvF;;;;OAIG;IACH,mCAAmC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAE7E;;;;;OAKG;IACH,qCAAqC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CAC/E;AAED,iBAAS,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAepE;AAED,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"create-server.d.ts","sourceRoot":"","sources":["../../src/server/create-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,eAAe,EAGpB,MAAM,6CAA6C,CAAA;AAEpD,OAAO,EACN,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,MAAM,0CAA0C,CAAA;AAGjD,UAAU,kBAAkB;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B;AAED,UAAU,YAAY;IACrB;;;;;;OAMG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;IAEhC;;;;;;OAMG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAExF;;;;OAIG;IACH,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAEvE;;;;OAIG;IACH,qCAAqC,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;CAClF;AAED,iBAAS,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CAepE;AAED,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
@@ -1,17 +1,22 @@
1
1
  import type { PrimerLogger } from "../logger";
2
- type Provider = "native" | "timeback";
3
2
  interface ExchangeConfig {
4
3
  readonly origin: string;
5
4
  readonly secretKey: string;
6
5
  readonly fetch?: typeof globalThis.fetch;
7
6
  readonly abort?: AbortController;
8
- readonly logger?: PrimerLogger;
7
+ readonly logger: PrimerLogger;
9
8
  }
10
9
  interface SessionToken {
11
10
  readonly accessToken: string;
12
11
  readonly expiresInSeconds: number;
13
12
  }
14
- declare function exchangeToken(config: ExchangeConfig, provider: Provider, studentId: string): Promise<SessionToken>;
15
- export type { ExchangeConfig, SessionToken };
16
- export { exchangeToken };
13
+ interface TimebackSession {
14
+ readonly studentId: string;
15
+ readonly accessToken: string;
16
+ readonly expiresInSeconds: number;
17
+ }
18
+ declare function exchangeStudent(config: ExchangeConfig, studentId: string): Promise<SessionToken>;
19
+ declare function exchangeTimebackStudent(config: ExchangeConfig, sourcedId: string): Promise<TimebackSession>;
20
+ export type { ExchangeConfig, SessionToken, TimebackSession };
21
+ export { exchangeStudent, exchangeTimebackStudent };
17
22
  //# sourceMappingURL=exchange.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/server/exchange.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAItE,KAAK,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAA;AAErC,UAAU,cAAc;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,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,YAAY;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CACjC;AAgED,iBAAe,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC,CAoEvB;AAED,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,CAAA"}
1
+ {"version":3,"file":"exchange.d.ts","sourceRoot":"","sources":["../../src/server/exchange.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAKtE,UAAU,cAAc;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B;AAED,UAAU,YAAY;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CACjC;AAED,UAAU,eAAe;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;CACjC;AA8OD,iBAAe,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAmB/F;AAED,iBAAe,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC,CAmB1B;AAED,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAA"}
@@ -0,0 +1,25 @@
1
+ import { type GradeLevel } from "../grade-level";
2
+ import type { PrimerLogger } from "../logger";
3
+ interface HintsConfig {
4
+ readonly origin: string;
5
+ readonly secretKey: string;
6
+ readonly fetch?: typeof globalThis.fetch;
7
+ readonly abort?: AbortController;
8
+ readonly logger: PrimerLogger;
9
+ }
10
+ /**
11
+ * Partial update of a student's placement hints. Pass only the fields
12
+ * you want to set; omitted fields are left untouched. The server
13
+ * returns the persisted state after upsert.
14
+ */
15
+ interface PlacementHints {
16
+ readonly gradeLevel?: GradeLevel;
17
+ }
18
+ interface PlacementHintsResult {
19
+ readonly studentId: string;
20
+ readonly gradeLevel: GradeLevel | null;
21
+ }
22
+ declare function setStudentHints(config: HintsConfig, studentId: string, hints: PlacementHints): Promise<PlacementHintsResult>;
23
+ export type { HintsConfig, PlacementHints, PlacementHintsResult };
24
+ export { setStudentHints };
25
+ //# sourceMappingURL=hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/server/hints.ts"],"names":[],"mappings":"AAUA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAItE,UAAU,WAAW;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAC7B;AAED;;;;GAIG;AACH,UAAU,cAAc;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAChC;AAED,UAAU,oBAAoB;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAA;CACtC;AAwKD,iBAAe,eAAe,CAC7B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAkB/B;AAED,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,CAAA"}
@@ -1,8 +1,9 @@
1
1
  export { createPrimerServer } from "./create-server";
2
2
  export type { PrimerServer, PrimerServerConfig } from "./create-server";
3
- export type { SessionToken } from "./exchange";
4
- export type { PrimerLogger } from "../logger";
3
+ export type { SessionToken, TimebackSession } from "./exchange";
4
+ export type { PlacementHints, PlacementHintsResult } from "./hints";
5
5
  export type { GradeLevel } from "../grade-level";
6
6
  export { GRADE_LEVELS } from "../grade-level";
7
- export { ErrBadRequest, ErrInvalidSecretKey, ErrJsonParse, ErrNetwork, ErrServerError, ErrStudentNotFound, ErrTimebackUnavailable, ErrTimeout, ErrUnsupportedGrade } from "../errors";
7
+ export type { PrimerLogger } from "../logger";
8
+ export { ErrBadRequest, ErrConflict, ErrExternalAuthorityRequired, ErrInvalidSecretKey, ErrJsonParse, ErrNetwork, ErrServerError, ErrStudentNotFound, ErrTimebackUnavailable, ErrTimeout, ErrUnsupportedGrade } from "../errors";
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAA;AACrF,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,MAAM,kDAAkD,CAAA;AAEzD,YAAY,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAA;AAE/E,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACtE,YAAY,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AAEtE,OAAO,EACN,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,mBAAmB,EACnB,MAAM,oCAAoC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAA;AACrF,YAAY,EACX,YAAY,EACZ,kBAAkB,EAClB,MAAM,kDAAkD,CAAA;AAEzD,YAAY,EACX,YAAY,EACZ,eAAe,EACf,MAAM,6CAA6C,CAAA;AAEpD,YAAY,EACX,cAAc,EACd,oBAAoB,EACpB,MAAM,0CAA0C,CAAA;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAA;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AAEtE,OAAO,EACN,aAAa,EACb,WAAW,EACX,4BAA4B,EAC5B,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,UAAU,EACV,mBAAmB,EACnB,MAAM,oCAAoC,CAAA"}