@gyldendalas/gyldendal-divine-api 0.2.7 → 0.2.8
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/index.cjs +2 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -16
- package/dist/index.d.ts +6 -16
- package/dist/index.js +2 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -21,7 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
AIBotService: () => AIBotService,
|
|
24
|
-
ApiErrors: () => ApiErrors,
|
|
25
24
|
CookieConsentLog: () => CookieConsentLog,
|
|
26
25
|
HighlightResultType: () => HighlightResultType,
|
|
27
26
|
HighlightService: () => HighlightService,
|
|
@@ -1075,13 +1074,6 @@ var AIBotService = class extends base_service_default {
|
|
|
1075
1074
|
};
|
|
1076
1075
|
|
|
1077
1076
|
// src/services/quiz_service.ts
|
|
1078
|
-
var ApiErrors = /* @__PURE__ */ ((ApiErrors2) => {
|
|
1079
|
-
ApiErrors2["OVERVIEW_NOT_FOUND"] = "Quiz overview not found";
|
|
1080
|
-
ApiErrors2["NOT_FOUND"] = "Quiz not found";
|
|
1081
|
-
ApiErrors2["ARCHIVED"] = "This shared quiz session is archived";
|
|
1082
|
-
ApiErrors2["GALE_USER_DATA_CLIENT_ERROR"] = "Failed to fetch Gale user data: Client error";
|
|
1083
|
-
return ApiErrors2;
|
|
1084
|
-
})(ApiErrors || {});
|
|
1085
1077
|
var QuizService = class extends base_service_default {
|
|
1086
1078
|
discoverUrlPrefix() {
|
|
1087
1079
|
switch (this.environment) {
|
|
@@ -1112,11 +1104,11 @@ var QuizService = class extends base_service_default {
|
|
|
1112
1104
|
// ─────────────────────────────────────────────────────────────
|
|
1113
1105
|
async checkActiveSession({
|
|
1114
1106
|
isbn,
|
|
1115
|
-
|
|
1107
|
+
quiz,
|
|
1116
1108
|
extraHeaders,
|
|
1117
1109
|
timeout = 3e3
|
|
1118
1110
|
}) {
|
|
1119
|
-
const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${
|
|
1111
|
+
const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;
|
|
1120
1112
|
const headers = this.makeHeaders(extraHeaders);
|
|
1121
1113
|
const res = await this.getAsync({ url, headers, timeout });
|
|
1122
1114
|
return await res.json();
|
|
@@ -1385,7 +1377,6 @@ var SolrProxyService = class extends base_service_default {
|
|
|
1385
1377
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1386
1378
|
0 && (module.exports = {
|
|
1387
1379
|
AIBotService,
|
|
1388
|
-
ApiErrors,
|
|
1389
1380
|
CookieConsentLog,
|
|
1390
1381
|
HighlightResultType,
|
|
1391
1382
|
HighlightService,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/polly_service.ts","../src/services/cookie_consent_log.ts","../src/services/highlight_service.ts","../src/services/user_settings_base.ts","../src/services/user_settings_clientsettings.ts","../src/services/user_settings_bookmarks.ts","../src/services/user_settings_continue.ts","../src/services/user_settings_mru.ts","../src/services/pdf_generator.ts","../src/services/highlevel/tagging/user_folders.ts","../src/services/ai_bot_service.ts","../src/services/quiz_service.ts","../src/services/writing_task_service.ts","../src/services/solr_proxy_service.ts"],"sourcesContent":["// Fully implemented services\nexport * from 'services/tagging_service.js';\nexport * from 'services/polly_service.js';\nexport * from 'services/cookie_consent_log.js';\nexport * from 'services/highlight_service.js';\nexport * from 'services/user_settings_clientsettings.js';\nexport * from 'services/user_settings_bookmarks.js';\nexport * from 'services/user_settings_continue.js';\nexport * from 'services/user_settings_mru.js';\nexport * from 'services/pdf_generator.js';\nexport * from 'services/highlevel/tagging/user_folders.js';\nexport * from 'services/ai_bot_service.js';\nexport * from 'services/quiz_service.js';\n\n// Discovery only services\nexport * from 'services/writing_task_service.js'\nexport * from 'services/solr_proxy_service.js'\n","export class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment.toLowerCase();\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'GET';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async putAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PUT';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async postAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'POST';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async deleteAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'DELETE';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async patchAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PATCH';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n } \n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout,\n addAuthHeaders\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number,\n addAuthHeaders?: boolean,\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n if (addAuthHeaders) {\n headers = await this.addAuthHeaders(headers);\n }\n\n const response = await fetch(url, {\n method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\nexport interface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport interface TagOutput extends Tag {\n created_at: number;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-tagging.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/tagging`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByResource(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name?: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_resource/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_tag_name/${identity}/${tag_name}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return await response.json();\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async updateTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.putAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.deleteAsync({url, headers, timeout});\n await response.json();\n return\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport enum SSMLSpeechSpeeds {\n X_SLOW = 1,\n SLOW = 2,\n MEDIUM = 3,\n FAST = 4,\n X_FAST = 5,\n}\n\nexport type SpeechmarkEvent = {\n time: number;\n type?: string;\n value: string;\n start?: number;\n end?: number;\n}\n\nexport interface SynthesisResponse {\n mp3url: string;\n s3: string[];\n SpeechMarks?: SpeechmarkEvent[];\n}\n\nexport interface SynthesisRequest {\n text: string;\n includeSpeechMarks?: boolean;\n voice: number;\n speed?: SSMLSpeechSpeeds;\n}\n\nexport class PollyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://appear-polly.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-appear-polly.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/polly`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async synthesize(\n {\n body,\n timeout = 3000\n }:\n {\n body: SynthesisRequest,\n timeout?: number\n }\n ): Promise<SynthesisResponse> {\n const url = `${this.getUrlPrefix()}/synthesizeSpeech`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\n\nexport default PollyService;\n","import BaseService from './base_service.js';\n\nexport interface CookieConsentRequest {\n consentState: CookieConsentState;\n consentUrl: string;\n timeStamp: number;\n uuid: string;\n}\n\nexport interface CookieConsentState {\n func: number;\n stat: number;\n uuid: string;\n version: number;\n}\n\nexport interface CookieConsentResponse {\n response: string\n}\n\nexport class CookieConsentLog extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://cookieconsentlog.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-cookieconsentlog.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/cookieconsentlog`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async logCookieConsent(\n {\n body,\n timeout = 3000\n }:\n {\n body: CookieConsentRequest,\n timeout?: number\n }\n ): Promise<string> {\n const url = `${this.getUrlPrefix()}/log`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), addAuthHeaders: false, timeout});\n return response.text();\n }\n\n}\n\nexport default CookieConsentLog;\n","import BaseService from './base_service.js';\n\nexport enum HighlightResultType {\n 'highlight' = 'highlight',\n 'note' = 'note',\n}\n\nexport interface HighlightRanges {\n start: number|null;\n end: number|null;\n startOffset: number;\n endOffset: number;\n}\n\nexport interface Highlight extends HighlightUpdate {\n id: string;\n recreationdata?: IRecreationData;\n ranges?: HighlightRanges[];\n lang?: string;\n markedupText?: string;\n createdtstamp?: number;\n}\n\nexport interface HighlightRequest {\n breadCrumb: string;\n pageTitle: string;\n externalUserId?: string;\n highlight: Highlight;\n}\n\nexport interface HighlightSearchRequest {\n searchQuery: string;\n resultType?: HighlightResultType;\n isbn?: string;\n maxResults?: number;\n vectorMinConfidence?: number;\n vectorHighConfidence?: number;\n fulltextMinScore?: number;\n}\n\nexport interface HiglightSearchMatch {\n rangeKey: number;\n confidence: number;\n texttype: HighlightResultType;\n isbn: string;\n pid: number;\n returnedItem: number;\n}\n\nexport interface HighlightSearchResponse {\n Items: HighlightResponse[];\n Matches: HiglightSearchMatch[];\n}\n\nexport interface HighlightResponse extends HighlightRequest {\n debugHostname: string;\n uidIsbnPidMyAccountIdPartitionKey: string;\n timestampSortKey: number;\n timeToDie: number;\n pid: number;\n uid: string;\n myAccountid: string;\n commentText: string;\n quote: string;\n hlcolor: string;\n isbn: string;\n}\n\nexport interface HighlightUpdate {\n hlcolor: string;\n quote: string;\n text: string;\n}\n\nexport interface HighlightUpdateRequest {\n highlight: HighlightUpdate;\n}\n\nexport interface HighlightCountResponse {\n type: HighlightResultType;\n isbn: string;\n count: number;\n}\n\nexport interface HighlightDeleteResult extends HighlightUpdateResponse {\n changed: number;\n}\n\nexport interface HighlightAddResult extends HighlightUpdateResponse {\n timestampSortKey: number;\n}\n\nexport interface HighlightUpdateResponse {\n status: string;\n}\n\ninterface IBKNGData {\n prev20TextContent?: string | null;\n next20TextContent?: string;\n cid?: number;\n isPageNote?: boolean;\n domPath?: string;\n newElementPath?: string;\n elementPath?: string;\n prevNextTextContent?: {\n before: string | null;\n after: string;\n srcText: string | null;\n };\n}\n\nexport interface ICtype {\n SiblingsCount: string; // e.g. '15'\n classes: string; // e.g. 'csc-default csc-textpic'\n}\n\nexport interface ICtypeDict {\n [cid: string]: ICtype;\n}\n\nexport interface ITextStartEndObject {\n startSelectedText: string | undefined | null; // start of selection, text value\n endSelectedText: string | undefined; // end of selection, text value '150.000';\n}\n\nexport interface IRecreationData {\n startCID: number; // id of section start, e.g. 'c319'\n numberOfSiblingsOnStartNode?: number | undefined; // sibling count adjacent to the start node, e.g. '5'\n numberofPrevSiblingsOnCIDStartNode?: number | undefined; // e.g. '1';\n startCtypes?: ICtypeDict | null | undefined; // this was never used....\n\n endCID: number;\n numberOfSiblingsOnEndNode?: number | undefined;\n numberofPrevSiblingsOnCIDEndNode?: number | undefined;\n endCTypes?: ICtypeDict | null | undefined; // this was never used ....\n\n startSelectionInnerText?: string | null | undefined; // inner html (text) of the start node that was selected\n endSelectionInnerText?: string | null | undefined; // inner html (text) of the end node that was selected\n\n mathObject?: string | null | undefined; // e.g. '0'. who knows?\n\n selectedTextStartAndEndObject?: ITextStartEndObject | undefined; // not really used in the old client\n\n totalSiblingsToCIDs?: number | undefined; // e.g. '15'\n\n ibkngData?: IBKNGData | null | undefined;\n\n specialSelectedText?: string | undefined;\n source?: any | null | undefined;\n}\n\nexport class HighlightService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://highlights.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-highlights.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/highlight`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async search(\n {\n search,\n timeout = 3000\n }:\n {\n search: HighlightSearchRequest,\n timeout?: number\n }\n ): Promise<HighlightSearchResponse> {\n const url = `${this.getUrlPrefix()}/v2/search`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(search), timeout});\n return response.json();\n }\n\n async deleteHighlightOrNote(\n {\n isbn,\n pid,\n key,\n timeout = 3000\n }:\n {\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightDeleteResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.deleteAsync({url, headers, timeout});\n return response.json();\n }\n\n async getHighlightOrNote(\n {\n isbn,\n pid,\n timeout = 3000\n }:\n {\n isbn: string,\n pid?: number,\n timeout?: number\n }\n ): Promise<HighlightResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/isbn/${isbn}`;\n if (pid) {\n url += `/pid/${pid}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async getHighlightOrNoteCounts(\n {\n noteType,\n timeout = 3000\n }:\n {\n noteType?: HighlightResultType,\n timeout?: number\n }\n ): Promise<HighlightCountResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/count`;\n if (noteType) {\n url += `/${noteType}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async updateHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n key,\n timeout = 5000\n }:\n {\n payload: HighlightUpdateRequest,\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightUpdateResponse> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n\n async addHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n timeout = 5000\n }:\n {\n payload: HighlightRequest,\n isbn: string,\n pid: number,\n timeout?: number\n }\n ): Promise<HighlightAddResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n}\n\nexport default HighlightService;\n","import BaseService from './base_service.js';\n\nexport class UserSettingsBase extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'development':\n case 'testing':\n return `https://staging-user-settings-service.services.${this.baseDomain}`;\n case 'local':\n return `http://localhost:4000`;\n case 'test':\n return `https://localhost:3010/services/usersettingsservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default UserSettingsBase;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface ClientSettingsResponse {\n settings: ClientSettings;\n}\nexport interface ClientSettings {\n readabilities?: Readability;\n darkMode?: boolean;\n displayMode?: DisplayModeOption;\n enableKeyboardShortcuts?: boolean;\n showBookmarks?: boolean;\n showNoteHighlights?: boolean;\n featureGalleryVersion?: number;\n readAloudStore?: ReadAloudStore;\n leftDrawerWidth?: number;\n recentSearches?: string[];\n materialListImagesView?: LayoutView;\n frontPageSections?: FrontPageSection[];\n activePublicationFilters?: ActivePublicationFilters;\n cardsView?: LayoutView;\n cardsSorting?: SortOptions;\n foldersView?: LayoutView;\n foldersSorting?: SortOptions;\n onboardingPromptTime?: string;\n showOnboardingPrompt?: boolean;\n favoritesSorting?: SortOptions;\n}\n\nexport type DisplayModeOption = 'light' | 'dark' | 'system';\n\nexport type LayoutView = 'list' | 'grid';\n\nexport interface ActivePublicationFilters {\n educations?: string[];\n displaySubjects?: string[];\n categoriesNames?: string[];\n categoriesLevels?: string[];\n publishers?: string[];\n}\n\nexport interface Readability {\n letterSpacing?: number;\n lineHeight?: number;\n textSize?: number;\n fontFamily?: FontFamily;\n}\n\nexport interface FontFamily {\n name?: string;\n defaultSize?: string;\n url?: string;\n}\n\nexport interface ReadAloudStore {\n currentVoiceSelection?: CurrentVoiceSelection;\n currentSpeedSelection?: CurrentSpeedSelection;\n}\n\nexport interface CurrentSpeedSelection {\n speed?: number;\n text?: string;\n}\n\nexport interface CurrentVoiceSelection {\n voice?: number;\n gender?: number;\n language?: number;\n}\n\nexport interface FrontPageSection {\n changeable?: boolean;\n code?: string;\n enabled?: boolean;\n name?: string;\n position?: number;\n}\n\nexport type SortOptions = 'recent' | 'alphabetical';\n\n\nexport class UserSettingsClientSettings extends UserSettingsBase {\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {settings: {}} as ClientSettingsResponse;\n } else {\n throw HTTPError;\n }\n }\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: ClientSettings,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n return response.json();\n }\n\n async deleteSettings(\n {\n isbn,\n timeout = 5000\n }: \n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n}\n\nexport default UserSettingsClientSettings;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface Bookmark extends BookmarkUpdate {\n createdTimeStamp: number;\n isbn?: string;\n}\n\nexport interface BookmarkUpdate {\n pageId: number;\n contentId: number;\n}\n\nexport class UserSettingsBookmarks extends UserSettingsBase {\n async setBookmark(\n {\n isbn,\n bookmark,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n bookmark: BookmarkUpdate,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Bookmark> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(bookmark), timeout});\n return response.json();\n }\n\n async deleteBookmark(\n {\n isbn,\n pageId,\n contentId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n contentId: number,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}/page/${pageId}/content/${contentId}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getBookmark(\n {\n isbn,\n pageId,\n timeout = 5000\n }:\n {\n isbn?: string,\n pageId?: number,\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n if (!isbn && pageId) {\n throw new Error('The isbn parameter is required if pageId is provided.');\n }\n\n let url = `${this.getUrlPrefix()}/bookmark/`;\n if (isbn) {\n url += `isbn/${isbn}`;\n }\n\n if (pageId) {\n url += `/page/${pageId}`;\n }\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n // Favourites are bookmarks that are ISBN specific, with a pageId of 0.\n async getFavourite(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n let url = `${this.getUrlPrefix()}/bookmark/favourite`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsBookmarks;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface Continue extends ContinueUpdate {\n createdTimeStamp?: number;\n}\n\nexport interface ContinueUpdate {\n pageId: number;\n}\n\nexport class UserSettingsContinue extends UserSettingsBase {\n async setContinue(\n {\n isbn,\n pageId,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Continue> {\n\n const continueBody: ContinueUpdate = {\n pageId\n };\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(continueBody), timeout});\n return response.json();\n\n }\n\n async deleteContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<Continue> {\n let url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {} as Continue;\n } else {\n throw HTTPError;\n }\n }\n }\n\n}\n\nexport default UserSettingsContinue;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface MRU {\n isbn: string;\n link: string;\n title: string;\n}\n\nexport class UserSettingsMRU extends UserSettingsBase {\n async setMRU(\n {\n mru,\n externalUserId,\n timeout = 5000\n }:\n {\n mru: MRU,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<MRU[]> {\n\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(mru), timeout});\n return response.json();\n }\n\n async clearMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n\n async getMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<MRU[]> {\n let url = `${this.getUrlPrefix()}/mru`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsMRU;\n","import BaseService from './base_service.js';\n\nexport interface NoteHighlight {\n color: string;\n comment: string;\n selectedText: string;\n}\n\nexport interface Notes {\n created: string;\n highlight: NoteHighlight;\n link: string;\n pid: string;\n title: string;\n id: string;\n}\n\nexport interface NotesLabels {\n amountOfNotesProse: string;\n documentTitle: string;\n markedText: string;\n noContentLabel: string;\n noSelectedTextLabel: string;\n notesExportedAt: string;\n yourNote: string;\n}\n\nexport interface NotesData {\n labels: NotesLabels\n notes: Notes[]\n}\n\nexport interface NotesRequest {\n exportedDate: string;\n notesData: NotesData;\n userId: string;\n userName: string;\n}\n\nexport interface Response {\n status: string;\n url: string;\n}\n\nexport interface WritingTaskRequest {\n pdftitle: string;\n userId: string;\n userName: string;\n}\n\nexport interface WritingTaskData {\n createdData: string;\n exportedDateTimeString: string;\n header: string;\n headerStripped: string;\n host: string;\n isbn: string;\n publisher: string;\n siteTitle: string;\n userIdentity: string;\n writingTaskItems: WritingTaskItem[];\n}\n\nexport interface WritingTaskItem {\n answer: string;\n crdate: number;\n cruser_id: number;\n deleted: number;\n files: string[]|null;\n hidden: number;\n imageorient: number;\n parentid: number;\n parenttable: string;\n parsedAnswer: string;\n parsedQuestion: string;\n pid: number;\n question: string;\n sorting: number;\n title: string;\n tstamp: number;\n uid: number;\n userAnswered: boolean;\n}\n\nexport interface SiteMapLabels {\n pbook: string;\n toc: string;\n}\n\nexport interface SiteMapPageTreeItem {\n chapterInfo?: SiteMapPageTreeItem;\n characters: number;\n iPages: number;\n images: number;\n interactiveElements: number;\n lang: number;\n math: number;\n ogStandardPage: number;\n originalMaterial: number;\n quizzes: number;\n soundFiles: number;\n standardPage: number;\n sys_language_uid: number;\n uid: number;\n videos: number;\n words: number;\n}\n\nexport interface SiteMapPage {\n children: SiteMapPage[];\n accessGranted: boolean;\n author: null|string;\n description: null|string;\n doktype: number;\n editor: null|string;\n fe_group: string;\n keywords: null|string;\n link: string;\n nav_hide: number;\n nav_title: string;\n pid: number;\n title: string;\n uid: number;\n}\n\nexport type SiteMapPageTreeData = Record<string, SiteMapPageTreeItem>;\n\nexport interface SiteMapContent {\n labels: SiteMapLabels,\n pageTreeData: SiteMapPageTreeData,\n pages: SiteMapPage[]\n}\n\nexport interface SiteMapRequest {\n baseUrl: string;\n content: SiteMapContent,\n exportedDate: string;\n isbn: string;\n siteTitle: string;\n userId: string;\n userName: string;\n}\n\nexport class PdfGeneratorService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://pdfgenerator.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-pdfgenerator.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/pdfgenerator`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async pdfFromSiteMap(\n {\n body,\n timeout = 3000\n }:\n {\n body: SiteMapRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/sitemap`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromWritingTask(\n {\n body,\n timeout = 3000\n }:\n {\n body: WritingTaskRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/writingTask`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromNotes(\n {\n body,\n timeout = 3000\n }:\n {\n body: NotesRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/notes`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\nexport default PdfGeneratorService;","import TaggingService from '../../tagging_service.js';\nimport {v4 as uuidv4} from 'uuid';\n\nexport interface FolderObject {\n created_at: number;\n}\n\nexport interface Folder extends FolderObject {\n name: string;\n color: string;\n uuid: string;\n parent?: string;\n}\n\nexport interface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder properties are stored as a base64 encoded JSON string.\n**/\nexport class UserFolders extends TaggingService {\n private readonly hasNoParent: string = '-';\n private identity?: string = undefined;\n\n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n /**\n * Create a folder.\n * @param folder_name The name of the folder.\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param color The color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n color,\n timeout = 3000\n }:\n {\n folder_name: string,\n color: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const folder_payload = JSON.stringify({\"folder\": folder_name, \"color\": color});\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: uuidv4(),\n tag_name: parent_folder_uuid ?? this.hasNoParent,\n tag_value: Buffer.from(folder_payload).toString('base64'),\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid, created_at: tag['created_at']} as Folder;\n }\n\n /**\n * Update a folder. Only name and color can be changed.\n *\n * @param folder_uuid The UUID of the folder.\n * @param folder_name The new name of the folder.\n * @param color The new color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async updateFolder(\n {\n folder_uuid,\n folder_name,\n color,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n folder_name?: string,\n color?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n\n if (tags.length === 0) {\n throw new Error(`Folder with UUID ${folder_uuid} not found`);\n }\n\n const tag = tags[0];\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n const new_folder_name = folder_name ?? folder_payload['folder'];\n const new_color = color ?? folder_payload['color'];\n\n const new_folder_payload = JSON.stringify({\"folder\": new_folder_name, \"color\": new_color});\n\n const updatedTag = await this.updateTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n tag_name: tag['tag_name'],\n tag_value: Buffer.from(new_folder_payload).toString('base64'),\n },\n timeout\n }\n );\n\n const parent = tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'];\n return {name: new_folder_name, uuid: folder_uuid, parent: parent, created_at: updatedTag['created_at']} as Folder;\n }\n\n /**\n * List all folders in the user's account.\n * \n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<Folder[]> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the next level of folders in the user's account.\n *\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listNextFolderLevel(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (!parent_folder_uuid) {\n parent_folder_uuid = this.hasNoParent;\n }\n\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_name: parent_folder_uuid,\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the content of a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n* @return (Folder | FolderContent)[]\n **/\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<(Folder|FolderContent)[]> {\n let tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n tag_name: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n content.push({\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'],\n created_at: tag['created_at']\n } as Folder)\n } else {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_name'],\n created_at: tag['created_at']\n } as FolderContent\n );\n }\n }\n\n return content;\n }\n\n /**\n * Add a book to a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Remove a book from a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeInternetbookFromFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.removeContentFromFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Create a new folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_type,\n resource_name,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n tag_value: 'MYACCOUNT_USER_FOLDER'\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid, created_at: tag['created_at']} as FolderContent;\n }\n\n /**\n * Remove a folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeContentFromFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete all folders. Note, this will not delete the content of the folders.\n *\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n","import BaseService from './base_service.js';\n\nexport type AIChatRole = \"user\" | \"assistant\" | \"system\";\n\ntype GenericContext = Record<string, unknown>;\n\nexport interface AIChatMessage<\n ContextType extends GenericContext = GenericContext,\n> {\n role: AIChatRole;\n content: string;\n context?: ContextType;\n}\n\nexport interface AIChatMessageDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n role?: AIChatRole;\n content?: string;\n context?: ContextType;\n}\n\nexport interface AIChatCompletion<\n ContextType extends GenericContext = GenericContext,\n> {\n message: AIChatMessage;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n delta: AIChatMessageDelta;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionOptions<\n ContextType extends GenericContext = GenericContext,\n> {\n context?: ContextType;\n sessionState?: unknown;\n}\n\nexport type AIChatCompletionRequest = {\n messages: AIChatMessage[];\n} & AIChatCompletionOptions;\n\n\nexport class AIBotService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://ai-bot-service.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://ai-bot-service-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/aibotservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async constructChatUrl (\n {\n interactivityId,\n isbn,\n stream\n }:\n {\n interactivityId?: string,\n isbn?: string,\n stream: boolean\n }\n ): Promise<string> {\n if (interactivityId && isbn) \n {\n throw new Error(\"interactivityId and isbn are mutually exclusive\");\n }\n\n if (!interactivityId && !isbn) \n {\n throw new Error(\"Either interactivityId or isbn must be provided\");\n }\n\n let url = '';\n if (interactivityId) \n {\n url = `${this.getUrlPrefix()}/${interactivityId}/chat`;\n }\n\n if (isbn) \n {\n url = `${this.getUrlPrefix()}/interactivity_from_isbn/${isbn}`;\n }\n\n if (stream) {\n url += '/stream';\n }\n\n return url;\n }\n\n async chat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<AIChatCompletion> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: false});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async streamingChat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: true});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n const responseBody = response.body;\n if (!responseBody)\n {\n throw new Error(\"Response body is null\");\n }\n return responseBody;\n }\n}\n\nexport default AIBotService;\n","import BaseService from './base_service.js';\n\nexport enum ApiErrors {\n OVERVIEW_NOT_FOUND = 'Quiz overview not found',\n NOT_FOUND = 'Quiz not found',\n ARCHIVED = 'This shared quiz session is archived',\n GALE_USER_DATA_CLIENT_ERROR = 'Failed to fetch Gale user data: Client error'\n}\n\nexport interface QuizStartResponse {\n quizUnitId: number;\n}\n\nexport interface QuizApiError {\n response: {\n _data: {\n Error: ApiErrors;\n };\n };\n}\n\nexport interface Quiz {\n quizId: number;\n quizName: string;\n quizDescription: string;\n quizFinished: boolean;\n questions: Question[];\n quizDeadline?: number;\n quizResultAvailable?: number;\n quizStartTime?: number;\n}\n\nexport interface Question {\n questionId: number;\n name: string;\n introText: string;\n caseSensitive?: boolean;\n shuffle: boolean;\n answerChecked: boolean;\n questionType: string;\n questionTypeId: number;\n mediafile: Mediafile;\n medias: Mediafile[];\n answers: Answer[];\n chosenAnswer: ChosenAnswer[] | null;\n description: string;\n freeText: string;\n scores?: Score;\n answerBins: {\n binindex: number;\n img: Mediafile;\n txt: string;\n }[];\n tokenized: Tokens[];\n 'chosenAnswer correctness': string;\n}\n\nexport interface FormattedQuestion extends Question {\n number: number;\n answerTime?: string | null;\n percentage: string;\n}\n\nexport interface Mediafile {\n id: number;\n placement: string;\n caption: string;\n altText: string;\n identifier: string;\n extension: string;\n mimeType: string;\n credit: string;\n}\n\nexport interface ChosenAnswer {\n id: number | number[];\n answerText: string;\n created?: number;\n position: number;\n mediafile: Mediafile;\n bins?: number[];\n bin?: number;\n answers?: Answer[];\n answerBins?: AnswerBins[];\n questionId: number;\n isCorrect: boolean;\n wordoption?: AnswerIcon;\n}\n\nexport interface AnswerBins {\n txt: string;\n binindex: number;\n img: Mediafile;\n}\n\nexport interface Answer {\n id: number | number[];\n answerText: string;\n isCorrect: boolean;\n position: number | number[];\n mediafile?: Mediafile;\n bins?: number[];\n inputText?: {\n [key: string]: InputText;\n };\n dropdown?: DropdownMap;\n tableData?: TableData;\n wordoptions?: WordOptions;\n wordoption?: AnswerIcon;\n answerOptions?: AnswerIcon[];\n questionId?: number;\n answerBins?: AnswerBins[];\n}\n\nexport interface WordOptions {\n options: WordOptionsOption[];\n answerOptions?: string[] | AnswerIcon[];\n}\n\nexport interface WordOptionsOption {\n words: string;\n answers: string;\n position: number;\n}\n\nexport interface AnswerIcon {\n abbreviation: string;\n icon: string;\n description: string;\n display: string;\n}\n\nexport interface InputText {\n answerText: string;\n bins: number[];\n id?: number;\n correctText: string;\n isCorrect: boolean;\n position: number;\n index?: number;\n maxCorrectValue?: number;\n minCorrectValue?: number;\n}\n\nexport interface InputTextMap {\n [key: string]: InputText;\n}\n\nexport interface DropdownMap {\n [key: string]: Dropdown[];\n}\n\nexport interface Dropdown {\n option: string;\n isCorrect: boolean;\n position?: number;\n}\n\nexport interface DropdownFormattedOption {\n answerId: number;\n options: Dropdown[];\n}\n\nexport interface TableData {\n [key: string]: {\n [key: string]: TableDataColumn | string;\n };\n}\n\nexport interface TableDataColumn {\n correctText: string;\n isCorrect: boolean;\n position: number;\n options: Dropdown[];\n minCorrectValue?: number;\n maxCorrectValue?: number;\n}\n\nexport interface QuizResult {\n Problemdata: Question[];\n QuizSession?: {\n closesAt: string | null;\n description: string;\n name: string;\n opensAt: string | null;\n problems: number;\n quizSessionId: number;\n };\n QuizUnit?: {\n averageScore: number;\n finished: boolean;\n finishedAt: number | null;\n quizUnitId: number;\n startedAt: number | null;\n studentEkeysId: string;\n studentId: number;\n timeSpent: number;\n };\n Results: Results;\n}\n\nexport interface Results {\n 'Number of correct': number;\n 'Number of incorrect': number;\n 'Number of not answered': number;\n 'Number of partially correct': number;\n 'Number of questions': number;\n unitScore: CalculatedScore;\n}\n\nexport interface Score {\n 'Number of correct options': number;\n 'Number of correct options chosen': number;\n 'Number of options': number;\n 'Number of options chosen': number;\n 'Percentage score': number;\n 'Student has answered'?: boolean;\n 'Token check': Tokens[];\n}\n\nexport interface WordOptionsAnswer {\n answerId?: number;\n options?: (string | AnswerIcon)[];\n text: WordOptionsAnswerText | undefined;\n index: number;\n selected?: undefined | string | AnswerIcon;\n}\n\nexport interface WordOptionsAnswerText {\n answers: string;\n words: string;\n position: number;\n}\n\nexport interface Tokens {\n correctText: string;\n diffCheck: TokensDiffCheck[];\n numberOfTokenErrors: number;\n studentAnswerText: string;\n}\n\nexport interface TokensDiffCheck {\n error: boolean;\n studentWord: string;\n correctWord: string;\n}\n\nexport interface NewAnswer {\n answerText: string;\n bins: number[];\n id: number;\n isCorrect: boolean;\n position: number;\n questionId: number;\n}\n\nexport interface SaveAnswerResponse {\n Result: string;\n}\n\nexport interface SaveAnswer {\n 'question-id': number;\n 'question-type-id': number;\n 'answer-id'?: number[];\n 'answer-text'?: (string | { answers: string } | null)[];\n 'answer-position'?: number[];\n 'answer-bin'?: number[];\n 'answer-checked'?: boolean;\n}\n\nexport type QuizTextSettings = Record<string, string | number>;\n\nexport interface SharedQuizData {\n 'quiz-id'?: string | undefined;\n isbn?: string | undefined;\n title: string;\n description: string;\n 'quiz-open': number | null;\n 'quiz-close': number | null;\n 'result-available-time'?: number | null;\n 'extra-teachers': string[];\n}\n\nexport interface SharedTeacherQuiz {\n createdAt?: number;\n deactivatedProblems?: number[];\n extraTeachers?: string[];\n isArchived?: boolean;\n isExtraTeacher?: boolean;\n isPinned?: boolean;\n name?: string;\n problems: number;\n quizSessionId?: number;\n studentsFinished?: number;\n}\n\nexport interface SharedStudentQuiz {\n quizUnitId: number;\n quizSessionId: number;\n name: string;\n createdBy: string;\n startedAt: number | null;\n finishedAt: number | null;\n finished: boolean;\n}\n\nexport interface CalculatedScore {\n points: number;\n maxPoints: number;\n percentage: number;\n}\n\nexport interface QuizSession extends SharedTeacherQuiz {\n description?: string;\n opensAt: number | null;\n closesAt: number | null;\n quizUnits?: QuizUnit[];\n averageScores?: {\n byProblem: CalculatedScore[];\n overall: CalculatedScore;\n };\n}\n\nexport interface QuizUnit {\n quizUnitId: number;\n studentId: number;\n studentEkeysId: string;\n finished: boolean;\n finishedAt: number | null;\n startedAt: number | null;\n timeSpent: TimeSpent;\n unitScore: CalculatedScore;\n problemScores: ProblemScore[];\n}\n\nexport interface TimeSpent {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface FormattedQuizUnit extends QuizUnit {\n formattedTimeSpent?: string;\n formattedFinishedAt?: string | null;\n formattedStartedAt?: string | null;\n percentage?: string;\n total?: string;\n}\n\nexport interface ProblemScore {\n mathproblem: number;\n questionTypeId: number;\n questionTypeString: string;\n score: Score;\n}\n\nexport type QuizTableAction = 'copy' | 'archive' | 'delete' | 'unarchive';\nexport type QuizTableItem =\n | SharedTeacherQuiz\n | FormattedQuizUnit\n | SharedStudentQuiz;\n\nexport type SearchableKeys = 'name';\n\nexport type ProblemAnswerState =\n | 'correct'\n | 'incorrect'\n | 'partially-correct'\n | 'unanswered';\n\nexport type QuizLocalState = {\n id: number;\n isLoading: boolean;\n isApiError: boolean;\n data: Quiz | null;\n originalData: Quiz | null;\n finished: boolean;\n results: QuizResult | null;\n instantFeedback: string | null;\n showAdvancedResults: boolean;\n};\n\n\n\nexport class QuizService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return 'https://api.iquiz.dk/api';\n case 'development':\n case 'local':\n case 'testing':\n return 'https://galecms.test.tibalo.dk/api';\n case 'test':\n return `https://localhost:3010/galeapi/api`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n \n private makeHeaders(extra?: Record<string, string>): Headers {\n const headers = new Headers();\n headers.append('Content-Type', 'application/json');\n\n if (extra) {\n for (const [key, val] of Object.entries(extra)) {\n headers.append(key, val);\n }\n }\n\n return headers;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Legacy Gale quizzes\n // ─────────────────────────────────────────────────────────────\n\n async checkActiveSession({\n isbn,\n quizNumber,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizNumber: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quizNumber}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async startQuiz({\n isbn,\n quiz,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quiz}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({ url, headers, body: '{}', timeout });\n return await res.json();\n }\n\n async getProblems({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async resetAnswer({\n isbn,\n quizUnitId,\n questionID,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n questionID: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}/question/${questionID}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async saveAnswer({\n isbn,\n quizUnitId,\n answer,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n answer: object;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SaveAnswerResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify(answer),\n timeout\n });\n\n return await res.json();\n }\n\n async finishQuiz({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/finish`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async getResults({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/result`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/overview/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Shared quizzes\n // ─────────────────────────────────────────────────────────────\n\n async createSharedQuiz({\n quizData,\n extraHeaders,\n timeout = 3000\n }: {\n quizData: SharedQuizData;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async copyEditSharedQuiz({\n quizSessionId,\n quizData,\n action,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizData: SharedQuizData;\n action: 'edit' | 'copy';\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = action === 'edit' ? 'PUT' : 'POST';\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PUT'\n ? await this.putAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n })\n : await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async getTeachersQuizProblems({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/problems`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersUnitOverview({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizUnitId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async activateDeactivateQuestion({\n quizSessionId,\n questionId,\n activate,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n questionId: number;\n activate: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quiz/${quizSessionId}/question/${questionId}`;\n const method = activate ? 'PATCH' : 'DELETE';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PATCH'\n ? await this.patchAsync({\n url,\n headers,\n body: null,\n timeout\n })\n : await this.deleteAsync({ url, headers, timeout });\n\n return await res.json();\n }\n\n async getTeachersQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ SharedQuizzes: SharedTeacherQuiz[] }> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getStudentsQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SharedStudentQuiz[]> {\n const url = `${this.getUrlPrefix()}/shared/student/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersQuiz({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizSession> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async toggleArchiveQuiz({\n quizSessionId,\n archive,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n archive: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = archive ? 'DELETE' : 'PATCH';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'DELETE'\n ? await this.deleteAsync({ url, headers, timeout })\n : await this.postAsync({\n url,\n headers,\n body: null,\n timeout\n });\n\n return await res.json();\n }\n\n async deleteSharedQuizUnit({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n quizUnitId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.deleteAsync({ url, headers, timeout });\n return await res.json();\n }\n}\n\nexport default QuizService;\n","import BaseService from './base_service.js';\n\nexport class WritingTaskService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://writingtask.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-writingtask.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/writingtask`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\nexport default WritingTaskService;\n","import BaseService from './base_service.js';\n\nexport class SolrProxyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://solr-proxy.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://solr-proxy-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/solrproxy`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default SolrProxyService;\n"],"mappings":"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","names":["SSMLSpeechSpeeds","HighlightResultType","Error","Error","uuidv4","ApiErrors"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/polly_service.ts","../src/services/cookie_consent_log.ts","../src/services/highlight_service.ts","../src/services/user_settings_base.ts","../src/services/user_settings_clientsettings.ts","../src/services/user_settings_bookmarks.ts","../src/services/user_settings_continue.ts","../src/services/user_settings_mru.ts","../src/services/pdf_generator.ts","../src/services/highlevel/tagging/user_folders.ts","../src/services/ai_bot_service.ts","../src/services/quiz_service.ts","../src/services/writing_task_service.ts","../src/services/solr_proxy_service.ts"],"sourcesContent":["// Fully implemented services\nexport * from 'services/tagging_service.js';\nexport * from 'services/polly_service.js';\nexport * from 'services/cookie_consent_log.js';\nexport * from 'services/highlight_service.js';\nexport * from 'services/user_settings_clientsettings.js';\nexport * from 'services/user_settings_bookmarks.js';\nexport * from 'services/user_settings_continue.js';\nexport * from 'services/user_settings_mru.js';\nexport * from 'services/pdf_generator.js';\nexport * from 'services/highlevel/tagging/user_folders.js';\nexport * from 'services/ai_bot_service.js';\nexport * from 'services/quiz_service.js';\n\n// Discovery only services\nexport * from 'services/writing_task_service.js'\nexport * from 'services/solr_proxy_service.js'\n","export class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment.toLowerCase();\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'GET';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async putAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PUT';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async postAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'POST';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async deleteAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'DELETE';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async patchAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PATCH';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n } \n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout,\n addAuthHeaders\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number,\n addAuthHeaders?: boolean,\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n if (addAuthHeaders) {\n headers = await this.addAuthHeaders(headers);\n }\n\n const response = await fetch(url, {\n method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\nexport interface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport interface TagOutput extends Tag {\n created_at: number;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-tagging.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/tagging`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByResource(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name?: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_resource/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_tag_name/${identity}/${tag_name}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return await response.json();\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async updateTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.putAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.deleteAsync({url, headers, timeout});\n await response.json();\n return\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport enum SSMLSpeechSpeeds {\n X_SLOW = 1,\n SLOW = 2,\n MEDIUM = 3,\n FAST = 4,\n X_FAST = 5,\n}\n\nexport type SpeechmarkEvent = {\n time: number;\n type?: string;\n value: string;\n start?: number;\n end?: number;\n}\n\nexport interface SynthesisResponse {\n mp3url: string;\n s3: string[];\n SpeechMarks?: SpeechmarkEvent[];\n}\n\nexport interface SynthesisRequest {\n text: string;\n includeSpeechMarks?: boolean;\n voice: number;\n speed?: SSMLSpeechSpeeds;\n}\n\nexport class PollyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://appear-polly.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-appear-polly.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/polly`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async synthesize(\n {\n body,\n timeout = 3000\n }:\n {\n body: SynthesisRequest,\n timeout?: number\n }\n ): Promise<SynthesisResponse> {\n const url = `${this.getUrlPrefix()}/synthesizeSpeech`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\n\nexport default PollyService;\n","import BaseService from './base_service.js';\n\nexport interface CookieConsentRequest {\n consentState: CookieConsentState;\n consentUrl: string;\n timeStamp: number;\n uuid: string;\n}\n\nexport interface CookieConsentState {\n func: number;\n stat: number;\n uuid: string;\n version: number;\n}\n\nexport interface CookieConsentResponse {\n response: string\n}\n\nexport class CookieConsentLog extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://cookieconsentlog.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-cookieconsentlog.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/cookieconsentlog`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async logCookieConsent(\n {\n body,\n timeout = 3000\n }:\n {\n body: CookieConsentRequest,\n timeout?: number\n }\n ): Promise<string> {\n const url = `${this.getUrlPrefix()}/log`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), addAuthHeaders: false, timeout});\n return response.text();\n }\n\n}\n\nexport default CookieConsentLog;\n","import BaseService from './base_service.js';\n\nexport enum HighlightResultType {\n 'highlight' = 'highlight',\n 'note' = 'note',\n}\n\nexport interface HighlightRanges {\n start: number|null;\n end: number|null;\n startOffset: number;\n endOffset: number;\n}\n\nexport interface Highlight extends HighlightUpdate {\n id: string;\n recreationdata?: IRecreationData;\n ranges?: HighlightRanges[];\n lang?: string;\n markedupText?: string;\n createdtstamp?: number;\n}\n\nexport interface HighlightRequest {\n breadCrumb: string;\n pageTitle: string;\n externalUserId?: string;\n highlight: Highlight;\n}\n\nexport interface HighlightSearchRequest {\n searchQuery: string;\n resultType?: HighlightResultType;\n isbn?: string;\n maxResults?: number;\n vectorMinConfidence?: number;\n vectorHighConfidence?: number;\n fulltextMinScore?: number;\n}\n\nexport interface HiglightSearchMatch {\n rangeKey: number;\n confidence: number;\n texttype: HighlightResultType;\n isbn: string;\n pid: number;\n returnedItem: number;\n}\n\nexport interface HighlightSearchResponse {\n Items: HighlightResponse[];\n Matches: HiglightSearchMatch[];\n}\n\nexport interface HighlightResponse extends HighlightRequest {\n debugHostname: string;\n uidIsbnPidMyAccountIdPartitionKey: string;\n timestampSortKey: number;\n timeToDie: number;\n pid: number;\n uid: string;\n myAccountid: string;\n commentText: string;\n quote: string;\n hlcolor: string;\n isbn: string;\n}\n\nexport interface HighlightUpdate {\n hlcolor: string;\n quote: string;\n text: string;\n}\n\nexport interface HighlightUpdateRequest {\n highlight: HighlightUpdate;\n}\n\nexport interface HighlightCountResponse {\n type: HighlightResultType;\n isbn: string;\n count: number;\n}\n\nexport interface HighlightDeleteResult extends HighlightUpdateResponse {\n changed: number;\n}\n\nexport interface HighlightAddResult extends HighlightUpdateResponse {\n timestampSortKey: number;\n}\n\nexport interface HighlightUpdateResponse {\n status: string;\n}\n\ninterface IBKNGData {\n prev20TextContent?: string | null;\n next20TextContent?: string;\n cid?: number;\n isPageNote?: boolean;\n domPath?: string;\n newElementPath?: string;\n elementPath?: string;\n prevNextTextContent?: {\n before: string | null;\n after: string;\n srcText: string | null;\n };\n}\n\nexport interface ICtype {\n SiblingsCount: string; // e.g. '15'\n classes: string; // e.g. 'csc-default csc-textpic'\n}\n\nexport interface ICtypeDict {\n [cid: string]: ICtype;\n}\n\nexport interface ITextStartEndObject {\n startSelectedText: string | undefined | null; // start of selection, text value\n endSelectedText: string | undefined; // end of selection, text value '150.000';\n}\n\nexport interface IRecreationData {\n startCID: number; // id of section start, e.g. 'c319'\n numberOfSiblingsOnStartNode?: number | undefined; // sibling count adjacent to the start node, e.g. '5'\n numberofPrevSiblingsOnCIDStartNode?: number | undefined; // e.g. '1';\n startCtypes?: ICtypeDict | null | undefined; // this was never used....\n\n endCID: number;\n numberOfSiblingsOnEndNode?: number | undefined;\n numberofPrevSiblingsOnCIDEndNode?: number | undefined;\n endCTypes?: ICtypeDict | null | undefined; // this was never used ....\n\n startSelectionInnerText?: string | null | undefined; // inner html (text) of the start node that was selected\n endSelectionInnerText?: string | null | undefined; // inner html (text) of the end node that was selected\n\n mathObject?: string | null | undefined; // e.g. '0'. who knows?\n\n selectedTextStartAndEndObject?: ITextStartEndObject | undefined; // not really used in the old client\n\n totalSiblingsToCIDs?: number | undefined; // e.g. '15'\n\n ibkngData?: IBKNGData | null | undefined;\n\n specialSelectedText?: string | undefined;\n source?: any | null | undefined;\n}\n\nexport class HighlightService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://highlights.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-highlights.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/highlight`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async search(\n {\n search,\n timeout = 3000\n }:\n {\n search: HighlightSearchRequest,\n timeout?: number\n }\n ): Promise<HighlightSearchResponse> {\n const url = `${this.getUrlPrefix()}/v2/search`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(search), timeout});\n return response.json();\n }\n\n async deleteHighlightOrNote(\n {\n isbn,\n pid,\n key,\n timeout = 3000\n }:\n {\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightDeleteResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.deleteAsync({url, headers, timeout});\n return response.json();\n }\n\n async getHighlightOrNote(\n {\n isbn,\n pid,\n timeout = 3000\n }:\n {\n isbn: string,\n pid?: number,\n timeout?: number\n }\n ): Promise<HighlightResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/isbn/${isbn}`;\n if (pid) {\n url += `/pid/${pid}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async getHighlightOrNoteCounts(\n {\n noteType,\n timeout = 3000\n }:\n {\n noteType?: HighlightResultType,\n timeout?: number\n }\n ): Promise<HighlightCountResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/count`;\n if (noteType) {\n url += `/${noteType}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async updateHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n key,\n timeout = 5000\n }:\n {\n payload: HighlightUpdateRequest,\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightUpdateResponse> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n\n async addHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n timeout = 5000\n }:\n {\n payload: HighlightRequest,\n isbn: string,\n pid: number,\n timeout?: number\n }\n ): Promise<HighlightAddResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n}\n\nexport default HighlightService;\n","import BaseService from './base_service.js';\n\nexport class UserSettingsBase extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'development':\n case 'testing':\n return `https://staging-user-settings-service.services.${this.baseDomain}`;\n case 'local':\n return `http://localhost:4000`;\n case 'test':\n return `https://localhost:3010/services/usersettingsservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default UserSettingsBase;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface ClientSettingsResponse {\n settings: ClientSettings;\n}\nexport interface ClientSettings {\n readabilities?: Readability;\n darkMode?: boolean;\n displayMode?: DisplayModeOption;\n enableKeyboardShortcuts?: boolean;\n showBookmarks?: boolean;\n showNoteHighlights?: boolean;\n featureGalleryVersion?: number;\n readAloudStore?: ReadAloudStore;\n leftDrawerWidth?: number;\n recentSearches?: string[];\n materialListImagesView?: LayoutView;\n frontPageSections?: FrontPageSection[];\n activePublicationFilters?: ActivePublicationFilters;\n cardsView?: LayoutView;\n cardsSorting?: SortOptions;\n foldersView?: LayoutView;\n foldersSorting?: SortOptions;\n onboardingPromptTime?: string;\n showOnboardingPrompt?: boolean;\n favoritesSorting?: SortOptions;\n}\n\nexport type DisplayModeOption = 'light' | 'dark' | 'system';\n\nexport type LayoutView = 'list' | 'grid';\n\nexport interface ActivePublicationFilters {\n educations?: string[];\n displaySubjects?: string[];\n categoriesNames?: string[];\n categoriesLevels?: string[];\n publishers?: string[];\n}\n\nexport interface Readability {\n letterSpacing?: number;\n lineHeight?: number;\n textSize?: number;\n fontFamily?: FontFamily;\n}\n\nexport interface FontFamily {\n name?: string;\n defaultSize?: string;\n url?: string;\n}\n\nexport interface ReadAloudStore {\n currentVoiceSelection?: CurrentVoiceSelection;\n currentSpeedSelection?: CurrentSpeedSelection;\n}\n\nexport interface CurrentSpeedSelection {\n speed?: number;\n text?: string;\n}\n\nexport interface CurrentVoiceSelection {\n voice?: number;\n gender?: number;\n language?: number;\n}\n\nexport interface FrontPageSection {\n changeable?: boolean;\n code?: string;\n enabled?: boolean;\n name?: string;\n position?: number;\n}\n\nexport type SortOptions = 'recent' | 'alphabetical';\n\n\nexport class UserSettingsClientSettings extends UserSettingsBase {\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {settings: {}} as ClientSettingsResponse;\n } else {\n throw HTTPError;\n }\n }\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: ClientSettings,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n return response.json();\n }\n\n async deleteSettings(\n {\n isbn,\n timeout = 5000\n }: \n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n}\n\nexport default UserSettingsClientSettings;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface Bookmark extends BookmarkUpdate {\n createdTimeStamp: number;\n isbn?: string;\n}\n\nexport interface BookmarkUpdate {\n pageId: number;\n contentId: number;\n}\n\nexport class UserSettingsBookmarks extends UserSettingsBase {\n async setBookmark(\n {\n isbn,\n bookmark,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n bookmark: BookmarkUpdate,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Bookmark> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(bookmark), timeout});\n return response.json();\n }\n\n async deleteBookmark(\n {\n isbn,\n pageId,\n contentId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n contentId: number,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}/page/${pageId}/content/${contentId}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getBookmark(\n {\n isbn,\n pageId,\n timeout = 5000\n }:\n {\n isbn?: string,\n pageId?: number,\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n if (!isbn && pageId) {\n throw new Error('The isbn parameter is required if pageId is provided.');\n }\n\n let url = `${this.getUrlPrefix()}/bookmark/`;\n if (isbn) {\n url += `isbn/${isbn}`;\n }\n\n if (pageId) {\n url += `/page/${pageId}`;\n }\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n // Favourites are bookmarks that are ISBN specific, with a pageId of 0.\n async getFavourite(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n let url = `${this.getUrlPrefix()}/bookmark/favourite`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsBookmarks;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface Continue extends ContinueUpdate {\n createdTimeStamp?: number;\n}\n\nexport interface ContinueUpdate {\n pageId: number;\n}\n\nexport class UserSettingsContinue extends UserSettingsBase {\n async setContinue(\n {\n isbn,\n pageId,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Continue> {\n\n const continueBody: ContinueUpdate = {\n pageId\n };\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(continueBody), timeout});\n return response.json();\n\n }\n\n async deleteContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<Continue> {\n let url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {} as Continue;\n } else {\n throw HTTPError;\n }\n }\n }\n\n}\n\nexport default UserSettingsContinue;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface MRU {\n isbn: string;\n link: string;\n title: string;\n}\n\nexport class UserSettingsMRU extends UserSettingsBase {\n async setMRU(\n {\n mru,\n externalUserId,\n timeout = 5000\n }:\n {\n mru: MRU,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<MRU[]> {\n\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(mru), timeout});\n return response.json();\n }\n\n async clearMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n\n async getMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<MRU[]> {\n let url = `${this.getUrlPrefix()}/mru`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsMRU;\n","import BaseService from './base_service.js';\n\nexport interface NoteHighlight {\n color: string;\n comment: string;\n selectedText: string;\n}\n\nexport interface Notes {\n created: string;\n highlight: NoteHighlight;\n link: string;\n pid: string;\n title: string;\n id: string;\n}\n\nexport interface NotesLabels {\n amountOfNotesProse: string;\n documentTitle: string;\n markedText: string;\n noContentLabel: string;\n noSelectedTextLabel: string;\n notesExportedAt: string;\n yourNote: string;\n}\n\nexport interface NotesData {\n labels: NotesLabels\n notes: Notes[]\n}\n\nexport interface NotesRequest {\n exportedDate: string;\n notesData: NotesData;\n userId: string;\n userName: string;\n}\n\nexport interface Response {\n status: string;\n url: string;\n}\n\nexport interface WritingTaskRequest {\n pdftitle: string;\n userId: string;\n userName: string;\n}\n\nexport interface WritingTaskData {\n createdData: string;\n exportedDateTimeString: string;\n header: string;\n headerStripped: string;\n host: string;\n isbn: string;\n publisher: string;\n siteTitle: string;\n userIdentity: string;\n writingTaskItems: WritingTaskItem[];\n}\n\nexport interface WritingTaskItem {\n answer: string;\n crdate: number;\n cruser_id: number;\n deleted: number;\n files: string[]|null;\n hidden: number;\n imageorient: number;\n parentid: number;\n parenttable: string;\n parsedAnswer: string;\n parsedQuestion: string;\n pid: number;\n question: string;\n sorting: number;\n title: string;\n tstamp: number;\n uid: number;\n userAnswered: boolean;\n}\n\nexport interface SiteMapLabels {\n pbook: string;\n toc: string;\n}\n\nexport interface SiteMapPageTreeItem {\n chapterInfo?: SiteMapPageTreeItem;\n characters: number;\n iPages: number;\n images: number;\n interactiveElements: number;\n lang: number;\n math: number;\n ogStandardPage: number;\n originalMaterial: number;\n quizzes: number;\n soundFiles: number;\n standardPage: number;\n sys_language_uid: number;\n uid: number;\n videos: number;\n words: number;\n}\n\nexport interface SiteMapPage {\n children: SiteMapPage[];\n accessGranted: boolean;\n author: null|string;\n description: null|string;\n doktype: number;\n editor: null|string;\n fe_group: string;\n keywords: null|string;\n link: string;\n nav_hide: number;\n nav_title: string;\n pid: number;\n title: string;\n uid: number;\n}\n\nexport type SiteMapPageTreeData = Record<string, SiteMapPageTreeItem>;\n\nexport interface SiteMapContent {\n labels: SiteMapLabels,\n pageTreeData: SiteMapPageTreeData,\n pages: SiteMapPage[]\n}\n\nexport interface SiteMapRequest {\n baseUrl: string;\n content: SiteMapContent,\n exportedDate: string;\n isbn: string;\n siteTitle: string;\n userId: string;\n userName: string;\n}\n\nexport class PdfGeneratorService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://pdfgenerator.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-pdfgenerator.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/pdfgenerator`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async pdfFromSiteMap(\n {\n body,\n timeout = 3000\n }:\n {\n body: SiteMapRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/sitemap`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromWritingTask(\n {\n body,\n timeout = 3000\n }:\n {\n body: WritingTaskRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/writingTask`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromNotes(\n {\n body,\n timeout = 3000\n }:\n {\n body: NotesRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/notes`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\nexport default PdfGeneratorService;","import TaggingService from '../../tagging_service.js';\nimport {v4 as uuidv4} from 'uuid';\n\nexport interface FolderObject {\n created_at: number;\n}\n\nexport interface Folder extends FolderObject {\n name: string;\n color: string;\n uuid: string;\n parent?: string;\n}\n\nexport interface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder properties are stored as a base64 encoded JSON string.\n**/\nexport class UserFolders extends TaggingService {\n private readonly hasNoParent: string = '-';\n private identity?: string = undefined;\n\n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n /**\n * Create a folder.\n * @param folder_name The name of the folder.\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param color The color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n color,\n timeout = 3000\n }:\n {\n folder_name: string,\n color: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const folder_payload = JSON.stringify({\"folder\": folder_name, \"color\": color});\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: uuidv4(),\n tag_name: parent_folder_uuid ?? this.hasNoParent,\n tag_value: Buffer.from(folder_payload).toString('base64'),\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid, created_at: tag['created_at']} as Folder;\n }\n\n /**\n * Update a folder. Only name and color can be changed.\n *\n * @param folder_uuid The UUID of the folder.\n * @param folder_name The new name of the folder.\n * @param color The new color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async updateFolder(\n {\n folder_uuid,\n folder_name,\n color,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n folder_name?: string,\n color?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n\n if (tags.length === 0) {\n throw new Error(`Folder with UUID ${folder_uuid} not found`);\n }\n\n const tag = tags[0];\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n const new_folder_name = folder_name ?? folder_payload['folder'];\n const new_color = color ?? folder_payload['color'];\n\n const new_folder_payload = JSON.stringify({\"folder\": new_folder_name, \"color\": new_color});\n\n const updatedTag = await this.updateTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n tag_name: tag['tag_name'],\n tag_value: Buffer.from(new_folder_payload).toString('base64'),\n },\n timeout\n }\n );\n\n const parent = tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'];\n return {name: new_folder_name, uuid: folder_uuid, parent: parent, created_at: updatedTag['created_at']} as Folder;\n }\n\n /**\n * List all folders in the user's account.\n * \n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<Folder[]> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the next level of folders in the user's account.\n *\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listNextFolderLevel(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (!parent_folder_uuid) {\n parent_folder_uuid = this.hasNoParent;\n }\n\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_name: parent_folder_uuid,\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the content of a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n* @return (Folder | FolderContent)[]\n **/\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<(Folder|FolderContent)[]> {\n let tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n tag_name: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n content.push({\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'],\n created_at: tag['created_at']\n } as Folder)\n } else {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_name'],\n created_at: tag['created_at']\n } as FolderContent\n );\n }\n }\n\n return content;\n }\n\n /**\n * Add a book to a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Remove a book from a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeInternetbookFromFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.removeContentFromFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Create a new folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_type,\n resource_name,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n tag_value: 'MYACCOUNT_USER_FOLDER'\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid, created_at: tag['created_at']} as FolderContent;\n }\n\n /**\n * Remove a folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeContentFromFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete all folders. Note, this will not delete the content of the folders.\n *\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n","import BaseService from './base_service.js';\n\nexport type AIChatRole = \"user\" | \"assistant\" | \"system\";\n\ntype GenericContext = Record<string, unknown>;\n\nexport interface AIChatMessage<\n ContextType extends GenericContext = GenericContext,\n> {\n role: AIChatRole;\n content: string;\n context?: ContextType;\n}\n\nexport interface AIChatMessageDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n role?: AIChatRole;\n content?: string;\n context?: ContextType;\n}\n\nexport interface AIChatCompletion<\n ContextType extends GenericContext = GenericContext,\n> {\n message: AIChatMessage;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n delta: AIChatMessageDelta;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionOptions<\n ContextType extends GenericContext = GenericContext,\n> {\n context?: ContextType;\n sessionState?: unknown;\n}\n\nexport type AIChatCompletionRequest = {\n messages: AIChatMessage[];\n} & AIChatCompletionOptions;\n\n\nexport class AIBotService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://ai-bot-service.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://ai-bot-service-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/aibotservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async constructChatUrl (\n {\n interactivityId,\n isbn,\n stream\n }:\n {\n interactivityId?: string,\n isbn?: string,\n stream: boolean\n }\n ): Promise<string> {\n if (interactivityId && isbn) \n {\n throw new Error(\"interactivityId and isbn are mutually exclusive\");\n }\n\n if (!interactivityId && !isbn) \n {\n throw new Error(\"Either interactivityId or isbn must be provided\");\n }\n\n let url = '';\n if (interactivityId) \n {\n url = `${this.getUrlPrefix()}/${interactivityId}/chat`;\n }\n\n if (isbn) \n {\n url = `${this.getUrlPrefix()}/interactivity_from_isbn/${isbn}`;\n }\n\n if (stream) {\n url += '/stream';\n }\n\n return url;\n }\n\n async chat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<AIChatCompletion> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: false});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async streamingChat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: true});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n const responseBody = response.body;\n if (!responseBody)\n {\n throw new Error(\"Response body is null\");\n }\n return responseBody;\n }\n}\n\nexport default AIBotService;\n","import BaseService from './base_service.js';\n\nexport interface QuizStartResponse {\n quizUnitId: number;\n}\n\nexport interface Quiz {\n quizId: number;\n quizName: string;\n quizDescription: string;\n quizFinished: boolean;\n questions: Question[];\n quizDeadline?: number;\n quizResultAvailable?: number;\n quizStartTime?: number;\n}\n\nexport interface Question {\n questionId: number;\n name: string;\n introText: string;\n caseSensitive?: boolean;\n shuffle: boolean;\n answerChecked: boolean;\n questionType: string;\n questionTypeId: number;\n mediafile: Mediafile;\n medias: Mediafile[];\n answers: Answer[];\n chosenAnswer: ChosenAnswer[] | null;\n description: string;\n freeText: string;\n scores?: Score;\n answerBins: {\n binindex: number;\n img: Mediafile;\n txt: string;\n }[];\n tokenized: Tokens[];\n 'chosenAnswer correctness': string;\n}\n\nexport interface FormattedQuestion extends Question {\n number: number;\n answerTime?: string | null;\n percentage: string;\n}\n\nexport interface Mediafile {\n id: number;\n placement: string;\n caption: string;\n altText: string;\n identifier: string;\n extension: string;\n mimeType: string;\n credit: string;\n}\n\nexport interface ChosenAnswer {\n id: number | number[];\n answerText: string;\n created?: number;\n position: number;\n mediafile: Mediafile;\n bins?: number[];\n bin?: number;\n answers?: Answer[];\n answerBins?: AnswerBins[];\n questionId: number;\n isCorrect: boolean;\n wordoption?: AnswerIcon;\n}\n\nexport interface AnswerBins {\n txt: string;\n binindex: number;\n img: Mediafile;\n}\n\nexport interface Answer {\n id: number | number[];\n answerText: string;\n isCorrect: boolean;\n position: number | number[];\n mediafile?: Mediafile;\n bins?: number[];\n inputText?: {\n [key: string]: InputText;\n };\n dropdown?: DropdownMap;\n tableData?: TableData;\n wordoptions?: WordOptions;\n wordoption?: AnswerIcon;\n answerOptions?: AnswerIcon[];\n questionId?: number;\n answerBins?: AnswerBins[];\n index?: number;\n}\n\nexport interface WordOptions {\n options: WordOptionsOption[];\n answerOptions?: string[] | AnswerIcon[];\n}\n\nexport interface WordOptionsOption {\n words: string;\n answers: string;\n position: number;\n}\n\nexport interface AnswerIcon {\n abbreviation: string;\n icon: string;\n description: string;\n display: string;\n}\n\nexport interface InputText {\n answerText: string;\n bins: number[];\n id?: number;\n correctText: string;\n isCorrect: boolean;\n position: number;\n index?: number;\n maxCorrectValue?: number;\n minCorrectValue?: number;\n}\n\nexport interface InputTextMap {\n [key: string]: InputText;\n}\n\nexport interface DropdownMap {\n [key: string]: Dropdown[];\n}\n\nexport interface Dropdown {\n option: string;\n isCorrect: boolean;\n position?: number;\n index?: number;\n}\n\nexport interface DropdownFormattedOption {\n answerId: number;\n options: Dropdown[];\n originalOptions: Dropdown[];\n}\n\nexport interface TableData {\n [key: string]: {\n [key: string]: TableDataColumn | string;\n };\n}\n\nexport interface TableDataColumn {\n correctText: string;\n isCorrect: boolean;\n position: number;\n options: Dropdown[];\n minCorrectValue?: number;\n maxCorrectValue?: number;\n}\n\nexport interface QuizResult {\n Problemdata: Question[];\n QuizSession?: {\n closesAt: string | null;\n description: string;\n name: string;\n opensAt: string | null;\n problems: number;\n quizSessionId: number;\n };\n QuizUnit?: {\n averageScore: number;\n finished: boolean;\n finishedAt: number | null;\n quizUnitId: number;\n startedAt: number | null;\n studentEkeysId: string;\n studentId: number;\n timeSpent: number;\n };\n Results: Results;\n}\n\nexport interface Results {\n 'Number of correct': number;\n 'Number of incorrect': number;\n 'Number of not answered': number;\n 'Number of partially correct': number;\n 'Number of questions': number;\n unitScore: CalculatedScore;\n}\n\nexport interface Score {\n 'Number of correct options': number;\n 'Number of correct options chosen': number;\n 'Number of options': number;\n 'Number of options chosen': number;\n 'Percentage score': number;\n 'Student has answered'?: boolean;\n 'Token check': Tokens[];\n}\n\nexport interface WordOptionsAnswer {\n answerId?: number;\n options?: (string | AnswerIcon)[];\n text: WordOptionsAnswerText | undefined;\n index: number;\n selected?: undefined | string | AnswerIcon;\n}\n\nexport interface WordOptionsAnswerText {\n answers: string;\n words: string;\n position: number;\n}\n\nexport interface Tokens {\n correctText: string;\n diffCheck: TokensDiffCheck[];\n numberOfTokenErrors: number;\n studentAnswerText: string;\n}\n\nexport interface TokensDiffCheck {\n error: boolean;\n studentWord: string;\n correctWord: string;\n}\n\nexport interface NewAnswer {\n answerText: string;\n bins: number[];\n id: number;\n isCorrect: boolean;\n position: number;\n questionId: number;\n}\n\nexport interface SaveAnswerResponse {\n Result: string;\n}\n\nexport interface SaveAnswer {\n 'question-id': number;\n 'question-type-id': number;\n 'answer-id'?: number[];\n 'answer-text'?: (string | { answers: string } | null)[];\n 'answer-position'?: number[];\n 'answer-bin'?: number[];\n 'answer-checked'?: boolean;\n}\n\nexport type QuizTextSettings = Record<string, string | number>;\n\nexport interface SharedQuizData {\n 'quiz-id'?: string | undefined;\n isbn?: string | undefined;\n title: string;\n description: string;\n 'quiz-open': number | null;\n 'quiz-close': number | null;\n 'result-available-time'?: number | null;\n 'extra-teachers': string[];\n}\n\nexport interface SharedTeacherQuiz {\n createdAt?: number;\n deactivatedProblems?: number[];\n extraTeachers?: string[];\n isArchived?: boolean;\n isExtraTeacher?: boolean;\n isPinned?: boolean;\n name?: string;\n problems: number;\n quizSessionId?: number;\n studentsFinished?: number;\n}\n\nexport interface SharedStudentQuiz {\n quizUnitId: number;\n quizSessionId: number;\n name: string;\n createdBy: string;\n startedAt: number | null;\n finishedAt: number | null;\n finished: boolean;\n}\n\nexport interface CalculatedScore {\n points: number;\n maxPoints: number;\n percentage: number;\n}\n\nexport interface QuizSession extends SharedTeacherQuiz {\n description?: string;\n opensAt: number | null;\n closesAt: number | null;\n quizUnits?: QuizUnit[];\n averageScores?: {\n byProblem: CalculatedScore[];\n overall: CalculatedScore;\n };\n}\n\nexport interface QuizUnit {\n quizUnitId: number;\n studentId: number;\n studentEkeysId: string;\n finished: boolean;\n finishedAt: number | null;\n startedAt: number | null;\n timeSpent: TimeSpent;\n unitScore: CalculatedScore;\n problemScores: ProblemScore[];\n}\n\nexport interface TimeSpent {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface FormattedQuizUnit extends QuizUnit {\n formattedTimeSpent?: string;\n formattedFinishedAt?: string | null;\n formattedStartedAt?: string | null;\n percentage?: string;\n total?: string;\n}\n\nexport interface ProblemScore {\n mathproblem: number;\n questionTypeId: number;\n questionTypeString: string;\n score: Score;\n}\n\nexport type QuizTableAction = 'copy' | 'archive' | 'delete' | 'unarchive';\nexport type QuizTableItem =\n | SharedTeacherQuiz\n | FormattedQuizUnit\n | SharedStudentQuiz;\n\nexport type SearchableKeys = 'name';\n\nexport type ProblemAnswerState =\n | 'correct'\n | 'incorrect'\n | 'partially-correct'\n | 'unanswered';\n\nexport type QuizLocalState = {\n id: number;\n isLoading: boolean;\n isApiError: boolean;\n data: Quiz | null;\n originalData: Quiz | null;\n finished: boolean;\n results: QuizResult | null;\n instantFeedback: string | null;\n showAdvancedResults: boolean;\n};\n\n\n\nexport class QuizService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return 'https://api.iquiz.dk/api';\n case 'development':\n case 'local':\n case 'testing':\n return 'https://galecms.test.tibalo.dk/api';\n case 'test':\n return `https://localhost:3010/galeapi/api`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n \n private makeHeaders(extra?: Record<string, string>): Headers {\n const headers = new Headers();\n headers.append('Content-Type', 'application/json');\n\n if (extra) {\n for (const [key, val] of Object.entries(extra)) {\n headers.append(key, val);\n }\n }\n\n return headers;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Legacy Gale quizzes\n // ─────────────────────────────────────────────────────────────\n\n async checkActiveSession({\n isbn,\n quiz,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async startQuiz({\n isbn,\n quiz,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quiz}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({ url, headers, body: '{}', timeout });\n return await res.json();\n }\n\n async getProblems({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async resetAnswer({\n isbn,\n quizUnitId,\n questionID,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n questionID: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}/question/${questionID}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async saveAnswer({\n isbn,\n quizUnitId,\n answer,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n answer: object;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SaveAnswerResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify(answer),\n timeout\n });\n\n return await res.json();\n }\n\n async finishQuiz({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/finish`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async getResults({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/result`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/overview/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Shared quizzes\n // ─────────────────────────────────────────────────────────────\n\n async createSharedQuiz({\n quizData,\n extraHeaders,\n timeout = 3000\n }: {\n quizData: SharedQuizData;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async copyEditSharedQuiz({\n quizSessionId,\n quizData,\n action,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizData: SharedQuizData;\n action: 'edit' | 'copy';\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = action === 'edit' ? 'PUT' : 'POST';\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PUT'\n ? await this.putAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n })\n : await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async getTeachersQuizProblems({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/problems`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersUnitOverview({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizUnitId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async activateDeactivateQuestion({\n quizSessionId,\n questionId,\n activate,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n questionId: number;\n activate: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quiz/${quizSessionId}/question/${questionId}`;\n const method = activate ? 'PATCH' : 'DELETE';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PATCH'\n ? await this.patchAsync({\n url,\n headers,\n body: null,\n timeout\n })\n : await this.deleteAsync({ url, headers, timeout });\n\n return await res.json();\n }\n\n async getTeachersQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ SharedQuizzes: SharedTeacherQuiz[] }> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getStudentsQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SharedStudentQuiz[]> {\n const url = `${this.getUrlPrefix()}/shared/student/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersQuiz({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizSession> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async toggleArchiveQuiz({\n quizSessionId,\n archive,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n archive: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = archive ? 'DELETE' : 'PATCH';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'DELETE'\n ? await this.deleteAsync({ url, headers, timeout })\n : await this.postAsync({\n url,\n headers,\n body: null,\n timeout\n });\n\n return await res.json();\n }\n\n async deleteSharedQuizUnit({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n quizUnitId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.deleteAsync({ url, headers, timeout });\n return await res.json();\n }\n}\n\nexport default QuizService;\n","import BaseService from './base_service.js';\n\nexport class WritingTaskService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://writingtask.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-writingtask.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/writingtask`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\nexport default WritingTaskService;\n","import BaseService from './base_service.js';\n\nexport class SolrProxyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://solr-proxy.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://solr-proxy-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/solrproxy`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default SolrProxyService;\n"],"mappings":"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","names":["SSMLSpeechSpeeds","HighlightResultType","Error","Error","uuidv4"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -840,22 +840,9 @@ declare class AIBotService extends BaseService {
|
|
|
840
840
|
}): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>>;
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
-
declare enum ApiErrors {
|
|
844
|
-
OVERVIEW_NOT_FOUND = "Quiz overview not found",
|
|
845
|
-
NOT_FOUND = "Quiz not found",
|
|
846
|
-
ARCHIVED = "This shared quiz session is archived",
|
|
847
|
-
GALE_USER_DATA_CLIENT_ERROR = "Failed to fetch Gale user data: Client error"
|
|
848
|
-
}
|
|
849
843
|
interface QuizStartResponse {
|
|
850
844
|
quizUnitId: number;
|
|
851
845
|
}
|
|
852
|
-
interface QuizApiError {
|
|
853
|
-
response: {
|
|
854
|
-
_data: {
|
|
855
|
-
Error: ApiErrors;
|
|
856
|
-
};
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
846
|
interface Quiz {
|
|
860
847
|
quizId: number;
|
|
861
848
|
quizName: string;
|
|
@@ -941,6 +928,7 @@ interface Answer {
|
|
|
941
928
|
answerOptions?: AnswerIcon[];
|
|
942
929
|
questionId?: number;
|
|
943
930
|
answerBins?: AnswerBins[];
|
|
931
|
+
index?: number;
|
|
944
932
|
}
|
|
945
933
|
interface WordOptions {
|
|
946
934
|
options: WordOptionsOption[];
|
|
@@ -978,10 +966,12 @@ interface Dropdown {
|
|
|
978
966
|
option: string;
|
|
979
967
|
isCorrect: boolean;
|
|
980
968
|
position?: number;
|
|
969
|
+
index?: number;
|
|
981
970
|
}
|
|
982
971
|
interface DropdownFormattedOption {
|
|
983
972
|
answerId: number;
|
|
984
973
|
options: Dropdown[];
|
|
974
|
+
originalOptions: Dropdown[];
|
|
985
975
|
}
|
|
986
976
|
interface TableData {
|
|
987
977
|
[key: string]: {
|
|
@@ -1175,9 +1165,9 @@ type QuizLocalState = {
|
|
|
1175
1165
|
declare class QuizService extends BaseService {
|
|
1176
1166
|
discoverUrlPrefix(): string;
|
|
1177
1167
|
private makeHeaders;
|
|
1178
|
-
checkActiveSession({ isbn,
|
|
1168
|
+
checkActiveSession({ isbn, quiz, extraHeaders, timeout }: {
|
|
1179
1169
|
isbn: string;
|
|
1180
|
-
|
|
1170
|
+
quiz: number;
|
|
1181
1171
|
extraHeaders?: Record<string, string>;
|
|
1182
1172
|
timeout?: number;
|
|
1183
1173
|
}): Promise<QuizStartResponse>;
|
|
@@ -1295,4 +1285,4 @@ declare class SolrProxyService extends BaseService {
|
|
|
1295
1285
|
discoverUrlPrefix(): string;
|
|
1296
1286
|
}
|
|
1297
1287
|
|
|
1298
|
-
export { AIBotService, type AIChatCompletion, type AIChatCompletionDelta, type AIChatCompletionOptions, type AIChatCompletionRequest, type AIChatMessage, type AIChatMessageDelta, type AIChatRole, type ActivePublicationFilters, type Answer, type AnswerBins, type AnswerIcon,
|
|
1288
|
+
export { AIBotService, type AIChatCompletion, type AIChatCompletionDelta, type AIChatCompletionOptions, type AIChatCompletionRequest, type AIChatMessage, type AIChatMessageDelta, type AIChatRole, type ActivePublicationFilters, type Answer, type AnswerBins, type AnswerIcon, type Bookmark, type BookmarkUpdate, type CalculatedScore, type ChosenAnswer, type ClientSettings, type ClientSettingsResponse, type Continue, type ContinueUpdate, CookieConsentLog, type CookieConsentRequest, type CookieConsentResponse, type CookieConsentState, type CurrentSpeedSelection, type CurrentVoiceSelection, type DisplayModeOption, type Dropdown, type DropdownFormattedOption, type DropdownMap, type Folder, type FolderContent, type FolderObject, type FontFamily, type FormattedQuestion, type FormattedQuizUnit, type FrontPageSection, type Highlight, type HighlightAddResult, type HighlightCountResponse, type HighlightDeleteResult, type HighlightRanges, type HighlightRequest, type HighlightResponse, HighlightResultType, type HighlightSearchRequest, type HighlightSearchResponse, HighlightService, type HighlightUpdate, type HighlightUpdateRequest, type HighlightUpdateResponse, type HiglightSearchMatch, type ICtype, type ICtypeDict, type IRecreationData, type ITextStartEndObject, type InputText, type InputTextMap, type LayoutView, type MRU, type Mediafile, type NewAnswer, type NoteHighlight, type Notes, type NotesData, type NotesLabels, type NotesRequest, PdfGeneratorService, PollyService, type ProblemAnswerState, type ProblemScore, type Question, type Quiz, type QuizLocalState, type QuizResult, QuizService, type QuizSession, type QuizStartResponse, type QuizTableAction, type QuizTableItem, type QuizTextSettings, type QuizUnit, type ReadAloudStore, type Readability, type Response$1 as Response, type Results, SSMLSpeechSpeeds, type SaveAnswer, type SaveAnswerResponse, type Score, type SearchableKeys, type SharedQuizData, type SharedStudentQuiz, type SharedTeacherQuiz, type SiteMapContent, type SiteMapLabels, type SiteMapPage, type SiteMapPageTreeData, type SiteMapPageTreeItem, type SiteMapRequest, SolrProxyService, type SortOptions, type SpeechmarkEvent, type SynthesisRequest, type SynthesisResponse, type TableData, type TableDataColumn, type Tag, type TagOutput, TaggingService, type TimeSpent, type Tokens, type TokensDiffCheck, UserFolders, UserSettingsBookmarks, UserSettingsClientSettings, UserSettingsContinue, UserSettingsMRU, type WordOptions, type WordOptionsAnswer, type WordOptionsAnswerText, type WordOptionsOption, type WritingTaskData, type WritingTaskItem, type WritingTaskRequest, WritingTaskService };
|
package/dist/index.d.ts
CHANGED
|
@@ -840,22 +840,9 @@ declare class AIBotService extends BaseService {
|
|
|
840
840
|
}): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>>;
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
-
declare enum ApiErrors {
|
|
844
|
-
OVERVIEW_NOT_FOUND = "Quiz overview not found",
|
|
845
|
-
NOT_FOUND = "Quiz not found",
|
|
846
|
-
ARCHIVED = "This shared quiz session is archived",
|
|
847
|
-
GALE_USER_DATA_CLIENT_ERROR = "Failed to fetch Gale user data: Client error"
|
|
848
|
-
}
|
|
849
843
|
interface QuizStartResponse {
|
|
850
844
|
quizUnitId: number;
|
|
851
845
|
}
|
|
852
|
-
interface QuizApiError {
|
|
853
|
-
response: {
|
|
854
|
-
_data: {
|
|
855
|
-
Error: ApiErrors;
|
|
856
|
-
};
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
846
|
interface Quiz {
|
|
860
847
|
quizId: number;
|
|
861
848
|
quizName: string;
|
|
@@ -941,6 +928,7 @@ interface Answer {
|
|
|
941
928
|
answerOptions?: AnswerIcon[];
|
|
942
929
|
questionId?: number;
|
|
943
930
|
answerBins?: AnswerBins[];
|
|
931
|
+
index?: number;
|
|
944
932
|
}
|
|
945
933
|
interface WordOptions {
|
|
946
934
|
options: WordOptionsOption[];
|
|
@@ -978,10 +966,12 @@ interface Dropdown {
|
|
|
978
966
|
option: string;
|
|
979
967
|
isCorrect: boolean;
|
|
980
968
|
position?: number;
|
|
969
|
+
index?: number;
|
|
981
970
|
}
|
|
982
971
|
interface DropdownFormattedOption {
|
|
983
972
|
answerId: number;
|
|
984
973
|
options: Dropdown[];
|
|
974
|
+
originalOptions: Dropdown[];
|
|
985
975
|
}
|
|
986
976
|
interface TableData {
|
|
987
977
|
[key: string]: {
|
|
@@ -1175,9 +1165,9 @@ type QuizLocalState = {
|
|
|
1175
1165
|
declare class QuizService extends BaseService {
|
|
1176
1166
|
discoverUrlPrefix(): string;
|
|
1177
1167
|
private makeHeaders;
|
|
1178
|
-
checkActiveSession({ isbn,
|
|
1168
|
+
checkActiveSession({ isbn, quiz, extraHeaders, timeout }: {
|
|
1179
1169
|
isbn: string;
|
|
1180
|
-
|
|
1170
|
+
quiz: number;
|
|
1181
1171
|
extraHeaders?: Record<string, string>;
|
|
1182
1172
|
timeout?: number;
|
|
1183
1173
|
}): Promise<QuizStartResponse>;
|
|
@@ -1295,4 +1285,4 @@ declare class SolrProxyService extends BaseService {
|
|
|
1295
1285
|
discoverUrlPrefix(): string;
|
|
1296
1286
|
}
|
|
1297
1287
|
|
|
1298
|
-
export { AIBotService, type AIChatCompletion, type AIChatCompletionDelta, type AIChatCompletionOptions, type AIChatCompletionRequest, type AIChatMessage, type AIChatMessageDelta, type AIChatRole, type ActivePublicationFilters, type Answer, type AnswerBins, type AnswerIcon,
|
|
1288
|
+
export { AIBotService, type AIChatCompletion, type AIChatCompletionDelta, type AIChatCompletionOptions, type AIChatCompletionRequest, type AIChatMessage, type AIChatMessageDelta, type AIChatRole, type ActivePublicationFilters, type Answer, type AnswerBins, type AnswerIcon, type Bookmark, type BookmarkUpdate, type CalculatedScore, type ChosenAnswer, type ClientSettings, type ClientSettingsResponse, type Continue, type ContinueUpdate, CookieConsentLog, type CookieConsentRequest, type CookieConsentResponse, type CookieConsentState, type CurrentSpeedSelection, type CurrentVoiceSelection, type DisplayModeOption, type Dropdown, type DropdownFormattedOption, type DropdownMap, type Folder, type FolderContent, type FolderObject, type FontFamily, type FormattedQuestion, type FormattedQuizUnit, type FrontPageSection, type Highlight, type HighlightAddResult, type HighlightCountResponse, type HighlightDeleteResult, type HighlightRanges, type HighlightRequest, type HighlightResponse, HighlightResultType, type HighlightSearchRequest, type HighlightSearchResponse, HighlightService, type HighlightUpdate, type HighlightUpdateRequest, type HighlightUpdateResponse, type HiglightSearchMatch, type ICtype, type ICtypeDict, type IRecreationData, type ITextStartEndObject, type InputText, type InputTextMap, type LayoutView, type MRU, type Mediafile, type NewAnswer, type NoteHighlight, type Notes, type NotesData, type NotesLabels, type NotesRequest, PdfGeneratorService, PollyService, type ProblemAnswerState, type ProblemScore, type Question, type Quiz, type QuizLocalState, type QuizResult, QuizService, type QuizSession, type QuizStartResponse, type QuizTableAction, type QuizTableItem, type QuizTextSettings, type QuizUnit, type ReadAloudStore, type Readability, type Response$1 as Response, type Results, SSMLSpeechSpeeds, type SaveAnswer, type SaveAnswerResponse, type Score, type SearchableKeys, type SharedQuizData, type SharedStudentQuiz, type SharedTeacherQuiz, type SiteMapContent, type SiteMapLabels, type SiteMapPage, type SiteMapPageTreeData, type SiteMapPageTreeItem, type SiteMapRequest, SolrProxyService, type SortOptions, type SpeechmarkEvent, type SynthesisRequest, type SynthesisResponse, type TableData, type TableDataColumn, type Tag, type TagOutput, TaggingService, type TimeSpent, type Tokens, type TokensDiffCheck, UserFolders, UserSettingsBookmarks, UserSettingsClientSettings, UserSettingsContinue, UserSettingsMRU, type WordOptions, type WordOptionsAnswer, type WordOptionsAnswerText, type WordOptionsOption, type WritingTaskData, type WritingTaskItem, type WritingTaskRequest, WritingTaskService };
|
package/dist/index.js
CHANGED
|
@@ -1033,13 +1033,6 @@ var AIBotService = class extends base_service_default {
|
|
|
1033
1033
|
};
|
|
1034
1034
|
|
|
1035
1035
|
// src/services/quiz_service.ts
|
|
1036
|
-
var ApiErrors = /* @__PURE__ */ ((ApiErrors2) => {
|
|
1037
|
-
ApiErrors2["OVERVIEW_NOT_FOUND"] = "Quiz overview not found";
|
|
1038
|
-
ApiErrors2["NOT_FOUND"] = "Quiz not found";
|
|
1039
|
-
ApiErrors2["ARCHIVED"] = "This shared quiz session is archived";
|
|
1040
|
-
ApiErrors2["GALE_USER_DATA_CLIENT_ERROR"] = "Failed to fetch Gale user data: Client error";
|
|
1041
|
-
return ApiErrors2;
|
|
1042
|
-
})(ApiErrors || {});
|
|
1043
1036
|
var QuizService = class extends base_service_default {
|
|
1044
1037
|
discoverUrlPrefix() {
|
|
1045
1038
|
switch (this.environment) {
|
|
@@ -1070,11 +1063,11 @@ var QuizService = class extends base_service_default {
|
|
|
1070
1063
|
// ─────────────────────────────────────────────────────────────
|
|
1071
1064
|
async checkActiveSession({
|
|
1072
1065
|
isbn,
|
|
1073
|
-
|
|
1066
|
+
quiz,
|
|
1074
1067
|
extraHeaders,
|
|
1075
1068
|
timeout = 3e3
|
|
1076
1069
|
}) {
|
|
1077
|
-
const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${
|
|
1070
|
+
const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;
|
|
1078
1071
|
const headers = this.makeHeaders(extraHeaders);
|
|
1079
1072
|
const res = await this.getAsync({ url, headers, timeout });
|
|
1080
1073
|
return await res.json();
|
|
@@ -1342,7 +1335,6 @@ var SolrProxyService = class extends base_service_default {
|
|
|
1342
1335
|
};
|
|
1343
1336
|
export {
|
|
1344
1337
|
AIBotService,
|
|
1345
|
-
ApiErrors,
|
|
1346
1338
|
CookieConsentLog,
|
|
1347
1339
|
HighlightResultType,
|
|
1348
1340
|
HighlightService,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/polly_service.ts","../src/services/cookie_consent_log.ts","../src/services/highlight_service.ts","../src/services/user_settings_base.ts","../src/services/user_settings_clientsettings.ts","../src/services/user_settings_bookmarks.ts","../src/services/user_settings_continue.ts","../src/services/user_settings_mru.ts","../src/services/pdf_generator.ts","../src/services/highlevel/tagging/user_folders.ts","../src/services/ai_bot_service.ts","../src/services/quiz_service.ts","../src/services/writing_task_service.ts","../src/services/solr_proxy_service.ts"],"sourcesContent":["export class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment.toLowerCase();\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'GET';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async putAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PUT';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async postAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'POST';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async deleteAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'DELETE';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async patchAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PATCH';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n } \n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout,\n addAuthHeaders\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number,\n addAuthHeaders?: boolean,\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n if (addAuthHeaders) {\n headers = await this.addAuthHeaders(headers);\n }\n\n const response = await fetch(url, {\n method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\nexport interface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport interface TagOutput extends Tag {\n created_at: number;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-tagging.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/tagging`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByResource(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name?: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_resource/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_tag_name/${identity}/${tag_name}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return await response.json();\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async updateTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.putAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.deleteAsync({url, headers, timeout});\n await response.json();\n return\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport enum SSMLSpeechSpeeds {\n X_SLOW = 1,\n SLOW = 2,\n MEDIUM = 3,\n FAST = 4,\n X_FAST = 5,\n}\n\nexport type SpeechmarkEvent = {\n time: number;\n type?: string;\n value: string;\n start?: number;\n end?: number;\n}\n\nexport interface SynthesisResponse {\n mp3url: string;\n s3: string[];\n SpeechMarks?: SpeechmarkEvent[];\n}\n\nexport interface SynthesisRequest {\n text: string;\n includeSpeechMarks?: boolean;\n voice: number;\n speed?: SSMLSpeechSpeeds;\n}\n\nexport class PollyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://appear-polly.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-appear-polly.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/polly`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async synthesize(\n {\n body,\n timeout = 3000\n }:\n {\n body: SynthesisRequest,\n timeout?: number\n }\n ): Promise<SynthesisResponse> {\n const url = `${this.getUrlPrefix()}/synthesizeSpeech`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\n\nexport default PollyService;\n","import BaseService from './base_service.js';\n\nexport interface CookieConsentRequest {\n consentState: CookieConsentState;\n consentUrl: string;\n timeStamp: number;\n uuid: string;\n}\n\nexport interface CookieConsentState {\n func: number;\n stat: number;\n uuid: string;\n version: number;\n}\n\nexport interface CookieConsentResponse {\n response: string\n}\n\nexport class CookieConsentLog extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://cookieconsentlog.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-cookieconsentlog.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/cookieconsentlog`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async logCookieConsent(\n {\n body,\n timeout = 3000\n }:\n {\n body: CookieConsentRequest,\n timeout?: number\n }\n ): Promise<string> {\n const url = `${this.getUrlPrefix()}/log`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), addAuthHeaders: false, timeout});\n return response.text();\n }\n\n}\n\nexport default CookieConsentLog;\n","import BaseService from './base_service.js';\n\nexport enum HighlightResultType {\n 'highlight' = 'highlight',\n 'note' = 'note',\n}\n\nexport interface HighlightRanges {\n start: number|null;\n end: number|null;\n startOffset: number;\n endOffset: number;\n}\n\nexport interface Highlight extends HighlightUpdate {\n id: string;\n recreationdata?: IRecreationData;\n ranges?: HighlightRanges[];\n lang?: string;\n markedupText?: string;\n createdtstamp?: number;\n}\n\nexport interface HighlightRequest {\n breadCrumb: string;\n pageTitle: string;\n externalUserId?: string;\n highlight: Highlight;\n}\n\nexport interface HighlightSearchRequest {\n searchQuery: string;\n resultType?: HighlightResultType;\n isbn?: string;\n maxResults?: number;\n vectorMinConfidence?: number;\n vectorHighConfidence?: number;\n fulltextMinScore?: number;\n}\n\nexport interface HiglightSearchMatch {\n rangeKey: number;\n confidence: number;\n texttype: HighlightResultType;\n isbn: string;\n pid: number;\n returnedItem: number;\n}\n\nexport interface HighlightSearchResponse {\n Items: HighlightResponse[];\n Matches: HiglightSearchMatch[];\n}\n\nexport interface HighlightResponse extends HighlightRequest {\n debugHostname: string;\n uidIsbnPidMyAccountIdPartitionKey: string;\n timestampSortKey: number;\n timeToDie: number;\n pid: number;\n uid: string;\n myAccountid: string;\n commentText: string;\n quote: string;\n hlcolor: string;\n isbn: string;\n}\n\nexport interface HighlightUpdate {\n hlcolor: string;\n quote: string;\n text: string;\n}\n\nexport interface HighlightUpdateRequest {\n highlight: HighlightUpdate;\n}\n\nexport interface HighlightCountResponse {\n type: HighlightResultType;\n isbn: string;\n count: number;\n}\n\nexport interface HighlightDeleteResult extends HighlightUpdateResponse {\n changed: number;\n}\n\nexport interface HighlightAddResult extends HighlightUpdateResponse {\n timestampSortKey: number;\n}\n\nexport interface HighlightUpdateResponse {\n status: string;\n}\n\ninterface IBKNGData {\n prev20TextContent?: string | null;\n next20TextContent?: string;\n cid?: number;\n isPageNote?: boolean;\n domPath?: string;\n newElementPath?: string;\n elementPath?: string;\n prevNextTextContent?: {\n before: string | null;\n after: string;\n srcText: string | null;\n };\n}\n\nexport interface ICtype {\n SiblingsCount: string; // e.g. '15'\n classes: string; // e.g. 'csc-default csc-textpic'\n}\n\nexport interface ICtypeDict {\n [cid: string]: ICtype;\n}\n\nexport interface ITextStartEndObject {\n startSelectedText: string | undefined | null; // start of selection, text value\n endSelectedText: string | undefined; // end of selection, text value '150.000';\n}\n\nexport interface IRecreationData {\n startCID: number; // id of section start, e.g. 'c319'\n numberOfSiblingsOnStartNode?: number | undefined; // sibling count adjacent to the start node, e.g. '5'\n numberofPrevSiblingsOnCIDStartNode?: number | undefined; // e.g. '1';\n startCtypes?: ICtypeDict | null | undefined; // this was never used....\n\n endCID: number;\n numberOfSiblingsOnEndNode?: number | undefined;\n numberofPrevSiblingsOnCIDEndNode?: number | undefined;\n endCTypes?: ICtypeDict | null | undefined; // this was never used ....\n\n startSelectionInnerText?: string | null | undefined; // inner html (text) of the start node that was selected\n endSelectionInnerText?: string | null | undefined; // inner html (text) of the end node that was selected\n\n mathObject?: string | null | undefined; // e.g. '0'. who knows?\n\n selectedTextStartAndEndObject?: ITextStartEndObject | undefined; // not really used in the old client\n\n totalSiblingsToCIDs?: number | undefined; // e.g. '15'\n\n ibkngData?: IBKNGData | null | undefined;\n\n specialSelectedText?: string | undefined;\n source?: any | null | undefined;\n}\n\nexport class HighlightService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://highlights.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-highlights.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/highlight`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async search(\n {\n search,\n timeout = 3000\n }:\n {\n search: HighlightSearchRequest,\n timeout?: number\n }\n ): Promise<HighlightSearchResponse> {\n const url = `${this.getUrlPrefix()}/v2/search`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(search), timeout});\n return response.json();\n }\n\n async deleteHighlightOrNote(\n {\n isbn,\n pid,\n key,\n timeout = 3000\n }:\n {\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightDeleteResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.deleteAsync({url, headers, timeout});\n return response.json();\n }\n\n async getHighlightOrNote(\n {\n isbn,\n pid,\n timeout = 3000\n }:\n {\n isbn: string,\n pid?: number,\n timeout?: number\n }\n ): Promise<HighlightResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/isbn/${isbn}`;\n if (pid) {\n url += `/pid/${pid}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async getHighlightOrNoteCounts(\n {\n noteType,\n timeout = 3000\n }:\n {\n noteType?: HighlightResultType,\n timeout?: number\n }\n ): Promise<HighlightCountResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/count`;\n if (noteType) {\n url += `/${noteType}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async updateHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n key,\n timeout = 5000\n }:\n {\n payload: HighlightUpdateRequest,\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightUpdateResponse> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n\n async addHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n timeout = 5000\n }:\n {\n payload: HighlightRequest,\n isbn: string,\n pid: number,\n timeout?: number\n }\n ): Promise<HighlightAddResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n}\n\nexport default HighlightService;\n","import BaseService from './base_service.js';\n\nexport class UserSettingsBase extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'development':\n case 'testing':\n return `https://staging-user-settings-service.services.${this.baseDomain}`;\n case 'local':\n return `http://localhost:4000`;\n case 'test':\n return `https://localhost:3010/services/usersettingsservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default UserSettingsBase;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface ClientSettingsResponse {\n settings: ClientSettings;\n}\nexport interface ClientSettings {\n readabilities?: Readability;\n darkMode?: boolean;\n displayMode?: DisplayModeOption;\n enableKeyboardShortcuts?: boolean;\n showBookmarks?: boolean;\n showNoteHighlights?: boolean;\n featureGalleryVersion?: number;\n readAloudStore?: ReadAloudStore;\n leftDrawerWidth?: number;\n recentSearches?: string[];\n materialListImagesView?: LayoutView;\n frontPageSections?: FrontPageSection[];\n activePublicationFilters?: ActivePublicationFilters;\n cardsView?: LayoutView;\n cardsSorting?: SortOptions;\n foldersView?: LayoutView;\n foldersSorting?: SortOptions;\n onboardingPromptTime?: string;\n showOnboardingPrompt?: boolean;\n favoritesSorting?: SortOptions;\n}\n\nexport type DisplayModeOption = 'light' | 'dark' | 'system';\n\nexport type LayoutView = 'list' | 'grid';\n\nexport interface ActivePublicationFilters {\n educations?: string[];\n displaySubjects?: string[];\n categoriesNames?: string[];\n categoriesLevels?: string[];\n publishers?: string[];\n}\n\nexport interface Readability {\n letterSpacing?: number;\n lineHeight?: number;\n textSize?: number;\n fontFamily?: FontFamily;\n}\n\nexport interface FontFamily {\n name?: string;\n defaultSize?: string;\n url?: string;\n}\n\nexport interface ReadAloudStore {\n currentVoiceSelection?: CurrentVoiceSelection;\n currentSpeedSelection?: CurrentSpeedSelection;\n}\n\nexport interface CurrentSpeedSelection {\n speed?: number;\n text?: string;\n}\n\nexport interface CurrentVoiceSelection {\n voice?: number;\n gender?: number;\n language?: number;\n}\n\nexport interface FrontPageSection {\n changeable?: boolean;\n code?: string;\n enabled?: boolean;\n name?: string;\n position?: number;\n}\n\nexport type SortOptions = 'recent' | 'alphabetical';\n\n\nexport class UserSettingsClientSettings extends UserSettingsBase {\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {settings: {}} as ClientSettingsResponse;\n } else {\n throw HTTPError;\n }\n }\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: ClientSettings,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n return response.json();\n }\n\n async deleteSettings(\n {\n isbn,\n timeout = 5000\n }: \n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n}\n\nexport default UserSettingsClientSettings;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface Bookmark extends BookmarkUpdate {\n createdTimeStamp: number;\n isbn?: string;\n}\n\nexport interface BookmarkUpdate {\n pageId: number;\n contentId: number;\n}\n\nexport class UserSettingsBookmarks extends UserSettingsBase {\n async setBookmark(\n {\n isbn,\n bookmark,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n bookmark: BookmarkUpdate,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Bookmark> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(bookmark), timeout});\n return response.json();\n }\n\n async deleteBookmark(\n {\n isbn,\n pageId,\n contentId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n contentId: number,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}/page/${pageId}/content/${contentId}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getBookmark(\n {\n isbn,\n pageId,\n timeout = 5000\n }:\n {\n isbn?: string,\n pageId?: number,\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n if (!isbn && pageId) {\n throw new Error('The isbn parameter is required if pageId is provided.');\n }\n\n let url = `${this.getUrlPrefix()}/bookmark/`;\n if (isbn) {\n url += `isbn/${isbn}`;\n }\n\n if (pageId) {\n url += `/page/${pageId}`;\n }\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n // Favourites are bookmarks that are ISBN specific, with a pageId of 0.\n async getFavourite(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n let url = `${this.getUrlPrefix()}/bookmark/favourite`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsBookmarks;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface Continue extends ContinueUpdate {\n createdTimeStamp?: number;\n}\n\nexport interface ContinueUpdate {\n pageId: number;\n}\n\nexport class UserSettingsContinue extends UserSettingsBase {\n async setContinue(\n {\n isbn,\n pageId,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Continue> {\n\n const continueBody: ContinueUpdate = {\n pageId\n };\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(continueBody), timeout});\n return response.json();\n\n }\n\n async deleteContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<Continue> {\n let url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {} as Continue;\n } else {\n throw HTTPError;\n }\n }\n }\n\n}\n\nexport default UserSettingsContinue;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface MRU {\n isbn: string;\n link: string;\n title: string;\n}\n\nexport class UserSettingsMRU extends UserSettingsBase {\n async setMRU(\n {\n mru,\n externalUserId,\n timeout = 5000\n }:\n {\n mru: MRU,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<MRU[]> {\n\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(mru), timeout});\n return response.json();\n }\n\n async clearMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n\n async getMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<MRU[]> {\n let url = `${this.getUrlPrefix()}/mru`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsMRU;\n","import BaseService from './base_service.js';\n\nexport interface NoteHighlight {\n color: string;\n comment: string;\n selectedText: string;\n}\n\nexport interface Notes {\n created: string;\n highlight: NoteHighlight;\n link: string;\n pid: string;\n title: string;\n id: string;\n}\n\nexport interface NotesLabels {\n amountOfNotesProse: string;\n documentTitle: string;\n markedText: string;\n noContentLabel: string;\n noSelectedTextLabel: string;\n notesExportedAt: string;\n yourNote: string;\n}\n\nexport interface NotesData {\n labels: NotesLabels\n notes: Notes[]\n}\n\nexport interface NotesRequest {\n exportedDate: string;\n notesData: NotesData;\n userId: string;\n userName: string;\n}\n\nexport interface Response {\n status: string;\n url: string;\n}\n\nexport interface WritingTaskRequest {\n pdftitle: string;\n userId: string;\n userName: string;\n}\n\nexport interface WritingTaskData {\n createdData: string;\n exportedDateTimeString: string;\n header: string;\n headerStripped: string;\n host: string;\n isbn: string;\n publisher: string;\n siteTitle: string;\n userIdentity: string;\n writingTaskItems: WritingTaskItem[];\n}\n\nexport interface WritingTaskItem {\n answer: string;\n crdate: number;\n cruser_id: number;\n deleted: number;\n files: string[]|null;\n hidden: number;\n imageorient: number;\n parentid: number;\n parenttable: string;\n parsedAnswer: string;\n parsedQuestion: string;\n pid: number;\n question: string;\n sorting: number;\n title: string;\n tstamp: number;\n uid: number;\n userAnswered: boolean;\n}\n\nexport interface SiteMapLabels {\n pbook: string;\n toc: string;\n}\n\nexport interface SiteMapPageTreeItem {\n chapterInfo?: SiteMapPageTreeItem;\n characters: number;\n iPages: number;\n images: number;\n interactiveElements: number;\n lang: number;\n math: number;\n ogStandardPage: number;\n originalMaterial: number;\n quizzes: number;\n soundFiles: number;\n standardPage: number;\n sys_language_uid: number;\n uid: number;\n videos: number;\n words: number;\n}\n\nexport interface SiteMapPage {\n children: SiteMapPage[];\n accessGranted: boolean;\n author: null|string;\n description: null|string;\n doktype: number;\n editor: null|string;\n fe_group: string;\n keywords: null|string;\n link: string;\n nav_hide: number;\n nav_title: string;\n pid: number;\n title: string;\n uid: number;\n}\n\nexport type SiteMapPageTreeData = Record<string, SiteMapPageTreeItem>;\n\nexport interface SiteMapContent {\n labels: SiteMapLabels,\n pageTreeData: SiteMapPageTreeData,\n pages: SiteMapPage[]\n}\n\nexport interface SiteMapRequest {\n baseUrl: string;\n content: SiteMapContent,\n exportedDate: string;\n isbn: string;\n siteTitle: string;\n userId: string;\n userName: string;\n}\n\nexport class PdfGeneratorService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://pdfgenerator.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-pdfgenerator.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/pdfgenerator`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async pdfFromSiteMap(\n {\n body,\n timeout = 3000\n }:\n {\n body: SiteMapRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/sitemap`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromWritingTask(\n {\n body,\n timeout = 3000\n }:\n {\n body: WritingTaskRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/writingTask`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromNotes(\n {\n body,\n timeout = 3000\n }:\n {\n body: NotesRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/notes`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\nexport default PdfGeneratorService;","import TaggingService from '../../tagging_service.js';\nimport {v4 as uuidv4} from 'uuid';\n\nexport interface FolderObject {\n created_at: number;\n}\n\nexport interface Folder extends FolderObject {\n name: string;\n color: string;\n uuid: string;\n parent?: string;\n}\n\nexport interface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder properties are stored as a base64 encoded JSON string.\n**/\nexport class UserFolders extends TaggingService {\n private readonly hasNoParent: string = '-';\n private identity?: string = undefined;\n\n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n /**\n * Create a folder.\n * @param folder_name The name of the folder.\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param color The color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n color,\n timeout = 3000\n }:\n {\n folder_name: string,\n color: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const folder_payload = JSON.stringify({\"folder\": folder_name, \"color\": color});\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: uuidv4(),\n tag_name: parent_folder_uuid ?? this.hasNoParent,\n tag_value: Buffer.from(folder_payload).toString('base64'),\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid, created_at: tag['created_at']} as Folder;\n }\n\n /**\n * Update a folder. Only name and color can be changed.\n *\n * @param folder_uuid The UUID of the folder.\n * @param folder_name The new name of the folder.\n * @param color The new color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async updateFolder(\n {\n folder_uuid,\n folder_name,\n color,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n folder_name?: string,\n color?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n\n if (tags.length === 0) {\n throw new Error(`Folder with UUID ${folder_uuid} not found`);\n }\n\n const tag = tags[0];\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n const new_folder_name = folder_name ?? folder_payload['folder'];\n const new_color = color ?? folder_payload['color'];\n\n const new_folder_payload = JSON.stringify({\"folder\": new_folder_name, \"color\": new_color});\n\n const updatedTag = await this.updateTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n tag_name: tag['tag_name'],\n tag_value: Buffer.from(new_folder_payload).toString('base64'),\n },\n timeout\n }\n );\n\n const parent = tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'];\n return {name: new_folder_name, uuid: folder_uuid, parent: parent, created_at: updatedTag['created_at']} as Folder;\n }\n\n /**\n * List all folders in the user's account.\n * \n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<Folder[]> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the next level of folders in the user's account.\n *\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listNextFolderLevel(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (!parent_folder_uuid) {\n parent_folder_uuid = this.hasNoParent;\n }\n\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_name: parent_folder_uuid,\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the content of a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n* @return (Folder | FolderContent)[]\n **/\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<(Folder|FolderContent)[]> {\n let tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n tag_name: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n content.push({\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'],\n created_at: tag['created_at']\n } as Folder)\n } else {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_name'],\n created_at: tag['created_at']\n } as FolderContent\n );\n }\n }\n\n return content;\n }\n\n /**\n * Add a book to a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Remove a book from a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeInternetbookFromFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.removeContentFromFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Create a new folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_type,\n resource_name,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n tag_value: 'MYACCOUNT_USER_FOLDER'\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid, created_at: tag['created_at']} as FolderContent;\n }\n\n /**\n * Remove a folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeContentFromFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete all folders. Note, this will not delete the content of the folders.\n *\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n","import BaseService from './base_service.js';\n\nexport type AIChatRole = \"user\" | \"assistant\" | \"system\";\n\ntype GenericContext = Record<string, unknown>;\n\nexport interface AIChatMessage<\n ContextType extends GenericContext = GenericContext,\n> {\n role: AIChatRole;\n content: string;\n context?: ContextType;\n}\n\nexport interface AIChatMessageDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n role?: AIChatRole;\n content?: string;\n context?: ContextType;\n}\n\nexport interface AIChatCompletion<\n ContextType extends GenericContext = GenericContext,\n> {\n message: AIChatMessage;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n delta: AIChatMessageDelta;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionOptions<\n ContextType extends GenericContext = GenericContext,\n> {\n context?: ContextType;\n sessionState?: unknown;\n}\n\nexport type AIChatCompletionRequest = {\n messages: AIChatMessage[];\n} & AIChatCompletionOptions;\n\n\nexport class AIBotService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://ai-bot-service.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://ai-bot-service-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/aibotservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async constructChatUrl (\n {\n interactivityId,\n isbn,\n stream\n }:\n {\n interactivityId?: string,\n isbn?: string,\n stream: boolean\n }\n ): Promise<string> {\n if (interactivityId && isbn) \n {\n throw new Error(\"interactivityId and isbn are mutually exclusive\");\n }\n\n if (!interactivityId && !isbn) \n {\n throw new Error(\"Either interactivityId or isbn must be provided\");\n }\n\n let url = '';\n if (interactivityId) \n {\n url = `${this.getUrlPrefix()}/${interactivityId}/chat`;\n }\n\n if (isbn) \n {\n url = `${this.getUrlPrefix()}/interactivity_from_isbn/${isbn}`;\n }\n\n if (stream) {\n url += '/stream';\n }\n\n return url;\n }\n\n async chat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<AIChatCompletion> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: false});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async streamingChat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: true});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n const responseBody = response.body;\n if (!responseBody)\n {\n throw new Error(\"Response body is null\");\n }\n return responseBody;\n }\n}\n\nexport default AIBotService;\n","import BaseService from './base_service.js';\n\nexport enum ApiErrors {\n OVERVIEW_NOT_FOUND = 'Quiz overview not found',\n NOT_FOUND = 'Quiz not found',\n ARCHIVED = 'This shared quiz session is archived',\n GALE_USER_DATA_CLIENT_ERROR = 'Failed to fetch Gale user data: Client error'\n}\n\nexport interface QuizStartResponse {\n quizUnitId: number;\n}\n\nexport interface QuizApiError {\n response: {\n _data: {\n Error: ApiErrors;\n };\n };\n}\n\nexport interface Quiz {\n quizId: number;\n quizName: string;\n quizDescription: string;\n quizFinished: boolean;\n questions: Question[];\n quizDeadline?: number;\n quizResultAvailable?: number;\n quizStartTime?: number;\n}\n\nexport interface Question {\n questionId: number;\n name: string;\n introText: string;\n caseSensitive?: boolean;\n shuffle: boolean;\n answerChecked: boolean;\n questionType: string;\n questionTypeId: number;\n mediafile: Mediafile;\n medias: Mediafile[];\n answers: Answer[];\n chosenAnswer: ChosenAnswer[] | null;\n description: string;\n freeText: string;\n scores?: Score;\n answerBins: {\n binindex: number;\n img: Mediafile;\n txt: string;\n }[];\n tokenized: Tokens[];\n 'chosenAnswer correctness': string;\n}\n\nexport interface FormattedQuestion extends Question {\n number: number;\n answerTime?: string | null;\n percentage: string;\n}\n\nexport interface Mediafile {\n id: number;\n placement: string;\n caption: string;\n altText: string;\n identifier: string;\n extension: string;\n mimeType: string;\n credit: string;\n}\n\nexport interface ChosenAnswer {\n id: number | number[];\n answerText: string;\n created?: number;\n position: number;\n mediafile: Mediafile;\n bins?: number[];\n bin?: number;\n answers?: Answer[];\n answerBins?: AnswerBins[];\n questionId: number;\n isCorrect: boolean;\n wordoption?: AnswerIcon;\n}\n\nexport interface AnswerBins {\n txt: string;\n binindex: number;\n img: Mediafile;\n}\n\nexport interface Answer {\n id: number | number[];\n answerText: string;\n isCorrect: boolean;\n position: number | number[];\n mediafile?: Mediafile;\n bins?: number[];\n inputText?: {\n [key: string]: InputText;\n };\n dropdown?: DropdownMap;\n tableData?: TableData;\n wordoptions?: WordOptions;\n wordoption?: AnswerIcon;\n answerOptions?: AnswerIcon[];\n questionId?: number;\n answerBins?: AnswerBins[];\n}\n\nexport interface WordOptions {\n options: WordOptionsOption[];\n answerOptions?: string[] | AnswerIcon[];\n}\n\nexport interface WordOptionsOption {\n words: string;\n answers: string;\n position: number;\n}\n\nexport interface AnswerIcon {\n abbreviation: string;\n icon: string;\n description: string;\n display: string;\n}\n\nexport interface InputText {\n answerText: string;\n bins: number[];\n id?: number;\n correctText: string;\n isCorrect: boolean;\n position: number;\n index?: number;\n maxCorrectValue?: number;\n minCorrectValue?: number;\n}\n\nexport interface InputTextMap {\n [key: string]: InputText;\n}\n\nexport interface DropdownMap {\n [key: string]: Dropdown[];\n}\n\nexport interface Dropdown {\n option: string;\n isCorrect: boolean;\n position?: number;\n}\n\nexport interface DropdownFormattedOption {\n answerId: number;\n options: Dropdown[];\n}\n\nexport interface TableData {\n [key: string]: {\n [key: string]: TableDataColumn | string;\n };\n}\n\nexport interface TableDataColumn {\n correctText: string;\n isCorrect: boolean;\n position: number;\n options: Dropdown[];\n minCorrectValue?: number;\n maxCorrectValue?: number;\n}\n\nexport interface QuizResult {\n Problemdata: Question[];\n QuizSession?: {\n closesAt: string | null;\n description: string;\n name: string;\n opensAt: string | null;\n problems: number;\n quizSessionId: number;\n };\n QuizUnit?: {\n averageScore: number;\n finished: boolean;\n finishedAt: number | null;\n quizUnitId: number;\n startedAt: number | null;\n studentEkeysId: string;\n studentId: number;\n timeSpent: number;\n };\n Results: Results;\n}\n\nexport interface Results {\n 'Number of correct': number;\n 'Number of incorrect': number;\n 'Number of not answered': number;\n 'Number of partially correct': number;\n 'Number of questions': number;\n unitScore: CalculatedScore;\n}\n\nexport interface Score {\n 'Number of correct options': number;\n 'Number of correct options chosen': number;\n 'Number of options': number;\n 'Number of options chosen': number;\n 'Percentage score': number;\n 'Student has answered'?: boolean;\n 'Token check': Tokens[];\n}\n\nexport interface WordOptionsAnswer {\n answerId?: number;\n options?: (string | AnswerIcon)[];\n text: WordOptionsAnswerText | undefined;\n index: number;\n selected?: undefined | string | AnswerIcon;\n}\n\nexport interface WordOptionsAnswerText {\n answers: string;\n words: string;\n position: number;\n}\n\nexport interface Tokens {\n correctText: string;\n diffCheck: TokensDiffCheck[];\n numberOfTokenErrors: number;\n studentAnswerText: string;\n}\n\nexport interface TokensDiffCheck {\n error: boolean;\n studentWord: string;\n correctWord: string;\n}\n\nexport interface NewAnswer {\n answerText: string;\n bins: number[];\n id: number;\n isCorrect: boolean;\n position: number;\n questionId: number;\n}\n\nexport interface SaveAnswerResponse {\n Result: string;\n}\n\nexport interface SaveAnswer {\n 'question-id': number;\n 'question-type-id': number;\n 'answer-id'?: number[];\n 'answer-text'?: (string | { answers: string } | null)[];\n 'answer-position'?: number[];\n 'answer-bin'?: number[];\n 'answer-checked'?: boolean;\n}\n\nexport type QuizTextSettings = Record<string, string | number>;\n\nexport interface SharedQuizData {\n 'quiz-id'?: string | undefined;\n isbn?: string | undefined;\n title: string;\n description: string;\n 'quiz-open': number | null;\n 'quiz-close': number | null;\n 'result-available-time'?: number | null;\n 'extra-teachers': string[];\n}\n\nexport interface SharedTeacherQuiz {\n createdAt?: number;\n deactivatedProblems?: number[];\n extraTeachers?: string[];\n isArchived?: boolean;\n isExtraTeacher?: boolean;\n isPinned?: boolean;\n name?: string;\n problems: number;\n quizSessionId?: number;\n studentsFinished?: number;\n}\n\nexport interface SharedStudentQuiz {\n quizUnitId: number;\n quizSessionId: number;\n name: string;\n createdBy: string;\n startedAt: number | null;\n finishedAt: number | null;\n finished: boolean;\n}\n\nexport interface CalculatedScore {\n points: number;\n maxPoints: number;\n percentage: number;\n}\n\nexport interface QuizSession extends SharedTeacherQuiz {\n description?: string;\n opensAt: number | null;\n closesAt: number | null;\n quizUnits?: QuizUnit[];\n averageScores?: {\n byProblem: CalculatedScore[];\n overall: CalculatedScore;\n };\n}\n\nexport interface QuizUnit {\n quizUnitId: number;\n studentId: number;\n studentEkeysId: string;\n finished: boolean;\n finishedAt: number | null;\n startedAt: number | null;\n timeSpent: TimeSpent;\n unitScore: CalculatedScore;\n problemScores: ProblemScore[];\n}\n\nexport interface TimeSpent {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface FormattedQuizUnit extends QuizUnit {\n formattedTimeSpent?: string;\n formattedFinishedAt?: string | null;\n formattedStartedAt?: string | null;\n percentage?: string;\n total?: string;\n}\n\nexport interface ProblemScore {\n mathproblem: number;\n questionTypeId: number;\n questionTypeString: string;\n score: Score;\n}\n\nexport type QuizTableAction = 'copy' | 'archive' | 'delete' | 'unarchive';\nexport type QuizTableItem =\n | SharedTeacherQuiz\n | FormattedQuizUnit\n | SharedStudentQuiz;\n\nexport type SearchableKeys = 'name';\n\nexport type ProblemAnswerState =\n | 'correct'\n | 'incorrect'\n | 'partially-correct'\n | 'unanswered';\n\nexport type QuizLocalState = {\n id: number;\n isLoading: boolean;\n isApiError: boolean;\n data: Quiz | null;\n originalData: Quiz | null;\n finished: boolean;\n results: QuizResult | null;\n instantFeedback: string | null;\n showAdvancedResults: boolean;\n};\n\n\n\nexport class QuizService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return 'https://api.iquiz.dk/api';\n case 'development':\n case 'local':\n case 'testing':\n return 'https://galecms.test.tibalo.dk/api';\n case 'test':\n return `https://localhost:3010/galeapi/api`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n \n private makeHeaders(extra?: Record<string, string>): Headers {\n const headers = new Headers();\n headers.append('Content-Type', 'application/json');\n\n if (extra) {\n for (const [key, val] of Object.entries(extra)) {\n headers.append(key, val);\n }\n }\n\n return headers;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Legacy Gale quizzes\n // ─────────────────────────────────────────────────────────────\n\n async checkActiveSession({\n isbn,\n quizNumber,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizNumber: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quizNumber}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async startQuiz({\n isbn,\n quiz,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quiz}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({ url, headers, body: '{}', timeout });\n return await res.json();\n }\n\n async getProblems({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async resetAnswer({\n isbn,\n quizUnitId,\n questionID,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n questionID: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}/question/${questionID}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async saveAnswer({\n isbn,\n quizUnitId,\n answer,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n answer: object;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SaveAnswerResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify(answer),\n timeout\n });\n\n return await res.json();\n }\n\n async finishQuiz({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/finish`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async getResults({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/result`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/overview/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Shared quizzes\n // ─────────────────────────────────────────────────────────────\n\n async createSharedQuiz({\n quizData,\n extraHeaders,\n timeout = 3000\n }: {\n quizData: SharedQuizData;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async copyEditSharedQuiz({\n quizSessionId,\n quizData,\n action,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizData: SharedQuizData;\n action: 'edit' | 'copy';\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = action === 'edit' ? 'PUT' : 'POST';\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PUT'\n ? await this.putAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n })\n : await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async getTeachersQuizProblems({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/problems`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersUnitOverview({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizUnitId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async activateDeactivateQuestion({\n quizSessionId,\n questionId,\n activate,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n questionId: number;\n activate: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quiz/${quizSessionId}/question/${questionId}`;\n const method = activate ? 'PATCH' : 'DELETE';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PATCH'\n ? await this.patchAsync({\n url,\n headers,\n body: null,\n timeout\n })\n : await this.deleteAsync({ url, headers, timeout });\n\n return await res.json();\n }\n\n async getTeachersQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ SharedQuizzes: SharedTeacherQuiz[] }> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getStudentsQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SharedStudentQuiz[]> {\n const url = `${this.getUrlPrefix()}/shared/student/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersQuiz({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizSession> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async toggleArchiveQuiz({\n quizSessionId,\n archive,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n archive: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = archive ? 'DELETE' : 'PATCH';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'DELETE'\n ? await this.deleteAsync({ url, headers, timeout })\n : await this.postAsync({\n url,\n headers,\n body: null,\n timeout\n });\n\n return await res.json();\n }\n\n async deleteSharedQuizUnit({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n quizUnitId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.deleteAsync({ url, headers, timeout });\n return await res.json();\n }\n}\n\nexport default QuizService;\n","import BaseService from './base_service.js';\n\nexport class WritingTaskService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://writingtask.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-writingtask.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/writingtask`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\nexport default WritingTaskService;\n","import BaseService from './base_service.js';\n\nexport class SolrProxyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://solr-proxy.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://solr-proxy-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/solrproxy`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default SolrProxyService;\n"],"mappings":"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","names":["SSMLSpeechSpeeds","HighlightResultType","Error","Error","ApiErrors"]}
|
|
1
|
+
{"version":3,"sources":["../src/services/base_service.ts","../src/services/tagging_service.ts","../src/services/polly_service.ts","../src/services/cookie_consent_log.ts","../src/services/highlight_service.ts","../src/services/user_settings_base.ts","../src/services/user_settings_clientsettings.ts","../src/services/user_settings_bookmarks.ts","../src/services/user_settings_continue.ts","../src/services/user_settings_mru.ts","../src/services/pdf_generator.ts","../src/services/highlevel/tagging/user_folders.ts","../src/services/ai_bot_service.ts","../src/services/quiz_service.ts","../src/services/writing_task_service.ts","../src/services/solr_proxy_service.ts"],"sourcesContent":["export class HTTPError extends Error {\n public response: Response;\n \n constructor(message: string, response: Response) {\n super();\n this.message = message;\n this.response = response;\n }\n}\n\nexport class BaseService {\n public bearerToken: string | undefined;\n public apiKey: string | undefined;\n public serviceUrl: string | undefined;\n public environment: string;\n public myAccountId: string;\n public baseDomain: string;\n\n constructor({\n bearerToken = undefined,\n apiKey = undefined,\n serviceUrl = undefined,\n environment = 'production',\n myAccountId = 'SYSTIMEMYACCOUNT',\n baseDomain = 'systime.dk',\n } : {\n bearerToken?: string,\n apiKey?: string,\n serviceUrl?: string,\n environment: string,\n myAccountId: string,\n baseDomain?: string\n }) {\n this.bearerToken = bearerToken;\n this.apiKey = apiKey;\n this.serviceUrl = serviceUrl;\n this.environment = environment.toLowerCase();\n this.myAccountId = myAccountId;\n this.baseDomain = baseDomain;\n }\n\n protected discoverUrlPrefix(): string {\n throw new Error('Method not implemented.');\n }\n\n public getUrlPrefix(): string {\n // If the URL has been explicitly set, return it.\n if (this.serviceUrl) {\n return this.serviceUrl;\n }\n return this.discoverUrlPrefix()\n }\n\n public async addAuthHeaders(requestHeaders: Headers): Promise<Headers> {\n if (this.bearerToken) {\n requestHeaders.set('Authorization', `Bearer ${this.bearerToken}`);\n } else if (this.apiKey) {\n requestHeaders.set('x-api-key', this.apiKey);\n }\n return requestHeaders;\n }\n\n async getAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'GET';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async putAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PUT';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async postAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'POST';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n }\n\n async deleteAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'DELETE';\n return await this.callAsync({ url, body: null, method, headers, addAuthHeaders, timeout });\n }\n\n async patchAsync(\n {\n url,\n headers,\n addAuthHeaders = true,\n body,\n timeout\n }:\n {\n url: URL | string,\n headers: Headers | undefined | null,\n addAuthHeaders?: boolean,\n body: string | null | undefined,\n timeout: number\n }\n ): Promise<Response> {\n const method = 'PATCH';\n return await this.callAsync({ url, body, method, headers, addAuthHeaders, timeout });\n } \n\n async callAsync(\n {\n url,\n body,\n method,\n headers,\n timeout,\n addAuthHeaders\n }:\n {\n url: URL | string,\n body: string | null | undefined,\n method: string,\n headers: Headers | undefined | null,\n timeout: number,\n addAuthHeaders?: boolean,\n }\n ): Promise<Response> {\n if (!headers) {\n headers = new Headers();\n }\n\n if (addAuthHeaders) {\n headers = await this.addAuthHeaders(headers);\n }\n\n const response = await fetch(url, {\n method: method,\n body: body,\n headers: headers,\n signal: AbortSignal.timeout(timeout)\n });\n\n if (!response.ok) {\n\t\tthrow new HTTPError(`Got ${response.status} while calling ${response.url}`, response);\n }\n return response;\n }\n}\nexport default BaseService;\n","import BaseService from './base_service.js';\n\nexport interface Tag {\n identity: string;\n resource_type: string;\n resource_name: string;\n tag_name: string;\n tag_value: string;\n}\n\nexport interface TagOutput extends Tag {\n created_at: number;\n}\n\nexport class TaggingService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://tagging.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-tagging.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/tagging`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async getTagsByResource(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name?: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_resource/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n async getTagsByName(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n tag_name: string,\n resource_type?: string,\n resource_name?: string,\n timeout?: number\n }\n ): Promise<TagOutput[]> {\n const url = `${this.getUrlPrefix()}/tags/by_tag_name/${identity}/${tag_name}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.getAsync({url, headers, timeout});\n return await response.json();\n }\n\n async createTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async updateTag(\n {\n tag,\n timeout = 3000\n }:\n {\n tag: Tag,\n timeout?: number\n }\n ): Promise<TagOutput> {\n const url = `${this.getUrlPrefix()}/tags`;\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.putAsync({url, headers, body: JSON.stringify(tag), timeout});\n return await response.json();\n }\n\n async deleteTag(\n {\n identity,\n resource_type,\n resource_name,\n tag_name,\n timeout = 3000\n }:\n {\n identity: string,\n resource_type?: string,\n resource_name?: string,\n tag_name?: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/tags/${identity}${resource_type ? `/${resource_type}` : ''}${resource_name ? `/${resource_name}` : ''}${tag_name ? `/${tag_name}` : ''}`;\n\n const headers: HeadersInit = new Headers();\n const response = await this.deleteAsync({url, headers, timeout});\n await response.json();\n return\n }\n}\n\nexport default TaggingService;\n","import BaseService from './base_service.js';\n\nexport enum SSMLSpeechSpeeds {\n X_SLOW = 1,\n SLOW = 2,\n MEDIUM = 3,\n FAST = 4,\n X_FAST = 5,\n}\n\nexport type SpeechmarkEvent = {\n time: number;\n type?: string;\n value: string;\n start?: number;\n end?: number;\n}\n\nexport interface SynthesisResponse {\n mp3url: string;\n s3: string[];\n SpeechMarks?: SpeechmarkEvent[];\n}\n\nexport interface SynthesisRequest {\n text: string;\n includeSpeechMarks?: boolean;\n voice: number;\n speed?: SSMLSpeechSpeeds;\n}\n\nexport class PollyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://appear-polly.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-appear-polly.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/polly`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async synthesize(\n {\n body,\n timeout = 3000\n }:\n {\n body: SynthesisRequest,\n timeout?: number\n }\n ): Promise<SynthesisResponse> {\n const url = `${this.getUrlPrefix()}/synthesizeSpeech`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\n\nexport default PollyService;\n","import BaseService from './base_service.js';\n\nexport interface CookieConsentRequest {\n consentState: CookieConsentState;\n consentUrl: string;\n timeStamp: number;\n uuid: string;\n}\n\nexport interface CookieConsentState {\n func: number;\n stat: number;\n uuid: string;\n version: number;\n}\n\nexport interface CookieConsentResponse {\n response: string\n}\n\nexport class CookieConsentLog extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://cookieconsentlog.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-cookieconsentlog.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/cookieconsentlog`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async logCookieConsent(\n {\n body,\n timeout = 3000\n }:\n {\n body: CookieConsentRequest,\n timeout?: number\n }\n ): Promise<string> {\n const url = `${this.getUrlPrefix()}/log`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), addAuthHeaders: false, timeout});\n return response.text();\n }\n\n}\n\nexport default CookieConsentLog;\n","import BaseService from './base_service.js';\n\nexport enum HighlightResultType {\n 'highlight' = 'highlight',\n 'note' = 'note',\n}\n\nexport interface HighlightRanges {\n start: number|null;\n end: number|null;\n startOffset: number;\n endOffset: number;\n}\n\nexport interface Highlight extends HighlightUpdate {\n id: string;\n recreationdata?: IRecreationData;\n ranges?: HighlightRanges[];\n lang?: string;\n markedupText?: string;\n createdtstamp?: number;\n}\n\nexport interface HighlightRequest {\n breadCrumb: string;\n pageTitle: string;\n externalUserId?: string;\n highlight: Highlight;\n}\n\nexport interface HighlightSearchRequest {\n searchQuery: string;\n resultType?: HighlightResultType;\n isbn?: string;\n maxResults?: number;\n vectorMinConfidence?: number;\n vectorHighConfidence?: number;\n fulltextMinScore?: number;\n}\n\nexport interface HiglightSearchMatch {\n rangeKey: number;\n confidence: number;\n texttype: HighlightResultType;\n isbn: string;\n pid: number;\n returnedItem: number;\n}\n\nexport interface HighlightSearchResponse {\n Items: HighlightResponse[];\n Matches: HiglightSearchMatch[];\n}\n\nexport interface HighlightResponse extends HighlightRequest {\n debugHostname: string;\n uidIsbnPidMyAccountIdPartitionKey: string;\n timestampSortKey: number;\n timeToDie: number;\n pid: number;\n uid: string;\n myAccountid: string;\n commentText: string;\n quote: string;\n hlcolor: string;\n isbn: string;\n}\n\nexport interface HighlightUpdate {\n hlcolor: string;\n quote: string;\n text: string;\n}\n\nexport interface HighlightUpdateRequest {\n highlight: HighlightUpdate;\n}\n\nexport interface HighlightCountResponse {\n type: HighlightResultType;\n isbn: string;\n count: number;\n}\n\nexport interface HighlightDeleteResult extends HighlightUpdateResponse {\n changed: number;\n}\n\nexport interface HighlightAddResult extends HighlightUpdateResponse {\n timestampSortKey: number;\n}\n\nexport interface HighlightUpdateResponse {\n status: string;\n}\n\ninterface IBKNGData {\n prev20TextContent?: string | null;\n next20TextContent?: string;\n cid?: number;\n isPageNote?: boolean;\n domPath?: string;\n newElementPath?: string;\n elementPath?: string;\n prevNextTextContent?: {\n before: string | null;\n after: string;\n srcText: string | null;\n };\n}\n\nexport interface ICtype {\n SiblingsCount: string; // e.g. '15'\n classes: string; // e.g. 'csc-default csc-textpic'\n}\n\nexport interface ICtypeDict {\n [cid: string]: ICtype;\n}\n\nexport interface ITextStartEndObject {\n startSelectedText: string | undefined | null; // start of selection, text value\n endSelectedText: string | undefined; // end of selection, text value '150.000';\n}\n\nexport interface IRecreationData {\n startCID: number; // id of section start, e.g. 'c319'\n numberOfSiblingsOnStartNode?: number | undefined; // sibling count adjacent to the start node, e.g. '5'\n numberofPrevSiblingsOnCIDStartNode?: number | undefined; // e.g. '1';\n startCtypes?: ICtypeDict | null | undefined; // this was never used....\n\n endCID: number;\n numberOfSiblingsOnEndNode?: number | undefined;\n numberofPrevSiblingsOnCIDEndNode?: number | undefined;\n endCTypes?: ICtypeDict | null | undefined; // this was never used ....\n\n startSelectionInnerText?: string | null | undefined; // inner html (text) of the start node that was selected\n endSelectionInnerText?: string | null | undefined; // inner html (text) of the end node that was selected\n\n mathObject?: string | null | undefined; // e.g. '0'. who knows?\n\n selectedTextStartAndEndObject?: ITextStartEndObject | undefined; // not really used in the old client\n\n totalSiblingsToCIDs?: number | undefined; // e.g. '15'\n\n ibkngData?: IBKNGData | null | undefined;\n\n specialSelectedText?: string | undefined;\n source?: any | null | undefined;\n}\n\nexport class HighlightService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://highlights.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-highlights.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/highlight`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n };\n\n async search(\n {\n search,\n timeout = 3000\n }:\n {\n search: HighlightSearchRequest,\n timeout?: number\n }\n ): Promise<HighlightSearchResponse> {\n const url = `${this.getUrlPrefix()}/v2/search`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(search), timeout});\n return response.json();\n }\n\n async deleteHighlightOrNote(\n {\n isbn,\n pid,\n key,\n timeout = 3000\n }:\n {\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightDeleteResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n\n const headers: HeadersInit = new Headers();\n headers.append('Content-Type', \"application/json\");\n const response = await this.deleteAsync({url, headers, timeout});\n return response.json();\n }\n\n async getHighlightOrNote(\n {\n isbn,\n pid,\n timeout = 3000\n }:\n {\n isbn: string,\n pid?: number,\n timeout?: number\n }\n ): Promise<HighlightResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/isbn/${isbn}`;\n if (pid) {\n url += `/pid/${pid}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async getHighlightOrNoteCounts(\n {\n noteType,\n timeout = 3000\n }:\n {\n noteType?: HighlightResultType,\n timeout?: number\n }\n ): Promise<HighlightCountResponse[]> {\n let url = `${this.getUrlPrefix()}/v2/count`;\n if (noteType) {\n url += `/${noteType}`;\n }\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n if (response.status === 204) {\n return [];\n } \n return response.json();\n }\n\n async updateHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n key,\n timeout = 5000\n }:\n {\n payload: HighlightUpdateRequest,\n isbn: string,\n pid: number,\n key: number,\n timeout?: number\n }\n ): Promise<HighlightUpdateResponse> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}/key/${key}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n\n async addHighlightOrNote(\n {\n payload,\n isbn,\n pid,\n timeout = 5000\n }:\n {\n payload: HighlightRequest,\n isbn: string,\n pid: number,\n timeout?: number\n }\n ): Promise<HighlightAddResult> {\n const url = `${this.getUrlPrefix()}/v2/isbn/${isbn}/pid/${pid}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(payload), timeout});\n return response.json();\n }\n}\n\nexport default HighlightService;\n","import BaseService from './base_service.js';\n\nexport class UserSettingsBase extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://user-settings-service.services.${this.baseDomain}`;\n case 'development':\n case 'testing':\n return `https://staging-user-settings-service.services.${this.baseDomain}`;\n case 'local':\n return `http://localhost:4000`;\n case 'test':\n return `https://localhost:3010/services/usersettingsservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default UserSettingsBase;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface ClientSettingsResponse {\n settings: ClientSettings;\n}\nexport interface ClientSettings {\n readabilities?: Readability;\n darkMode?: boolean;\n displayMode?: DisplayModeOption;\n enableKeyboardShortcuts?: boolean;\n showBookmarks?: boolean;\n showNoteHighlights?: boolean;\n featureGalleryVersion?: number;\n readAloudStore?: ReadAloudStore;\n leftDrawerWidth?: number;\n recentSearches?: string[];\n materialListImagesView?: LayoutView;\n frontPageSections?: FrontPageSection[];\n activePublicationFilters?: ActivePublicationFilters;\n cardsView?: LayoutView;\n cardsSorting?: SortOptions;\n foldersView?: LayoutView;\n foldersSorting?: SortOptions;\n onboardingPromptTime?: string;\n showOnboardingPrompt?: boolean;\n favoritesSorting?: SortOptions;\n}\n\nexport type DisplayModeOption = 'light' | 'dark' | 'system';\n\nexport type LayoutView = 'list' | 'grid';\n\nexport interface ActivePublicationFilters {\n educations?: string[];\n displaySubjects?: string[];\n categoriesNames?: string[];\n categoriesLevels?: string[];\n publishers?: string[];\n}\n\nexport interface Readability {\n letterSpacing?: number;\n lineHeight?: number;\n textSize?: number;\n fontFamily?: FontFamily;\n}\n\nexport interface FontFamily {\n name?: string;\n defaultSize?: string;\n url?: string;\n}\n\nexport interface ReadAloudStore {\n currentVoiceSelection?: CurrentVoiceSelection;\n currentSpeedSelection?: CurrentSpeedSelection;\n}\n\nexport interface CurrentSpeedSelection {\n speed?: number;\n text?: string;\n}\n\nexport interface CurrentVoiceSelection {\n voice?: number;\n gender?: number;\n language?: number;\n}\n\nexport interface FrontPageSection {\n changeable?: boolean;\n code?: string;\n enabled?: boolean;\n name?: string;\n position?: number;\n}\n\nexport type SortOptions = 'recent' | 'alphabetical';\n\n\nexport class UserSettingsClientSettings extends UserSettingsBase {\n async getSettings(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {settings: {}} as ClientSettingsResponse;\n } else {\n throw HTTPError;\n }\n }\n }\n\n async setSettings(\n {\n isbn,\n settings,\n timeout = 5000\n }: \n {\n isbn: string,\n settings: ClientSettings,\n timeout?: number\n }\n ): Promise<ClientSettingsResponse> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(settings), timeout});\n return response.json();\n }\n\n async deleteSettings(\n {\n isbn,\n timeout = 5000\n }: \n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/clientsettings/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n}\n\nexport default UserSettingsClientSettings;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface Bookmark extends BookmarkUpdate {\n createdTimeStamp: number;\n isbn?: string;\n}\n\nexport interface BookmarkUpdate {\n pageId: number;\n contentId: number;\n}\n\nexport class UserSettingsBookmarks extends UserSettingsBase {\n async setBookmark(\n {\n isbn,\n bookmark,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n bookmark: BookmarkUpdate,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Bookmark> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(bookmark), timeout});\n return response.json();\n }\n\n async deleteBookmark(\n {\n isbn,\n pageId,\n contentId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n contentId: number,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/bookmark/isbn/${isbn}/page/${pageId}/content/${contentId}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getBookmark(\n {\n isbn,\n pageId,\n timeout = 5000\n }:\n {\n isbn?: string,\n pageId?: number,\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n if (!isbn && pageId) {\n throw new Error('The isbn parameter is required if pageId is provided.');\n }\n\n let url = `${this.getUrlPrefix()}/bookmark/`;\n if (isbn) {\n url += `isbn/${isbn}`;\n }\n\n if (pageId) {\n url += `/page/${pageId}`;\n }\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n\n // Favourites are bookmarks that are ISBN specific, with a pageId of 0.\n async getFavourite(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<Bookmark[]> {\n let url = `${this.getUrlPrefix()}/bookmark/favourite`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsBookmarks;\n","import UserSettingsBase from './user_settings_base.js';\nimport {HTTPError} from './base_service.js'\n\nexport interface Continue extends ContinueUpdate {\n createdTimeStamp?: number;\n}\n\nexport interface ContinueUpdate {\n pageId: number;\n}\n\nexport class UserSettingsContinue extends UserSettingsBase {\n async setContinue(\n {\n isbn,\n pageId,\n externalUserId,\n timeout = 5000\n }:\n {\n isbn: string,\n pageId: number,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<Continue> {\n\n const continueBody: ContinueUpdate = {\n pageId\n };\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.putAsync({url, headers, body: JSON.stringify(continueBody), timeout});\n return response.json();\n\n }\n\n async deleteContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return\n }\n\n async getContinue(\n {\n isbn,\n timeout = 5000\n }:\n {\n isbn: string,\n timeout?: number\n }\n ): Promise<Continue> {\n let url = `${this.getUrlPrefix()}/continue/isbn/${isbn}`;\n\n const headers: HeadersInit = new Headers();\n\n try {\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n } catch (Error) {\n if (Error instanceof HTTPError && Error.response.status === 404) {\n return {} as Continue;\n } else {\n throw HTTPError;\n }\n }\n }\n\n}\n\nexport default UserSettingsContinue;\n","import UserSettingsBase from './user_settings_base.js';\n\nexport interface MRU {\n isbn: string;\n link: string;\n title: string;\n}\n\nexport class UserSettingsMRU extends UserSettingsBase {\n async setMRU(\n {\n mru,\n externalUserId,\n timeout = 5000\n }:\n {\n mru: MRU,\n externalUserId?: string,\n timeout?: number\n }\n ): Promise<MRU[]> {\n\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n if (externalUserId) {\n headers.set('external-user-id', externalUserId);\n }\n\n headers.set('Content-Type', 'application/json');\n const response = await this.postAsync({url, headers, body: JSON.stringify(mru), timeout});\n return response.json();\n }\n\n async clearMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n const url = `${this.getUrlPrefix()}/mru`;\n const headers: HeadersInit = new Headers();\n\n await this.deleteAsync({url, headers, timeout});\n return;\n }\n\n async getMRU(\n {\n timeout = 5000\n }:\n {\n timeout?: number\n }\n ): Promise<MRU[]> {\n let url = `${this.getUrlPrefix()}/mru`;\n\n const headers: HeadersInit = new Headers();\n\n const response = await this.getAsync({url, headers, timeout});\n return response.json();\n }\n}\n\nexport default UserSettingsMRU;\n","import BaseService from './base_service.js';\n\nexport interface NoteHighlight {\n color: string;\n comment: string;\n selectedText: string;\n}\n\nexport interface Notes {\n created: string;\n highlight: NoteHighlight;\n link: string;\n pid: string;\n title: string;\n id: string;\n}\n\nexport interface NotesLabels {\n amountOfNotesProse: string;\n documentTitle: string;\n markedText: string;\n noContentLabel: string;\n noSelectedTextLabel: string;\n notesExportedAt: string;\n yourNote: string;\n}\n\nexport interface NotesData {\n labels: NotesLabels\n notes: Notes[]\n}\n\nexport interface NotesRequest {\n exportedDate: string;\n notesData: NotesData;\n userId: string;\n userName: string;\n}\n\nexport interface Response {\n status: string;\n url: string;\n}\n\nexport interface WritingTaskRequest {\n pdftitle: string;\n userId: string;\n userName: string;\n}\n\nexport interface WritingTaskData {\n createdData: string;\n exportedDateTimeString: string;\n header: string;\n headerStripped: string;\n host: string;\n isbn: string;\n publisher: string;\n siteTitle: string;\n userIdentity: string;\n writingTaskItems: WritingTaskItem[];\n}\n\nexport interface WritingTaskItem {\n answer: string;\n crdate: number;\n cruser_id: number;\n deleted: number;\n files: string[]|null;\n hidden: number;\n imageorient: number;\n parentid: number;\n parenttable: string;\n parsedAnswer: string;\n parsedQuestion: string;\n pid: number;\n question: string;\n sorting: number;\n title: string;\n tstamp: number;\n uid: number;\n userAnswered: boolean;\n}\n\nexport interface SiteMapLabels {\n pbook: string;\n toc: string;\n}\n\nexport interface SiteMapPageTreeItem {\n chapterInfo?: SiteMapPageTreeItem;\n characters: number;\n iPages: number;\n images: number;\n interactiveElements: number;\n lang: number;\n math: number;\n ogStandardPage: number;\n originalMaterial: number;\n quizzes: number;\n soundFiles: number;\n standardPage: number;\n sys_language_uid: number;\n uid: number;\n videos: number;\n words: number;\n}\n\nexport interface SiteMapPage {\n children: SiteMapPage[];\n accessGranted: boolean;\n author: null|string;\n description: null|string;\n doktype: number;\n editor: null|string;\n fe_group: string;\n keywords: null|string;\n link: string;\n nav_hide: number;\n nav_title: string;\n pid: number;\n title: string;\n uid: number;\n}\n\nexport type SiteMapPageTreeData = Record<string, SiteMapPageTreeItem>;\n\nexport interface SiteMapContent {\n labels: SiteMapLabels,\n pageTreeData: SiteMapPageTreeData,\n pages: SiteMapPage[]\n}\n\nexport interface SiteMapRequest {\n baseUrl: string;\n content: SiteMapContent,\n exportedDate: string;\n isbn: string;\n siteTitle: string;\n userId: string;\n userName: string;\n}\n\nexport class PdfGeneratorService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://pdfgenerator.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-pdfgenerator.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/pdfgenerator`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async pdfFromSiteMap(\n {\n body,\n timeout = 3000\n }:\n {\n body: SiteMapRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/sitemap`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromWritingTask(\n {\n body,\n timeout = 3000\n }:\n {\n body: WritingTaskRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/writingTask`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async pdfFromNotes(\n {\n body,\n timeout = 3000\n }:\n {\n body: NotesRequest,\n timeout?: number\n }\n ): Promise<Response> {\n const url = `${this.getUrlPrefix()}/notes`;\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n}\nexport default PdfGeneratorService;","import TaggingService from '../../tagging_service.js';\nimport {v4 as uuidv4} from 'uuid';\n\nexport interface FolderObject {\n created_at: number;\n}\n\nexport interface Folder extends FolderObject {\n name: string;\n color: string;\n uuid: string;\n parent?: string;\n}\n\nexport interface FolderContent extends FolderObject {\n type: string;\n identifier: string;\n folder_uuid: string;\n}\n\n/**\n * UserFolders is a service that allows users to create folders in their account. It's built on top of the Tagging service.\n * Folders are created with a name and an optional parent folder. If no parent folder is provided, the folder is created at the root level.\n * Folders are created with a unique UUID that can be used to reference the folder in future requests. The folder properties are stored as a base64 encoded JSON string.\n**/\nexport class UserFolders extends TaggingService {\n private readonly hasNoParent: string = '-';\n private identity?: string = undefined;\n\n async getIdentity() : Promise<string> {\n if (this.identity) {\n return this.identity;\n }\n\n if (this.bearerToken) {\n const tokenParts = this.bearerToken.split('.');\n const payload = Buffer.from(tokenParts[1], 'base64').toString();\n const payloadObject = JSON.parse(payload);\n // The identity is the keyword user, the user's authns and the ekeysuserid (user) concatenated with an underscore\n // This value is enforced by the Tagging service and this is the only identity\n // that the Service will accept when invoked with a user specific bearer token.\n return `user_${payloadObject.authns}_${payloadObject.user}`;\n }\n\n throw new Error('The UserFolders service must be invoked with a valid bearer token');\n }\n\n /**\n * Create a folder.\n * @param folder_name The name of the folder.\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param color The color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async createFolder(\n {\n folder_name,\n parent_folder_uuid,\n color,\n timeout = 3000\n }:\n {\n folder_name: string,\n color: string,\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const folder_payload = JSON.stringify({\"folder\": folder_name, \"color\": color});\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: uuidv4(),\n tag_name: parent_folder_uuid ?? this.hasNoParent,\n tag_value: Buffer.from(folder_payload).toString('base64'),\n },\n timeout\n }\n );\n return {name: folder_name, uuid: tag['resource_name'], parent: parent_folder_uuid, created_at: tag['created_at']} as Folder;\n }\n\n /**\n * Update a folder. Only name and color can be changed.\n *\n * @param folder_uuid The UUID of the folder.\n * @param folder_name The new name of the folder.\n * @param color The new color of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder\n **/\n async updateFolder(\n {\n folder_uuid,\n folder_name,\n color,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n folder_name?: string,\n color?: string,\n timeout?: number\n }\n ): Promise<Folder> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n\n if (tags.length === 0) {\n throw new Error(`Folder with UUID ${folder_uuid} not found`);\n }\n\n const tag = tags[0];\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n const new_folder_name = folder_name ?? folder_payload['folder'];\n const new_color = color ?? folder_payload['color'];\n\n const new_folder_payload = JSON.stringify({\"folder\": new_folder_name, \"color\": new_color});\n\n const updatedTag = await this.updateTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n tag_name: tag['tag_name'],\n tag_value: Buffer.from(new_folder_payload).toString('base64'),\n },\n timeout\n }\n );\n\n const parent = tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'];\n return {name: new_folder_name, uuid: folder_uuid, parent: parent, created_at: updatedTag['created_at']} as Folder;\n }\n\n /**\n * List all folders in the user's account.\n * \n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<Folder[]> {\n const tags = await this.getTagsByResource(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the next level of folders in the user's account.\n *\n * @param parent_folder_uuid The UUID of the parent folder. If no parent folder is provided, the folder is created at the root level.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return Folder[]\n **/\n async listNextFolderLevel(\n {\n parent_folder_uuid,\n timeout = 3000\n }:\n {\n parent_folder_uuid?: string,\n timeout?: number\n }\n ): Promise<Folder[]> {\n let tags;\n if (!parent_folder_uuid) {\n parent_folder_uuid = this.hasNoParent;\n }\n\n tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n tag_name: parent_folder_uuid,\n timeout\n }\n );\n\n let folders = [];\n\n for (const tag of tags) {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n folders.push(\n {\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'] === this.hasNoParent ? undefined : tag['tag_name'],\n created_at: tag['created_at']\n } as Folder\n );\n }\n\n return folders;\n }\n\n /**\n * List the content of a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n* @return (Folder | FolderContent)[]\n **/\n async getFolderContent(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<(Folder|FolderContent)[]> {\n let tags = await this.getTagsByName(\n {\n identity: await this.getIdentity(),\n tag_name: folder_uuid,\n timeout\n }\n );\n\n let content = [];\n\n for (const tag of tags) {\n if (tag['resource_type'] === 'myaccount_user_folder') {\n const folder_payload = JSON.parse(Buffer.from(tag['tag_value'], 'base64').toString());\n content.push({\n name: folder_payload['folder'],\n color: folder_payload['color'],\n uuid: tag['resource_name'],\n parent: tag['tag_name'],\n created_at: tag['created_at']\n } as Folder)\n } else {\n content.push(\n {\n type: tag['resource_type'],\n identifier: tag['resource_name'],\n folder_uuid: tag['tag_name'],\n created_at: tag['created_at']\n } as FolderContent\n );\n }\n }\n\n return content;\n }\n\n /**\n * Add a book to a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addInternetbookToFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n return await this.addContentToFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Remove a book from a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param isbn The ISBN of the book.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeInternetbookFromFolder(\n {\n folder_uuid,\n isbn,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n isbn: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.removeContentFromFolder(\n {\n folder_uuid,\n resource_type: 'internetbook',\n resource_name: isbn,\n timeout\n },\n );\n }\n\n /**\n * Create a new folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return FolderContent\n **/\n async addContentToFolder(\n {\n folder_uuid,\n resource_type,\n resource_name,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<FolderContent> {\n const tag = await this.createTag(\n {\n tag: {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n tag_value: 'MYACCOUNT_USER_FOLDER'\n },\n timeout\n }\n );\n return {type: resource_type, identifier: resource_name, folder_uuid, created_at: tag['created_at']} as FolderContent;\n }\n\n /**\n * Remove a folder content element.\n *\n * @param folder_uuid The UUID of the folder.\n * @param resource_name The name of the resource.\n * @param resource_type The type of the resource.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async removeContentFromFolder(\n {\n folder_uuid,\n resource_name,\n resource_type,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n resource_name: string,\n resource_type: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: resource_type,\n resource_name: resource_name,\n tag_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete a folder.\n *\n * @param folder_uuid The UUID of the folder.\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteFolder(\n {\n folder_uuid,\n timeout = 3000\n }:\n {\n folder_uuid: string,\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n resource_name: folder_uuid,\n timeout\n }\n );\n }\n\n /**\n * Delete all folders. Note, this will not delete the content of the folders.\n *\n * @param timeout The timeout for the request in milliseconds.\n *\n * @return void\n **/\n async deleteAllFolders(\n {\n timeout = 3000\n }:\n {\n timeout?: number\n }\n ): Promise<void> {\n await this.deleteTag(\n {\n identity: await this.getIdentity(),\n resource_type: 'myaccount_user_folder',\n timeout\n }\n );\n }\n}\n\nexport default UserFolders;\n","import BaseService from './base_service.js';\n\nexport type AIChatRole = \"user\" | \"assistant\" | \"system\";\n\ntype GenericContext = Record<string, unknown>;\n\nexport interface AIChatMessage<\n ContextType extends GenericContext = GenericContext,\n> {\n role: AIChatRole;\n content: string;\n context?: ContextType;\n}\n\nexport interface AIChatMessageDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n role?: AIChatRole;\n content?: string;\n context?: ContextType;\n}\n\nexport interface AIChatCompletion<\n ContextType extends GenericContext = GenericContext,\n> {\n message: AIChatMessage;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionDelta<\n ContextType extends GenericContext = GenericContext,\n> {\n delta: AIChatMessageDelta;\n sessionState?: unknown;\n context?: ContextType;\n}\n\nexport interface AIChatCompletionOptions<\n ContextType extends GenericContext = GenericContext,\n> {\n context?: ContextType;\n sessionState?: unknown;\n}\n\nexport type AIChatCompletionRequest = {\n messages: AIChatMessage[];\n} & AIChatCompletionOptions;\n\n\nexport class AIBotService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://ai-bot-service.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://ai-bot-service-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/aibotservice`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n\n async constructChatUrl (\n {\n interactivityId,\n isbn,\n stream\n }:\n {\n interactivityId?: string,\n isbn?: string,\n stream: boolean\n }\n ): Promise<string> {\n if (interactivityId && isbn) \n {\n throw new Error(\"interactivityId and isbn are mutually exclusive\");\n }\n\n if (!interactivityId && !isbn) \n {\n throw new Error(\"Either interactivityId or isbn must be provided\");\n }\n\n let url = '';\n if (interactivityId) \n {\n url = `${this.getUrlPrefix()}/${interactivityId}/chat`;\n }\n\n if (isbn) \n {\n url = `${this.getUrlPrefix()}/interactivity_from_isbn/${isbn}`;\n }\n\n if (stream) {\n url += '/stream';\n }\n\n return url;\n }\n\n async chat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<AIChatCompletion> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: false});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n return response.json();\n }\n\n async streamingChat(\n {\n interactivityId,\n isbn,\n body,\n timeout = 10000\n }:\n {\n interactivityId?: string,\n isbn?: string,\n body: AIChatCompletionRequest,\n timeout?: number\n }\n ): Promise<ReadableStream<Uint8Array<ArrayBufferLike>>> {\n const url = await this.constructChatUrl({interactivityId, isbn, stream: true});\n\n const headers: HeadersInit = new Headers();\n\n headers.append('Content-Type', \"application/json\");\n const response = await this.postAsync({url, headers, body: JSON.stringify(body), timeout});\n const responseBody = response.body;\n if (!responseBody)\n {\n throw new Error(\"Response body is null\");\n }\n return responseBody;\n }\n}\n\nexport default AIBotService;\n","import BaseService from './base_service.js';\n\nexport interface QuizStartResponse {\n quizUnitId: number;\n}\n\nexport interface Quiz {\n quizId: number;\n quizName: string;\n quizDescription: string;\n quizFinished: boolean;\n questions: Question[];\n quizDeadline?: number;\n quizResultAvailable?: number;\n quizStartTime?: number;\n}\n\nexport interface Question {\n questionId: number;\n name: string;\n introText: string;\n caseSensitive?: boolean;\n shuffle: boolean;\n answerChecked: boolean;\n questionType: string;\n questionTypeId: number;\n mediafile: Mediafile;\n medias: Mediafile[];\n answers: Answer[];\n chosenAnswer: ChosenAnswer[] | null;\n description: string;\n freeText: string;\n scores?: Score;\n answerBins: {\n binindex: number;\n img: Mediafile;\n txt: string;\n }[];\n tokenized: Tokens[];\n 'chosenAnswer correctness': string;\n}\n\nexport interface FormattedQuestion extends Question {\n number: number;\n answerTime?: string | null;\n percentage: string;\n}\n\nexport interface Mediafile {\n id: number;\n placement: string;\n caption: string;\n altText: string;\n identifier: string;\n extension: string;\n mimeType: string;\n credit: string;\n}\n\nexport interface ChosenAnswer {\n id: number | number[];\n answerText: string;\n created?: number;\n position: number;\n mediafile: Mediafile;\n bins?: number[];\n bin?: number;\n answers?: Answer[];\n answerBins?: AnswerBins[];\n questionId: number;\n isCorrect: boolean;\n wordoption?: AnswerIcon;\n}\n\nexport interface AnswerBins {\n txt: string;\n binindex: number;\n img: Mediafile;\n}\n\nexport interface Answer {\n id: number | number[];\n answerText: string;\n isCorrect: boolean;\n position: number | number[];\n mediafile?: Mediafile;\n bins?: number[];\n inputText?: {\n [key: string]: InputText;\n };\n dropdown?: DropdownMap;\n tableData?: TableData;\n wordoptions?: WordOptions;\n wordoption?: AnswerIcon;\n answerOptions?: AnswerIcon[];\n questionId?: number;\n answerBins?: AnswerBins[];\n index?: number;\n}\n\nexport interface WordOptions {\n options: WordOptionsOption[];\n answerOptions?: string[] | AnswerIcon[];\n}\n\nexport interface WordOptionsOption {\n words: string;\n answers: string;\n position: number;\n}\n\nexport interface AnswerIcon {\n abbreviation: string;\n icon: string;\n description: string;\n display: string;\n}\n\nexport interface InputText {\n answerText: string;\n bins: number[];\n id?: number;\n correctText: string;\n isCorrect: boolean;\n position: number;\n index?: number;\n maxCorrectValue?: number;\n minCorrectValue?: number;\n}\n\nexport interface InputTextMap {\n [key: string]: InputText;\n}\n\nexport interface DropdownMap {\n [key: string]: Dropdown[];\n}\n\nexport interface Dropdown {\n option: string;\n isCorrect: boolean;\n position?: number;\n index?: number;\n}\n\nexport interface DropdownFormattedOption {\n answerId: number;\n options: Dropdown[];\n originalOptions: Dropdown[];\n}\n\nexport interface TableData {\n [key: string]: {\n [key: string]: TableDataColumn | string;\n };\n}\n\nexport interface TableDataColumn {\n correctText: string;\n isCorrect: boolean;\n position: number;\n options: Dropdown[];\n minCorrectValue?: number;\n maxCorrectValue?: number;\n}\n\nexport interface QuizResult {\n Problemdata: Question[];\n QuizSession?: {\n closesAt: string | null;\n description: string;\n name: string;\n opensAt: string | null;\n problems: number;\n quizSessionId: number;\n };\n QuizUnit?: {\n averageScore: number;\n finished: boolean;\n finishedAt: number | null;\n quizUnitId: number;\n startedAt: number | null;\n studentEkeysId: string;\n studentId: number;\n timeSpent: number;\n };\n Results: Results;\n}\n\nexport interface Results {\n 'Number of correct': number;\n 'Number of incorrect': number;\n 'Number of not answered': number;\n 'Number of partially correct': number;\n 'Number of questions': number;\n unitScore: CalculatedScore;\n}\n\nexport interface Score {\n 'Number of correct options': number;\n 'Number of correct options chosen': number;\n 'Number of options': number;\n 'Number of options chosen': number;\n 'Percentage score': number;\n 'Student has answered'?: boolean;\n 'Token check': Tokens[];\n}\n\nexport interface WordOptionsAnswer {\n answerId?: number;\n options?: (string | AnswerIcon)[];\n text: WordOptionsAnswerText | undefined;\n index: number;\n selected?: undefined | string | AnswerIcon;\n}\n\nexport interface WordOptionsAnswerText {\n answers: string;\n words: string;\n position: number;\n}\n\nexport interface Tokens {\n correctText: string;\n diffCheck: TokensDiffCheck[];\n numberOfTokenErrors: number;\n studentAnswerText: string;\n}\n\nexport interface TokensDiffCheck {\n error: boolean;\n studentWord: string;\n correctWord: string;\n}\n\nexport interface NewAnswer {\n answerText: string;\n bins: number[];\n id: number;\n isCorrect: boolean;\n position: number;\n questionId: number;\n}\n\nexport interface SaveAnswerResponse {\n Result: string;\n}\n\nexport interface SaveAnswer {\n 'question-id': number;\n 'question-type-id': number;\n 'answer-id'?: number[];\n 'answer-text'?: (string | { answers: string } | null)[];\n 'answer-position'?: number[];\n 'answer-bin'?: number[];\n 'answer-checked'?: boolean;\n}\n\nexport type QuizTextSettings = Record<string, string | number>;\n\nexport interface SharedQuizData {\n 'quiz-id'?: string | undefined;\n isbn?: string | undefined;\n title: string;\n description: string;\n 'quiz-open': number | null;\n 'quiz-close': number | null;\n 'result-available-time'?: number | null;\n 'extra-teachers': string[];\n}\n\nexport interface SharedTeacherQuiz {\n createdAt?: number;\n deactivatedProblems?: number[];\n extraTeachers?: string[];\n isArchived?: boolean;\n isExtraTeacher?: boolean;\n isPinned?: boolean;\n name?: string;\n problems: number;\n quizSessionId?: number;\n studentsFinished?: number;\n}\n\nexport interface SharedStudentQuiz {\n quizUnitId: number;\n quizSessionId: number;\n name: string;\n createdBy: string;\n startedAt: number | null;\n finishedAt: number | null;\n finished: boolean;\n}\n\nexport interface CalculatedScore {\n points: number;\n maxPoints: number;\n percentage: number;\n}\n\nexport interface QuizSession extends SharedTeacherQuiz {\n description?: string;\n opensAt: number | null;\n closesAt: number | null;\n quizUnits?: QuizUnit[];\n averageScores?: {\n byProblem: CalculatedScore[];\n overall: CalculatedScore;\n };\n}\n\nexport interface QuizUnit {\n quizUnitId: number;\n studentId: number;\n studentEkeysId: string;\n finished: boolean;\n finishedAt: number | null;\n startedAt: number | null;\n timeSpent: TimeSpent;\n unitScore: CalculatedScore;\n problemScores: ProblemScore[];\n}\n\nexport interface TimeSpent {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n}\n\nexport interface FormattedQuizUnit extends QuizUnit {\n formattedTimeSpent?: string;\n formattedFinishedAt?: string | null;\n formattedStartedAt?: string | null;\n percentage?: string;\n total?: string;\n}\n\nexport interface ProblemScore {\n mathproblem: number;\n questionTypeId: number;\n questionTypeString: string;\n score: Score;\n}\n\nexport type QuizTableAction = 'copy' | 'archive' | 'delete' | 'unarchive';\nexport type QuizTableItem =\n | SharedTeacherQuiz\n | FormattedQuizUnit\n | SharedStudentQuiz;\n\nexport type SearchableKeys = 'name';\n\nexport type ProblemAnswerState =\n | 'correct'\n | 'incorrect'\n | 'partially-correct'\n | 'unanswered';\n\nexport type QuizLocalState = {\n id: number;\n isLoading: boolean;\n isApiError: boolean;\n data: Quiz | null;\n originalData: Quiz | null;\n finished: boolean;\n results: QuizResult | null;\n instantFeedback: string | null;\n showAdvancedResults: boolean;\n};\n\n\n\nexport class QuizService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return 'https://api.iquiz.dk/api';\n case 'development':\n case 'local':\n case 'testing':\n return 'https://galecms.test.tibalo.dk/api';\n case 'test':\n return `https://localhost:3010/galeapi/api`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n \n private makeHeaders(extra?: Record<string, string>): Headers {\n const headers = new Headers();\n headers.append('Content-Type', 'application/json');\n\n if (extra) {\n for (const [key, val] of Object.entries(extra)) {\n headers.append(key, val);\n }\n }\n\n return headers;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Legacy Gale quizzes\n // ─────────────────────────────────────────────────────────────\n\n async checkActiveSession({\n isbn,\n quiz,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async startQuiz({\n isbn,\n quiz,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quiz: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizStartResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quiz}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/quiz/${quiz}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({ url, headers, body: '{}', timeout });\n return await res.json();\n }\n\n async getProblems({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async resetAnswer({\n isbn,\n quizUnitId,\n questionID,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n questionID: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}/question/${questionID}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async saveAnswer({\n isbn,\n quizUnitId,\n answer,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n answer: object;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SaveAnswerResponse> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.putAsync({\n url,\n headers,\n body: JSON.stringify(answer),\n timeout\n });\n\n return await res.json();\n }\n\n async finishQuiz({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/finish`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify({}),\n timeout\n });\n\n return await res.json();\n }\n\n async getResults({\n isbn,\n quizUnitId,\n shared,\n extraHeaders,\n timeout = 3000\n }: {\n isbn: string;\n quizUnitId: number;\n shared?: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = shared\n ? `${this.getUrlPrefix()}/shared/student/${quizUnitId}/result`\n : `${this.getUrlPrefix()}/isbn/${isbn}/student/overview/${quizUnitId}`;\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n // ─────────────────────────────────────────────────────────────\n // Shared quizzes\n // ─────────────────────────────────────────────────────────────\n\n async createSharedQuiz({\n quizData,\n extraHeaders,\n timeout = 3000\n }: {\n quizData: SharedQuizData;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async copyEditSharedQuiz({\n quizSessionId,\n quizData,\n action,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizData: SharedQuizData;\n action: 'edit' | 'copy';\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ quizSessionId: number }> {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = action === 'edit' ? 'PUT' : 'POST';\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PUT'\n ? await this.putAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n })\n : await this.postAsync({\n url,\n headers,\n body: JSON.stringify(quizData),\n timeout\n });\n\n return await res.json();\n }\n\n async getTeachersQuizProblems({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<Quiz> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/problems`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersUnitOverview({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: number;\n quizUnitId: number;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizResult> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async activateDeactivateQuestion({\n quizSessionId,\n questionId,\n activate,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n questionId: number;\n activate: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quiz/${quizSessionId}/question/${questionId}`;\n const method = activate ? 'PATCH' : 'DELETE';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'PATCH'\n ? await this.patchAsync({\n url,\n headers,\n body: null,\n timeout\n })\n : await this.deleteAsync({ url, headers, timeout });\n\n return await res.json();\n }\n\n async getTeachersQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<{ SharedQuizzes: SharedTeacherQuiz[] }> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getStudentsQuizzes({\n extraHeaders,\n timeout = 3000\n }: {\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<SharedStudentQuiz[]> {\n const url = `${this.getUrlPrefix()}/shared/student/quizzes`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async getTeachersQuiz({\n quizSessionId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }): Promise<QuizSession> {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.getAsync({ url, headers, timeout });\n return await res.json();\n }\n\n async toggleArchiveQuiz({\n quizSessionId,\n archive,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n archive: boolean;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/quiz/${quizSessionId}`;\n const method = archive ? 'DELETE' : 'PATCH';\n\n const headers = this.makeHeaders(extraHeaders);\n\n const res =\n method === 'DELETE'\n ? await this.deleteAsync({ url, headers, timeout })\n : await this.postAsync({\n url,\n headers,\n body: null,\n timeout\n });\n\n return await res.json();\n }\n\n async deleteSharedQuizUnit({\n quizSessionId,\n quizUnitId,\n extraHeaders,\n timeout = 3000\n }: {\n quizSessionId: string;\n quizUnitId: string;\n extraHeaders?: Record<string, string>;\n timeout?: number;\n }) {\n const url = `${this.getUrlPrefix()}/shared/teacher/quizzes/${quizSessionId}/units/${quizUnitId}`;\n const headers = this.makeHeaders(extraHeaders);\n\n const res = await this.deleteAsync({ url, headers, timeout });\n return await res.json();\n }\n}\n\nexport default QuizService;\n","import BaseService from './base_service.js';\n\nexport class WritingTaskService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://writingtask.services.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://staging-writingtask.services.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/writingtask`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\nexport default WritingTaskService;\n","import BaseService from './base_service.js';\n\nexport class SolrProxyService extends BaseService {\n discoverUrlPrefix(): string {\n switch (this.environment) {\n case 'production':\n return `https://solr-proxy.eu-west-1.${this.baseDomain}`;\n case 'development':\n case 'local':\n case 'testing':\n return `https://solr-proxy-staging.eu-west-1.${this.baseDomain}`;\n case 'test':\n return `https://localhost:3010/services/solrproxy`;\n default:\n throw new Error(`Unknown environment: ${this.environment}`);\n }\n }\n}\n\nexport default SolrProxyService;\n"],"mappings":"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","names":["SSMLSpeechSpeeds","HighlightResultType","Error","Error"]}
|
package/package.json
CHANGED