{"version":3,"sources":["jsdelivr-header.js","/npm/scormcloud-client@0.2.6/dist/client.js"],"names":[],"mappings":"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","file":"/npm/scormcloud-client@0.2.6/dist/client.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/scormcloud-client@0.2.6/dist/client.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ScormClient = exports.ScormClientError = exports.Util = exports.TypeChecks = void 0;\n/* eslint-disable max-len */\n/* eslint-disable no-prototype-builtins */\nconst luxon_1 = require(\"luxon\");\nconst superagent_1 = __importDefault(require(\"superagent\"));\n/** @internal */\nconst BASE_PATH = 'https://cloud.scorm.com/api/v2';\n/** @internal */\nconst HttpStatus = {\n    isSuccess: (r) => {\n        return !!(r.status && (r.status === 200 || r.status === 204));\n    },\n    notFound: (r) => {\n        return !!(r.status && r.status === 404);\n    },\n    isUnauthorized: (e) => {\n        if (e.status) {\n            return e.status === 401;\n        }\n        return !!(e.response && e.response.status === 401);\n    }\n};\n/** @internal */\nexports.TypeChecks = {\n    containsErrorProperty: (x) => {\n        if (x.error) {\n            return true;\n        }\n        return false;\n    },\n    isErrorObject: (x) => {\n        if (x.message) {\n            return true;\n        }\n        return false;\n    },\n    isAuthToken: (x) => {\n        if (x.access_token) {\n            return true;\n        }\n        return false;\n    },\n    isHttpError: (x) => {\n        var _a;\n        if ((_a = x.response) === null || _a === void 0 ? void 0 : _a.error) {\n            return true;\n        }\n        return false;\n    }\n};\n/** @internal */\nexports.Util = {\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    hasProperty(obj, prop) {\n        // eslint-disable-next-line no-prototype-builtins\n        return obj.hasOwnProperty(prop);\n    },\n    getOption: (name, options) => {\n        return options === null || options === void 0 ? void 0 : options[name];\n    },\n    sleep: (milliseconds) => {\n        return new Promise((resolve) => setTimeout(resolve, milliseconds));\n    },\n    scormUploadType: (f) => {\n        if (!f) {\n            throw new ScormClientError('No scorm file path/name received');\n        }\n        if (f.toLowerCase().endsWith('zip')) {\n            return 'application/zip';\n        }\n        if (f.toLowerCase().endsWith('pdf')) {\n            return 'application/pdf';\n        }\n        if (f.toLowerCase().endsWith('mp3')) {\n            return 'audo/mpeg';\n        }\n        if (f.toLowerCase().endsWith('mp4')) {\n            return 'video/mp4';\n        }\n        throw new ScormClientError('Invalid scorm file type, only zip, pdf, mp3 and mp4 supported');\n    }\n};\nclass ScormClientError extends Error {\n    /** @internal */\n    constructor(cause, message, httpStatus) {\n        const e = ScormClientError.parse(cause, message, httpStatus);\n        super(e.message);\n        this.name = 'ScormClientError';\n        this.message = e.message;\n        this.cause = e.error;\n        this.httpStatus = e.httpStatus;\n        if (Error.captureStackTrace) {\n            Error.captureStackTrace(this, ScormClientError);\n        }\n    }\n    static parseMessage(cause, message) {\n        if (message) {\n            return message;\n        }\n        if (typeof cause === 'string') {\n            return cause;\n        }\n        if (exports.TypeChecks.isHttpError(cause)) {\n            if (cause.response.body.error) {\n                return cause.response.body.error;\n            }\n            return cause.response.error.message;\n        }\n        if (exports.TypeChecks.containsErrorProperty(cause)) {\n            return cause.error;\n        }\n        if (exports.TypeChecks.isErrorObject(cause)) {\n            return cause.message;\n        }\n        return 'Unknown Error';\n    }\n    static parseHttpStatus(cause, httpStatus) {\n        if (httpStatus) {\n            return httpStatus;\n        }\n        if (exports.TypeChecks.isHttpError(cause)) {\n            return cause.response.status;\n        }\n        return undefined;\n    }\n    static parseErrorObject(cause) {\n        return exports.TypeChecks.isErrorObject(cause) ? cause : undefined;\n    }\n    static parse(cause, message, httpStatus) {\n        return {\n            message: ScormClientError.parseMessage(cause, message),\n            httpStatus: ScormClientError.parseHttpStatus(cause, httpStatus),\n            error: ScormClientError.parseErrorObject(cause)\n        };\n    }\n}\nexports.ScormClientError = ScormClientError;\n/**\n *\n * Usage example:\n *\n * ```ts\n * import { ScormClient } from 'scorm-client'\n *\n * const client = new ScormClient(appId, secretKey, \"read\")\n *\n * // will fetch a course using a token with the default scope, in this case 'read'\n * const course: Course = await client.getCourse(courseId)\n *\n * // will delete a course using a token with 'write' scope\n * const result: SuccessIndicator = await client.deleteCourse(courseId, { scope: 'write' })\n * ```\n *\n * You will notice that no call has been made to the `authenticate()` method before starting to use the client.\n * When a method is invoked and no valid auth token for the given scope can be found, then the client will attempt\n * to authenticate and fetch a token for that scope. As such, tokens are explicitly associated with a specific scope,\n * and the client will internally manage a set of tokens and their associated scopes.\n *\n * Any future calls for a given scope will use the token associated with it. If no scope is specified (in the\n * `options` for a method), then the default scope (assigned at client instantiation) will be assumed. You are able\n * to manually `authenticate()` different scopes, which is simply asking the client to fetch and store a token for\n * a scope, such that it is immediately available in method calls later.\n *\n * Note: the scope can also be a list of space separated scopes, e.g. \"write:course read:registration\". In such a\n * case the token will be associated with all the specified scopes.\n */\nclass ScormClient {\n    /**\n     * @param appId A SCORM Cloud application ID\n     * @param secretKey The secret key for the given application ID\n     * @param defaultScope An auth scope or space separated list of scopes, e.g. \"write:course read:registration\".\n     * This will be the default scope used if a method on the client is invoked without specifying an explicit\n     * scope in the method's {@link types.Options}\n     * @param defaultExpiry The amount of time, in seconds, after which auth tokens should expire. If unspecified,\n     * it will default to 3600 (1 hour)\n     */\n    constructor(appId, secretKey, defaultScope, defaultExpiry = 3600) {\n        this.authorisations = new Map();\n        this.appId = appId;\n        this.secretKey = secretKey;\n        this.defaultScope = defaultScope;\n        this.defaultExpiry = defaultExpiry;\n    }\n    getTargetScope(scope) {\n        if (!scope) {\n            return this.defaultScope;\n        }\n        if (typeof scope === 'string') {\n            return scope;\n        }\n        if (scope === null || scope === void 0 ? void 0 : scope.scope) {\n            return scope.scope;\n        }\n        return this.defaultScope;\n    }\n    getAuthToken(scope) {\n        const targetScope = this.getTargetScope(scope);\n        if (!targetScope) {\n            return undefined;\n        }\n        return this.authorisations.has(targetScope)\n            ? this.authorisations.get(targetScope)\n            : undefined;\n    }\n    getBearerString(scope) {\n        const authToken = this.getAuthToken(scope);\n        return authToken\n            ? `Bearer ${authToken.access_token}`\n            : '';\n    }\n    authorise(scope) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const authToken = this.getAuthToken(scope);\n            if (!authToken) {\n                if (this.appId && this.secretKey) {\n                    const targetScope = this.getTargetScope(scope);\n                    if (targetScope) {\n                        return yield this.authenticate(targetScope);\n                    }\n                    throw new ScormClientError('Unspecified scope', undefined, 401);\n                }\n                throw new ScormClientError('No authentication credentials found', undefined, 401);\n            }\n            if (authToken.expires_at && luxon_1.DateTime.now().valueOf() > authToken.expires_at) {\n                if (this.appId && this.secretKey) {\n                    const targetScope = this.getTargetScope(scope);\n                    if (targetScope) {\n                        return yield this.authenticate(targetScope);\n                    }\n                    throw new ScormClientError('Unspecified scope', undefined, 401);\n                }\n                throw new ScormClientError('Unable to refresh authentication token', undefined, 401);\n            }\n            return authToken;\n        });\n    }\n    /**\n     * Attempt to authenticate and store an auth token, associated with a given scope\n     *\n     * @param scope An auth scope or space separated list of scopes\n     * @param expiry The amount of time, in seconds, after which the auth token should expire. If unspecified,\n     * it will use the default value provided in the constructor.\n     * @throws {@link ScormClientError} with an `httpStatus` of 401 on authentication failure\n     */\n    authenticate(scope, expiry) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.appId) {\n                throw new ScormClientError('No APP ID defined');\n            }\n            if (!this.secretKey) {\n                throw new ScormClientError('No SECRET KEY defined');\n            }\n            const ttl = expiry !== null && expiry !== void 0 ? expiry : this.defaultExpiry;\n            try {\n                const response = yield superagent_1.default\n                    .post(`${BASE_PATH}/oauth/authenticate/application/token`).type('form')\n                    .auth(this.appId, this.secretKey)\n                    .send(`scope=${scope}`)\n                    .send(`expiration=${ttl}`);\n                if (!exports.TypeChecks.isAuthToken(response.body)) {\n                    throw new ScormClientError('Invalid auth token received');\n                }\n                const token = response.body;\n                token.expires_at = luxon_1.DateTime.now().plus({ seconds: ttl - 60 }).valueOf();\n                this.authorisations.set(scope, token);\n                return response.body;\n            }\n            catch (e) {\n                // this.authToken = undefined ??\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Get back a message indicating that the API is working\n     *\n     * [API Method - PingAppId](https://cloud.scorm.com/docs/v2/reference/swagger/#/ping/PingAppId)\n     *\n     * @param options Options\n     * @throws {@link ScormClientError} if invalid ping response received, or an error was encountered\n     */\n    ping(options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            try {\n                return (yield superagent_1.default.get(`${BASE_PATH}/ping`).set('Authorization', this.getBearerString(options))).body;\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Returns detailed information about the course.\n     *\n     * [API Method - GetCourse](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/GetCourse)\n     *\n     * @param courseId The course ID\n     * @param options CourseFetchOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns The requested {@link types.Course}, or `undefined` if the course was not found\n     */\n    getCourse(courseId, options = {}) {\n        var _a, _b;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            try {\n                const query = {\n                    includeRegistrationCount: (_a = options.includeRegistrationCount) !== null && _a !== void 0 ? _a : undefined,\n                    includeCourseMetadata: (_b = options.includeCourseMetadata) !== null && _b !== void 0 ? _b : undefined\n                };\n                return (yield superagent_1.default\n                    .get(`${BASE_PATH}/courses/${courseId}`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)).body;\n            }\n            catch (e) {\n                if (HttpStatus.notFound(e)) {\n                    return undefined;\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Returns a list of courses. Can be filtered to provide a subset of results.\n     *\n     * This request is paginated and will only provide a limited amount of resources at a time. If there are more\n     * results to be collected, a more token provided with the response which can be passed to get the next page\n     * of results. When passing this token, no other filter parameters can be sent as part of the request. The\n     * resources will continue to respect the filters passed in by the original request.\n  \n     * [API Method - GetCourses](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/GetCourses)\n     *\n     * @param options CourseQueryOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns A {@link types.CourseQueryResponse} that has a property named `courses`, which is an array\n     * of type {@link types.Course}, or an empty array if no courses were found. It also includes a\n     * '`more`' property which, if present, can be used to retrieve the next paginated set of results\n     */\n    getCourses(options = {}) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            try {\n                const query = {\n                    since: (_a = options.since) !== null && _a !== void 0 ? _a : undefined,\n                    until: (_b = options.until) !== null && _b !== void 0 ? _b : undefined,\n                    datetimeFilter: (_c = options.datetimeFilter) !== null && _c !== void 0 ? _c : undefined,\n                    tags: (_d = options.tags) !== null && _d !== void 0 ? _d : undefined,\n                    filter: (_e = options.filter) !== null && _e !== void 0 ? _e : undefined,\n                    filterBy: (_f = options.filterBy) !== null && _f !== void 0 ? _f : undefined,\n                    orderBy: (_g = options.orderBy) !== null && _g !== void 0 ? _g : undefined,\n                    more: (_h = options.more) !== null && _h !== void 0 ? _h : undefined,\n                    includeCourseMetadata: (_j = options.includeCourseMetadata) !== null && _j !== void 0 ? _j : undefined,\n                    includeRegistrationCount: (_k = options.includeRegistrationCount) !== null && _k !== void 0 ? _k : undefined\n                };\n                return (yield superagent_1.default\n                    .get(`${BASE_PATH}/courses`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)).body;\n            }\n            catch (e) {\n                if (HttpStatus.notFound(e)) {\n                    throw new ScormClientError(e, 'Bad request, likely due to invalid query options', 400);\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Creates a course from a package uploaded from your file system. The package will be sent as part of the request\n     * and will be stored in SCORM Cloud. An import job ID will be returned, which can be used with {@link getCourseImportStatus}\n     * to view the status of the import. Courses represent the learning material a learner will progress through.\n     * Note: The import job ID is only valid for one week after the course import finishes.\n     *\n     * [API Method - CreateUploadAndImportCourseJob](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/CreateUploadAndImportCourseJob)\n     *\n     * @param courseId The course ID\n     * @param filePath The path to the file that must be imported to SCORM Cloud\n     * @param options CourseImportOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns A {@link types.CourseImportResponse} if successfull\n     */\n    importCourse(courseId, filePath, options = {}) {\n        var _a, _b;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            if (!filePath) {\n                throw new ScormClientError('No filePath provided');\n            }\n            const fileType = exports.Util.scormUploadType(filePath);\n            const authString = this.getBearerString(options);\n            try {\n                const query = {\n                    courseId,\n                    mayCreateNewVersion: (_a = options.mayCreateNewVersion) !== null && _a !== void 0 ? _a : undefined,\n                    postbackUrl: (_b = options.postbackUrl) !== null && _b !== void 0 ? _b : undefined\n                };\n                function postUploadJob(filePath, fileType, authString, options) {\n                    var _a;\n                    return __awaiter(this, void 0, void 0, function* () {\n                        const contentMetadata = (_a = options.contentMetadata) !== null && _a !== void 0 ? _a : undefined;\n                        if (contentMetadata) {\n                            return yield superagent_1.default\n                                .post(`${BASE_PATH}/courses/importJobs/upload`).type('form')\n                                .set('Authorization', authString)\n                                .set('uploadedContentType', fileType)\n                                .query(query)\n                                .send({ contentMetadata })\n                                .attach('file', filePath);\n                        }\n                        return yield superagent_1.default\n                            .post(`${BASE_PATH}/courses/importJobs/upload`).type('form')\n                            .set('Authorization', authString)\n                            .set('uploadedContentType', fileType)\n                            .query(query)\n                            .attach('file', filePath);\n                    });\n                }\n                const response = yield postUploadJob(filePath, fileType, authString, options);\n                if (!response.body.result) {\n                    return {\n                        courseId: undefined,\n                        importJobId: undefined\n                    };\n                }\n                if (!options.waitForResult) {\n                    return {\n                        courseId,\n                        importJobId: response.body.result,\n                        importJobResult: undefined\n                    };\n                }\n                yield exports.Util.sleep(options.waitForResult);\n                const importJobResult = yield this.getCourseImportStatus(response.body.result);\n                return {\n                    courseId,\n                    importJobId: response.body.result,\n                    importJobResult\n                };\n            }\n            catch (e) {\n                // TODO : handle \"409 conflict, courseId exists and mayCreateNewVersion is false\" ?\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Check the status of a course import. This can be called incrementally to check the progress of a call to any\n     * of the import options. Note: The import job ID is only valid for one week after the course import finishes.\n     *\n     * [API Method - GetImportJobStatus](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/GetImportJobStatus)\n     *\n     * @param jobId The import job ID\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns A {@link types.ImportJobResult}, or `undefined` if no job result was not found\n     */\n    getCourseImportStatus(jobId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!jobId) {\n                throw new ScormClientError('No jobId provided');\n            }\n            try {\n                return (yield superagent_1.default\n                    .get(`${BASE_PATH}/courses/importJobs/${jobId}`)\n                    .set('Authorization', this.getBearerString(options))).body;\n            }\n            catch (e) {\n                if (HttpStatus.notFound(e)) {\n                    return undefined;\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Updates the title of the course.\n     *\n     * [API Method - SetCourseTitle](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/SetCourseTitle)\n     *\n     * @param courseId The course ID\n     * @param title The new title to be set\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * or if the referenced course does not exist\n     * @returns A {@link types.SuccessIndicator}\n     */\n    setCourseTitle(courseId, title, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            if (!title) {\n                throw new ScormClientError('No title provided');\n            }\n            try {\n                const response = yield superagent_1.default\n                    .put(`${BASE_PATH}/courses/${courseId}/title`)\n                    .set('Authorization', this.getBearerString(options))\n                    .send({ title });\n                const success = HttpStatus.isSuccess(response);\n                return {\n                    success,\n                    message: success ? '' : `Failed to set course title '${courseId}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Deletes the specified course. When a course is deleted, so is everything connected to the course. This includes:\n     * - Registrations\n     * - Invitations\n     * - Dispatches\n     * - Debug Logs\n     *\n     * [API Method - DeleteCourse](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/DeleteCourse)\n     *\n     * @param courseId The course ID\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * or if the referenced course does not exist\n     * @returns A {@link types.SuccessIndicator}\n     */\n    deleteCourse(courseId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            try {\n                const response = yield superagent_1.default\n                    .delete(`${BASE_PATH}/courses/${courseId}`)\n                    .set('Authorization', this.getBearerString(options));\n                const success = HttpStatus.isSuccess(response);\n                return {\n                    success,\n                    message: success ? '' : `Failed to delete course '${courseId}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * TODO: Test this function to see what happens with non-existent courses and/or course versions and confirm what\n     * is return and what is thrown. Update the function to handle scenarios appropriately ...\n     *\n     * Returns information about all versions of the course. This can be useful to see information such as registration\n     * counts and modification times across the versions of a course.\n     *\n     * [API Method - GetCourseVersions](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/GetCourseVersions)\n     *\n     * @param courseId The course ID\n     * @param options CourseVersionFetchOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * @returns An array of {@link types.Course}, or an empty array if no courses were found. This method does not\n     * support pagination, all versions will be returned\n     */\n    getCourseVersions(courseId, options = {}) {\n        var _a, _b, _c, _d;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            try {\n                const query = {\n                    since: (_a = options.since) !== null && _a !== void 0 ? _a : undefined,\n                    until: (_b = options.until) !== null && _b !== void 0 ? _b : undefined,\n                    includeCourseMetadata: (_c = options.includeCourseMetadata) !== null && _c !== void 0 ? _c : undefined,\n                    includeRegistrationCount: (_d = options.includeRegistrationCount) !== null && _d !== void 0 ? _d : undefined\n                };\n                const response = yield superagent_1.default\n                    .get(`${BASE_PATH}/courses/${courseId}/versions`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query);\n                return response.body.courses || [];\n            }\n            catch (e) {\n                if (HttpStatus.notFound(e)) {\n                    throw new ScormClientError(e, 'Bad request, likely due to invalid query options', 400);\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Deletes the specified version of the course. If deleting the last remaining version of the course,\n     * the course itself will be deleted and no longer accessible. When a course is deleted, so is everything\n     * connected to the course. This includes:\n     * - Registrations\n     * - Invitations\n     * - Dispatches\n     * - Debug Logs\n     *\n     * [API Method - DeleteCourseVersion](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/DeleteCourseVersion)\n     *\n     * @param courseId The course ID\n     * @param versionNumber The version number\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * or if the referenced course does not exist\n     * @returns A {@link types.SuccessIndicator}\n     */\n    deleteCourseVersion(courseId, versionNumber, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            if (!versionNumber) {\n                throw new ScormClientError('No versionNumber provided');\n            }\n            try {\n                const response = yield superagent_1.default\n                    .delete(`${BASE_PATH}/courses/${courseId}/versions/${versionNumber}`)\n                    .set('Authorization', this.getBearerString(options));\n                const success = HttpStatus.isSuccess(response);\n                return {\n                    success,\n                    message: success ? '' : `Failed to delete course version '${courseId}:${versionNumber}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Creates or updates an asset file uploaded from your file system into the course version. The file will be sent\n     * as part of the request and will be stored in SCORM Cloud alongside the course. This is a useful way to modify\n     * the course structure without needing to reimport the whole course after you've made changes.\n     *\n     * If the course structure is being heavily modified, consider creating a new version instead. This can be done by\n     * calling {@link importCourse}, while passing true for mayCreateNewVersion\n     *\n     * [API Method - UploadCourseVersionAssetFile](https://cloud.scorm.com/docs/v2/reference/swagger/#/course/UploadCourseVersionAssetFile)\n     *\n     * @param courseId The course ID\n     * @param versionNumber The version number\n     * @param filePath The local path to the file that must be imported to SCORM Cloud\n     * @param destinationPath The relative path from the course's base directory on SCORM Cloud, to where the asset file will be uploaded\n     * @param options CourseVersionAssetUploadOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns A {@link types.CourseVersionAssetUploadResponse} if successfull\n     */\n    uploadCourseVersionAssetFile(courseId, versionNumber, filePath, destinationPath, options = {}) {\n        var _a;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            if (!versionNumber) {\n                throw new ScormClientError('No versionNumber provided');\n            }\n            if (!filePath) {\n                throw new ScormClientError('No filePath provided');\n            }\n            if (!destinationPath) {\n                throw new ScormClientError('No destinationPath provided');\n            }\n            try {\n                const query = {\n                    updateAssetPolicy: (_a = options.updateAssetPolicy) !== null && _a !== void 0 ? _a : undefined\n                };\n                const response = yield superagent_1.default\n                    .post(`${BASE_PATH}/courses/${courseId}/versions/${versionNumber}/asset/upload`).type('form')\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)\n                    .send({ destination: destinationPath })\n                    .attach('file', filePath);\n                const success = HttpStatus.isSuccess(response);\n                const file = success && response.body.filename ? response.body.filename : '';\n                const destination = success && response.body.destination ? response.body.destination : '';\n                const successMessage = success && file\n                    ? `File '${file}' uploaded to '${destination}'`\n                    : 'File uploaded';\n                return {\n                    success,\n                    message: success ? successMessage : `Failed to set upload asset for course '${courseId}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Creates a new registration. Registrations are the billable unit in SCORM Cloud, and represents the link between\n     * a learner and a course. A registration will contain a few pieces of information such as learner identifiers,\n     * the id of the course being registered for, and several other optional fields.\n     *\n     * A registration must be tied to a specific course at creation time. When the registration is \"launched\"\n     * (see {@link createLaunchLink}), the course specified at creation time will be launched.\n     *\n     * [API Method - CreateRegistration](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/CreateRegistration)\n     *\n     * @param registrationId An ID for this registration\n     * @param courseId The course ID for which the learner should be registered\n     * @param learner The details of the learner, at minimum a learner ID should be specified\n     * @param options RegistrationOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * or if the referenced course or learner does not exist, or if creating a duplicate registration\n     * @returns A {@link types.SuccessIndicator}\n     */\n    createRegistration(registrationId, courseId, learner, options = {}) {\n        var _a, _b, _c, _d, _e, _f, _g, _h;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!registrationId) {\n                throw new ScormClientError('No registrationId provided');\n            }\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            if (!learner) {\n                throw new ScormClientError('No learner details provided');\n            }\n            try {\n                const query = {\n                    courseVersion: (_a = options.courseVersion) !== null && _a !== void 0 ? _a : undefined\n                };\n                const registration = {\n                    courseId,\n                    learner,\n                    registrationId,\n                    xapiRegistrationId: (_b = options.xapiRegistrationId) !== null && _b !== void 0 ? _b : undefined,\n                    learnerTags: (_c = options.learnerTags) !== null && _c !== void 0 ? _c : undefined,\n                    courseTags: (_d = options.courseTags) !== null && _d !== void 0 ? _d : undefined,\n                    registrationTags: (_e = options.registrationTags) !== null && _e !== void 0 ? _e : undefined,\n                    postBack: (_f = options.postBack) !== null && _f !== void 0 ? _f : undefined,\n                    initialRegistrationState: (_g = options.initialRegistrationState) !== null && _g !== void 0 ? _g : undefined,\n                    initialSettings: (_h = options.initialSettings) !== null && _h !== void 0 ? _h : undefined\n                };\n                const response = yield superagent_1.default\n                    .post(`${BASE_PATH}/registrations`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)\n                    .send(registration);\n                const success = HttpStatus.isSuccess(response);\n                return {\n                    success,\n                    message: success ? '' : `Failed to create registration '${registrationId}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Checks that the registration exists within SCORM Cloud. No registration data will be returned for this call.\n     * If you are looking for information about the registration, try using {@link getRegistration} instead.\n     *\n     * [API Method - GetRegistration](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistration)\n     *\n     * @param registrationId An ID for which registration to check\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made\n     * @returns A boolean true or false\n     */\n    registrationExists(registrationId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!registrationId) {\n                throw new ScormClientError('No registrationId provided');\n            }\n            try {\n                const response = yield superagent_1.default\n                    .head(`${BASE_PATH}/registrations/${registrationId}`)\n                    .set('Authorization', this.getBearerString(options));\n                if (HttpStatus.isSuccess(response)) {\n                    return true;\n                }\n                if (HttpStatus.notFound(response)) {\n                    return false;\n                }\n                throw new ScormClientError(`Bad request: ${response.status}`);\n            }\n            catch (e) {\n                if (HttpStatus.isSuccess(e)) {\n                    return true;\n                }\n                if (HttpStatus.notFound(e)) {\n                    return false;\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Deletes the specified registration. This will also delete all instances of the registration.\n     *\n     * [API Method - DeleteRegistration](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/DeleteRegistration)\n     *\n     * @param registrationId The registration ID\n     * @param options Options\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered,\n     * or if the referenced registration does not exist\n     * @returns A {@link types.SuccessIndicator}\n     */\n    deleteRegistration(registrationId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!registrationId) {\n                throw new ScormClientError('No registrationId provided');\n            }\n            try {\n                const response = yield superagent_1.default\n                    .delete(`${BASE_PATH}/registrations/${registrationId}`)\n                    .set('Authorization', this.getBearerString(options));\n                const success = HttpStatus.isSuccess(response);\n                return {\n                    success,\n                    message: success ? '' : `Failed to delete registration '${registrationId}'`\n                };\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Returns detailed information about the registration. This includes completion status, time taken, score,\n     * and pass/fail status.\n     *\n     * [API Method - GetRegistrationProgress](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistrationProgress)\n     *\n     * @param registrationId The registration ID for which to return progress\n     * @param options RegistrationFetchOptions\n     */\n    getRegistration(registrationId, options = {}) {\n        var _a, _b, _c;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!registrationId) {\n                throw new ScormClientError('No registrationId provided');\n            }\n            try {\n                const query = {\n                    includeChildResults: (_a = options.includeChildResults) !== null && _a !== void 0 ? _a : undefined,\n                    includeInteractionsAndObjectives: (_b = options.includeInteractionsAndObjectives) !== null && _b !== void 0 ? _b : undefined,\n                    includeRuntime: (_c = options.includeRuntime) !== null && _c !== void 0 ? _c : undefined\n                };\n                return (yield superagent_1.default\n                    .get(`${BASE_PATH}/registrations/${registrationId}`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)).body;\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * This is an overloaded method for {@link getRegistration}, and is exactly the same thing. It exists purely to provide a\n     * method named in similar fashion to the official API.\n     *\n     * [API Method - GetRegistrationProgress](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistrationProgress)\n     *\n     * @param registrationId The registration ID for which to return progress\n     * @param options RegistrationFetchOptions\n     */\n    getRegistrationProgress(registrationId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            return yield this.getRegistration(registrationId, options);\n        });\n    }\n    /**\n     * Returns a list of registrations for the given course. Can be filtered to provide a subset of results.\n     *\n     * This request is paginated and will only provide a limited amount of resources at a time. If there are more\n     * results to be collected, a more token provided with the response which can be passed to get the next page\n     * of results. When passing this token, no other filter parameters can be sent as part of the request. The\n     * resources will continue to respect the filters passed in by the original request.\n     *\n     * [API Method - GetRegistrations](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistrations)\n     *\n     * @param courseId The course ID for which to return registrations\n     * @param options RegistrationQueryOptions\n     * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n     * @returns A {@link types.RegistrationQueryResponse} that has a property named `registrations`, which is an array\n     * of type {@link types.Registration}, or an empty array if no registrations were found. It also includes a\n     * '`more`' property which, if present, can be used to retrieve the next paginated set of results\n     */\n    getRegistrationsForCourse(courseId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!courseId) {\n                throw new ScormClientError('No courseId provided');\n            }\n            return yield this.getRegistrations(Object.assign({ courseId }, options));\n        });\n    }\n    /**\n       * Returns a list of registrations for the given learner. Can be filtered to provide a subset of results.\n       *\n       * This request is paginated and will only provide a limited amount of resources at a time. If there are more\n       * results to be collected, a more token provided with the response which can be passed to get the next page\n       * of results. When passing this token, no other filter parameters can be sent as part of the request. The\n       * resources will continue to respect the filters passed in by the original request.\n       *\n       * [API Method - GetRegistrations](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistrations)\n       *\n       * @param learnerId The learner ID for which to return registrations\n       * @param options RegistrationQueryOptions\n       * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n       * @returns A {@link types.RegistrationQueryResponse} that has a property named `registrations`, which is an array\n       * of type {@link types.Registration}, or an empty array if no registrations were found. It also includes a\n       * '`more`' property which, if present, can be used to retrieve the next paginated set of results\n       */\n    getRegistrationsForLearner(learnerId, options = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!learnerId) {\n                throw new ScormClientError('No learnerId provided');\n            }\n            return yield this.getRegistrations(Object.assign({ learnerId }, options));\n        });\n    }\n    /**\n       * Returns a list of registrations. Can be filtered to provide a subset of results.\n       *\n       * This request is paginated and will only provide a limited amount of resources at a time. If there are more\n       * results to be collected, a more token provided with the response which can be passed to get the next page\n       * of results. When passing this token, no other filter parameters can be sent as part of the request. The\n       * resources will continue to respect the filters passed in by the original request.\n       *\n       * [API Method - GetRegistrations](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/GetRegistrations)\n       *\n       * @param options RegistrationQueryOptions\n       * @throws {@link ScormClientError} if an invalid request was made, or an error encountered\n       * @returns A {@link types.RegistrationQueryResponse} that has a property named `registrations`, which is an array\n       * of type {@link types.Registration}, or an empty array if no registrations were found. It also includes a\n       * '`more`' property which, if present, can be used to retrieve the next paginated set of results\n       */\n    getRegistrations(options = {}) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            try {\n                const query = {\n                    courseId: (_a = options.courseId) !== null && _a !== void 0 ? _a : undefined,\n                    learnerId: (_b = options.learnerId) !== null && _b !== void 0 ? _b : undefined,\n                    since: (_c = options.since) !== null && _c !== void 0 ? _c : undefined,\n                    until: (_d = options.until) !== null && _d !== void 0 ? _d : undefined,\n                    datetimeFilter: (_e = options.datetimeFilter) !== null && _e !== void 0 ? _e : undefined,\n                    tags: (_f = options.tags) !== null && _f !== void 0 ? _f : undefined,\n                    filter: (_g = options.filter) !== null && _g !== void 0 ? _g : undefined,\n                    filterBy: (_h = options.filterBy) !== null && _h !== void 0 ? _h : undefined,\n                    orderBy: (_j = options.orderBy) !== null && _j !== void 0 ? _j : undefined,\n                    more: (_k = options.more) !== null && _k !== void 0 ? _k : undefined,\n                    includeChildResults: (_l = options.includeChildResults) !== null && _l !== void 0 ? _l : undefined,\n                    includeInteractionsAndObjectives: (_m = options.includeInteractionsAndObjectives) !== null && _m !== void 0 ? _m : undefined,\n                    includeRuntime: (_o = options.includeRuntime) !== null && _o !== void 0 ? _o : undefined\n                };\n                return (yield superagent_1.default\n                    .get(`${BASE_PATH}/registrations`)\n                    .set('Authorization', this.getBearerString(options))\n                    .query(query)).body;\n            }\n            catch (e) {\n                if (HttpStatus.notFound(e)) {\n                    throw new ScormClientError(e, 'Bad request, likely due to invalid query options', 400);\n                }\n                throw new ScormClientError(e);\n            }\n        });\n    }\n    /**\n     * Get a launch link, which is a relatively short lived url, used to launch the course for a given registration.\n     * Launch links are meant as a way to provide access to your content. When a learner visits the link, the course\n     * will be launched and registration progress will start to be tracked.\n     *\n     * [API Method - BuildRegistrationLaunchLink](https://cloud.scorm.com/docs/v2/reference/swagger/#/registration/BuildRegistrationLaunchLink)\n     *\n     * @param registrationId The registration ID for which to create and return a launch link\n     * @param redirectOnExitUrl The URL the application should redirect to when the learner exits or completes a course.\n     * Alternatively one of the following keywords can be used:\n     *  - closer : A page that automatically tries to close the browser tab/window\n     *  - blank : A blank page\n     *  - message : A page with a message about the course being complete\n     *\n     * If an invalid url is specified, the Message.html page will be loaded\n     * @param options LaunchLinkOptions\n     */\n    createLaunchLink(registrationId, redirectOnExitUrl, options = {}) {\n        var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n        return __awaiter(this, void 0, void 0, function* () {\n            yield this.authorise(options);\n            if (!registrationId) {\n                throw new ScormClientError('No registrationId provided');\n            }\n            if (!redirectOnExitUrl) {\n                throw new ScormClientError('No redirectOnExitUrl provided');\n            }\n            try {\n                const query = {\n                    redirectOnExitUrl,\n                    expiry: (_a = options.expiry) !== null && _a !== void 0 ? _a : undefined,\n                    tracking: (_b = options.tracking) !== null && _b !== void 0 ? _b : undefined,\n                    startSco: (_c = options.startSco) !== null && _c !== void 0 ? _c : undefined,\n                    culture: (_d = options.culture) !== null && _d !== void 0 ? _d : undefined,\n                    cssUrl: (_e = options.cssUrl) !== null && _e !== void 0 ? _e : undefined,\n                    learnerTags: (_f = options.learnerTags) !== null && _f !== void 0 ? _f : undefined,\n                    courseTags: (_g = options.courseTags) !== null && _g !== void 0 ? _g : undefined,\n                    registrationTags: (_h = options.registrationTags) !== null && _h !== void 0 ? _h : undefined,\n                    additionalvalues: (_j = options.additionalvalues) !== null && _j !== void 0 ? _j : undefined,\n                    launchAuth: (_k = options.launchAuth) !== null && _k !== void 0 ? _k : undefined\n                };\n                return (yield superagent_1.default\n                    .post(`${BASE_PATH}/registrations/${registrationId}/launchLink`)\n                    .set('Authorization', this.getBearerString(options))\n                    .send(query)).body;\n            }\n            catch (e) {\n                throw new ScormClientError(e);\n            }\n        });\n    }\n}\nexports.ScormClient = ScormClient;\n"]}