@openstax/ts-utils 1.38.2 → 1.39.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.
@@ -3,6 +3,7 @@ import { VerifyConfig } from 'http-message-signatures';
3
3
  import { JWK } from 'node-jose';
4
4
  import { ConfigProviderForConfig } from '../../config';
5
5
  type Config = {
6
+ apiHost: string;
6
7
  bypassSignatureVerification: string;
7
8
  };
8
9
  interface Initializer<C> {
@@ -12,6 +12,7 @@ const helpers_1 = require("../../misc/helpers");
12
12
  const jwks_1 = require("../../misc/jwks");
13
13
  const createHttpMessageVerifier = ({ configSpace, fetcher }) => (configProvider) => {
14
14
  const config = configProvider[configSpace !== null && configSpace !== void 0 ? configSpace : 'verifier'];
15
+ const getApiHost = (0, helpers_1.once)(async () => await (0, config_1.resolveConfigValue)(config.apiHost));
15
16
  const getBypassSignatureVerification = (0, helpers_1.once)(async () => (await (0, config_1.resolveConfigValue)(config.bypassSignatureVerification)) === 'true');
16
17
  return ({ request }) => ({
17
18
  verify: async ({ configOverride, signatureAgentVerifier }) => {
@@ -44,8 +45,7 @@ const createHttpMessageVerifier = ({ configSpace, fetcher }) => (configProvider)
44
45
  body,
45
46
  headers,
46
47
  method: requestContext.http.method,
47
- // Node's request.url is really just the path and querystring
48
- url: requestContext.http.path,
48
+ url: `${await getApiHost()}${requestContext.http.path}${request.rawQueryString ? `?${request.rawQueryString}` : ''}`,
49
49
  };
50
50
  if (!await http_message_signatures_1.httpbis.verifyMessage({
51
51
  all: true,
@@ -54,7 +54,7 @@ const createLaunchVerifier = ({ configSpace, fetcher }) => (configProvider) => {
54
54
  return callback(new Error('JWT header missing iss claim'));
55
55
  }
56
56
  try {
57
- const domain = new URL(iss).host;
57
+ const domain = new URL(iss).hostname;
58
58
  const trustedDomain = await getTrustedDomain();
59
59
  if (domain !== trustedDomain && !domain.endsWith(`.${trustedDomain}`)) {
60
60
  return callback(new Error(`Untrusted JWKS domain: "${domain}"`));
@@ -1,5 +1,6 @@
1
- import { User } from '../authProvider';
2
1
  import { EagerXapiStatement, UXapiStatement, XapiStatement } from '.';
3
2
  export declare const addStatementDefaultFields: (statement: (Pick<XapiStatement, "object" | "verb" | "context" | "result"> & {
4
3
  id?: string;
5
- }) | UXapiStatement, user: User) => EagerXapiStatement;
4
+ }) | UXapiStatement, user: {
5
+ uuid: string;
6
+ }) => EagerXapiStatement;
@@ -79,7 +79,7 @@ export declare const putAttemptStatement: (gateway: LrsGateway, activity: {
79
79
  export declare const createAttemptActivityStatement: (attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
80
80
  export declare const putAttemptActivityStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, verb: UXapiStatement["verb"], result?: UXapiStatement["result"]) => Promise<import(".").EagerXapiStatement>;
81
81
  export declare const createCompletedStatement: (attemptStatement: UXapiStatement, result?: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
82
- export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"]) => Promise<import(".").EagerXapiStatement>;
82
+ export declare const putCompletedStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement, result: UXapiStatement["result"], user?: string) => Promise<import(".").EagerXapiStatement>;
83
83
  export declare const createCompletedPendingScoringStatement: (attemptStatement: UXapiStatement) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
84
84
  export declare const putCompletedPendingScoringStatement: (gateway: LrsGateway, attemptStatement: UXapiStatement) => Promise<import(".").EagerXapiStatement>;
85
85
  export declare const createScoredStatement: (attemptStatement: UXapiStatement, result: UXapiStatement["result"]) => Pick<UXapiStatement, "object" | "verb" | "context" | "result">;
@@ -311,8 +311,8 @@ const createCompletedStatement = (attemptStatement, result) => {
311
311
  };
312
312
  };
313
313
  exports.createCompletedStatement = createCompletedStatement;
314
- const putCompletedStatement = async (gateway, attemptStatement, result) => {
315
- return (await gateway.putXapiStatements([(0, exports.createCompletedStatement)(attemptStatement, result)]))[0];
314
+ const putCompletedStatement = async (gateway, attemptStatement, result, user) => {
315
+ return (await gateway.putXapiStatements([(0, exports.createCompletedStatement)(attemptStatement, result)], user))[0];
316
316
  };
317
317
  exports.putCompletedStatement = putCompletedStatement;
318
318
  // pending score statement for when the open written response has been graded.
@@ -84,7 +84,7 @@ export declare const lrsGateway: <C extends string = "lrs">(initializer: Initial
84
84
  }) => {
85
85
  putXapiStatements: (statements: Array<(Pick<XapiStatement, "object" | "verb" | "context" | "result"> & {
86
86
  id?: string;
87
- }) | UXapiStatement>) => Promise<EagerXapiStatement[]>;
87
+ }) | UXapiStatement>, user?: string) => Promise<EagerXapiStatement[]>;
88
88
  getXapiStatements: (params: {
89
89
  verb?: string;
90
90
  activity?: string;
@@ -56,9 +56,11 @@ const lrsGateway = (initializer) => (configProvider) => {
56
56
  status: [502]
57
57
  });
58
58
  // Note: This method actually uses POST
59
- const putXapiStatements = async (statements) => {
60
- const user = (0, assertions_1.assertDefined)(await authProvider.getUser(), new errors_1.UnauthorizedError);
61
- const statementsWithDefaults = statements.map(statement => (0, addStatementDefaultFields_1.addStatementDefaultFields)(statement, user));
59
+ const putXapiStatements = async (statements, user) => {
60
+ const userObj = user
61
+ ? { uuid: user }
62
+ : (0, assertions_1.assertDefined)(await authProvider.getUser(), new errors_1.UnauthorizedError);
63
+ const statementsWithDefaults = statements.map(statement => (0, addStatementDefaultFields_1.addStatementDefaultFields)(statement, userObj));
62
64
  const response = await fetcher((await lrsHost()).replace(/\/+$/, '') + '/data/xAPI/statements', {
63
65
  body: JSON.stringify(statementsWithDefaults),
64
66
  headers: {