tering-serieuze-sdk 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
8
8
  // src/cache/abstractCache.ts
9
9
  import { get } from "stack-trace";
10
10
  var CacheLifetime = /* @__PURE__ */ ((CacheLifetime2) => {
11
- CacheLifetime2[CacheLifetime2["Day"] = 86400] = "Day";
12
- CacheLifetime2[CacheLifetime2["Week"] = 604800] = "Week";
11
+ CacheLifetime2[CacheLifetime2["Day"] = 864e5] = "Day";
12
+ CacheLifetime2[CacheLifetime2["Week"] = 6048e5] = "Week";
13
13
  return CacheLifetime2;
14
14
  })(CacheLifetime || {});
15
15
  var AbstractCache = class {
@@ -195,6 +195,21 @@ var _AuthModule = class extends BaseModule {
195
195
  async removeToken() {
196
196
  return this.cache.remove(_AuthModule.cacheKey);
197
197
  }
198
+ async getRegistrationOptions(registrationToken) {
199
+ return this.api.get(`auth/registration-options/${registrationToken}`);
200
+ }
201
+ async getAuthenticationOptions() {
202
+ return this.api.get("auth/authentication-options");
203
+ }
204
+ async verifyRegistration(registrationToken, registrationResponse) {
205
+ return this.api.post(
206
+ `auth/verify-registration/${registrationToken}`,
207
+ registrationResponse
208
+ );
209
+ }
210
+ async verifyAuthentication(token, response) {
211
+ return this.api.post(`auth/verify-authentication/${token}`, response);
212
+ }
198
213
  };
199
214
  var AuthModule = _AuthModule;
200
215
  __publicField(AuthModule, "cacheKey", "TSS-TOKEN");
@@ -207,7 +222,7 @@ var JingleModule = class extends BaseModule {
207
222
  return this.api.get("jingle/grouped");
208
223
  },
209
224
  "getGrouped",
210
- 604800 /* Week */
225
+ 6048e5 /* Week */
211
226
  );
212
227
  }
213
228
  async getAll() {
@@ -216,7 +231,7 @@ var JingleModule = class extends BaseModule {
216
231
  return this.api.get("jingle");
217
232
  },
218
233
  "getAll",
219
- 604800 /* Week */
234
+ 6048e5 /* Week */
220
235
  );
221
236
  }
222
237
  async play(playJingleDto) {
@@ -242,7 +257,7 @@ var UserModule = class extends BaseModule {
242
257
  });
243
258
  }
244
259
  async setWindowState(setWindowStateDto) {
245
- return this.api.put("user/windowState", setWindowStateDto);
260
+ return this.api.putPossibleEmptyResponse("user/windowState", setWindowStateDto);
246
261
  }
247
262
  };
248
263
 
@@ -296,23 +311,33 @@ var TssApi = class {
296
311
  return response;
297
312
  }
298
313
  async fetchPossibleEmptyResponse(method, url, dto) {
299
- const response = await this.fetch(url, {
314
+ return this.fetch(url, {
300
315
  method,
301
316
  body: JSON.stringify(dto)
302
317
  });
303
- if (response.status === 204) {
304
- return;
305
- }
306
- return response.json();
307
318
  }
308
319
  async get(url) {
309
320
  const response = await this.fetch(url);
310
321
  return response.json();
311
322
  }
312
323
  async post(url, dto) {
324
+ const response = await this.fetchPossibleEmptyResponse("POST", url, dto);
325
+ if (response === void 0) {
326
+ throw new Error("Response was undefined");
327
+ }
328
+ return await response.json();
329
+ }
330
+ async postPossibleEmptyResponse(url, dto) {
313
331
  return this.fetchPossibleEmptyResponse("POST", url, dto);
314
332
  }
315
333
  async put(url, dto) {
334
+ const response = await this.fetchPossibleEmptyResponse("PUT", url, dto);
335
+ if (response === void 0) {
336
+ throw new Error("Response was undefined");
337
+ }
338
+ return await response.json();
339
+ }
340
+ async putPossibleEmptyResponse(url, dto) {
316
341
  return this.fetchPossibleEmptyResponse("PUT", url, dto);
317
342
  }
318
343
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cache/abstractCache.ts", "../src/cache/cookieCache.ts", "../src/cache/filesystemCache.ts", "../src/cache/nullCache.ts", "../src/cache/onePasswordCache.ts", "../src/api/base.ts", "../src/api/auth.ts", "../src/api/jingle.ts", "../src/api/user.ts", "../src/index.ts"],
4
- "sourcesContent": ["import { get } from \"stack-trace\";\n\nexport enum CacheLifetime {\n Day = 60 * 60 * 24,\n Week = 60 * 60 * 24 * 7,\n}\n\nexport abstract class AbstractCache {\n constructor(protected cacheName: string) {}\n\n public abstract cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T>;\n\n public abstract get<T>(key: string): Promise<T | undefined>;\n\n public abstract set<T>(key: string, value: T, lifetime?: number): void;\n\n public abstract remove(key: string): void;\n\n public abstract clear(): void;\n\n public getCacheKey(): string {\n const errorMessage = \"Could not determine cache key. Please provide a key manually.\";\n const trace = get();\n if (trace.length < 3) {\n throw new Error(errorMessage);\n }\n\n const functionName = get()[2].getFunctionName();\n if (!functionName) {\n throw new Error(errorMessage);\n }\n\n return functionName;\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\n\nexport class CookieCache extends AbstractCache {\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n throw new Error(\"Not implemented, use get() and set()\");\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n if (document.cookie.includes(`${key}=`)) {\n return document.cookie.split(`${key}=`)[1]?.split(\";\")[0] as T;\n }\n\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {\n const expires = lifetime ? new Date(Date.now() + lifetime).toUTCString() : \"\";\n document.cookie = `${key}=${value}; expires=${expires}; path=/; samesite=strict; secure`;\n }\n\n public remove(key: string): void {\n document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n\n public clear(): void {\n throw new Error(\"Not implemented, use remove()\");\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\n\ntype CacheItem = {\n value: any;\n expiresAt?: number;\n};\n\nexport class FilesystemCache extends AbstractCache {\n protected initialized = false;\n\n protected state: { [key: string]: CacheItem } = {};\n\n public async cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n key = key ?? this.getCacheKey();\n\n const cachedValue = await this.get<T>(key);\n if (cachedValue) {\n return cachedValue;\n }\n\n const result = await callbackWhenEmpty();\n this.set(key, result, lifetime);\n return result;\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n if (!this.initialized) {\n await this._initialize();\n }\n\n const expires = this.state[key]?.expiresAt;\n if (Object.keys(this.state).includes(key) && (expires === undefined || expires > Date.now())) {\n return this.state[key].value;\n }\n\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {\n const expiresAt = lifetime ? Date.now() + lifetime : undefined;\n const content: CacheItem = { value };\n if (expiresAt) {\n content.expiresAt = expiresAt;\n }\n this.state[key] = content;\n this.writeState();\n }\n\n public remove(key: string): void {\n delete this.state[key];\n this.writeState();\n }\n\n public clear(): void {\n this.state = {};\n fs.unlinkSync(this.getFilePath());\n }\n\n public getFilePath() {\n return path.join(os.homedir(), \".tss\", `${this.cacheName}.json`);\n }\n\n protected _initialize() {\n this.initialized = true;\n if (fs.existsSync(this.getFilePath())) {\n this.state = JSON.parse(fs.readFileSync(this.getFilePath(), \"utf8\"));\n }\n }\n\n protected writeState() {\n if (!fs.existsSync(path.dirname(this.getFilePath()))) {\n fs.mkdirSync(path.dirname(this.getFilePath()));\n }\n\n fs.writeFileSync(this.getFilePath(), JSON.stringify(this.state));\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\n\nexport class NullCache extends AbstractCache {\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n return callbackWhenEmpty();\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport util from \"util\";\nimport child_process from \"child_process\";\n\n// TODO error handling en lifetime\nexport class OnePasswordCache extends AbstractCache {\n protected asyncExec = util.promisify(child_process.exec);\n\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n throw new Error(\"Not implemented, use get() and set()\");\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n const { stdout, stderr } = await this.asyncExec(`op item get \"${key}\" --fields label=credential --format json`);\n\n if (stderr) {\n console.log(stderr);\n throw new Error(\"ERROR\");\n }\n\n return JSON.parse(stdout).value;\n }\n\n public async set<T>(key: string, value: T, lifetime?: number): Promise<void> {\n let action = `op item edit '${key}' 'credential=${value}'`;\n\n try {\n const t = await this.get(key);\n } catch (e) {\n action = `op item create --category=\"API Credential\" --title ${key} 'credential=${value}'`;\n }\n\n const { stdout, stderr } = await this.asyncExec(action);\n\n if (stderr) {\n console.log(stderr);\n throw new Error(\"ERROR\");\n }\n }\n\n public async remove(key: string): Promise<void> {\n await this.asyncExec(`op item delete '${key}'`);\n }\n\n public clear(): void {\n // Loopje maken en heel 1password leeg maken?\n }\n}\n", "import { AbstractCache } from \"../cache\";\nimport { TssApi } from \"../index\";\n\nexport class BaseModule {\n constructor(protected api: TssApi, protected cache: AbstractCache) {}\n\n public getCache() {\n return this.cache;\n }\n\n public setCache(cache: AbstractCache) {\n this.cache = cache;\n }\n}\n", "import { BaseModule } from \"./base\";\n\nexport class AuthModule extends BaseModule {\n public static cacheKey = \"TSS-TOKEN\";\n\n async getToken(): Promise<string | undefined> {\n return this.cache.get(AuthModule.cacheKey);\n }\n\n async setToken(token: string, lifetime?: number) {\n return this.cache.set(AuthModule.cacheKey, token, lifetime);\n }\n\n async setCode(code: string) {\n // TODO any ?!\n const { accessToken } = await this.api.post<any>(`auth/setCode?code=${code}`, {});\n return accessToken;\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n}\n", "import type { JingleFolder, Jingle, PlayJingleDto, BigBrotherItem } from \"tering-serieuze-types\";\nimport { BaseModule } from \"./base\";\nimport { CacheLifetime } from \"../cache\";\n\nexport class JingleModule extends BaseModule {\n async getGrouped() {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<JingleFolder[]>(\"jingle/grouped\");\n },\n \"getGrouped\",\n CacheLifetime.Week\n );\n }\n\n async getAll() {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<Jingle[]>(\"jingle\");\n },\n \"getAll\",\n CacheLifetime.Week\n );\n }\n\n async play(playJingleDto: PlayJingleDto) {\n console.log(`Playing jingle ${playJingleDto.folder}/${playJingleDto.file}`);\n return this.api.post(\"jingle/play\", playJingleDto);\n }\n\n async getBigBrotherData() {\n return this.api.get<BigBrotherItem[]>(\"jingle/bigbrother\");\n }\n}\n", "import { BaseModule } from \"./base\";\nimport type { SetWindowStateDto, User } from \"tering-serieuze-types\";\n\nexport class UserModule extends BaseModule {\n async get(userId?: string) {\n return this.cache.cacheOrGet(() => {\n const userIdParam = userId ? `/${userId}` : \"\";\n return this.api.get<User>(`user${userIdParam}`);\n });\n }\n\n async getAll() {\n return this.cache.cacheOrGet(() => {\n return this.api.get<User[]>(\"user/all\");\n });\n }\n\n async setWindowState(setWindowStateDto: SetWindowStateDto) {\n return this.api.put(\"user/windowState\", setWindowStateDto);\n }\n}\n", "import { AbstractCache, NullCache } from \"./cache\";\nimport { AuthModule, JingleModule, UserModule } from \"./api\";\nimport type { Dto } from \"tering-serieuze-types\";\n\nexport * from \"./api\";\nexport * from \"./cache\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\nexport interface SDKRequestInit extends RequestInit {\n method?: HttpMethod;\n}\n\nexport enum CacheType {\n jingle = \"jingle\",\n auth = \"auth\",\n user = \"user\",\n}\n\nexport type ApiConfiguration = {\n API_URL: string;\n};\n\nexport type CacheConfiguration = {\n [key in keyof typeof CacheType]?: AbstractCache;\n};\n\nexport class ErrorResponse extends Error {\n constructor(public readonly status: number, public readonly message: string) {\n super();\n }\n}\n\nexport class TssApi {\n auth: AuthModule;\n\n jingle: JingleModule;\n\n user: UserModule;\n\n constructor(protected readonly apiConfiguration: ApiConfiguration, cacheConfiguration?: CacheConfiguration) {\n this.jingle = new JingleModule(this, cacheConfiguration?.jingle ?? new NullCache(\"jingle\"));\n this.auth = new AuthModule(this, cacheConfiguration?.auth ?? new NullCache(\"auth\"));\n this.user = new UserModule(this, cacheConfiguration?.user ?? new NullCache(\"user\"));\n }\n\n async fetch(url: string, config: SDKRequestInit = {}) {\n config.method = config.method ?? \"GET\";\n config.headers = {\n ...config.headers,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${await this.auth.getToken()}`,\n };\n\n const apiPrefix = this.apiConfiguration.API_URL;\n\n if (apiPrefix.match(/^https?:\\/\\/localhost/) !== null && typeof process !== \"undefined\" && process.env) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n }\n\n const fullUrl = `${apiPrefix}/api/${url}`;\n console.log(\"Fetching url\", fullUrl);\n\n let response;\n try {\n response = await fetch(fullUrl, config);\n } catch (e) {\n throw new ErrorResponse(503, \"API erg dood\");\n }\n\n if (response.status >= 400) {\n const error = await response.json();\n throw new ErrorResponse(error.statusCode, error.message ?? error.error);\n }\n\n return response;\n }\n\n protected async fetchPossibleEmptyResponse<T>(method: HttpMethod, url: string, dto: Dto) {\n const response = await this.fetch(url, {\n method,\n body: JSON.stringify(dto),\n });\n\n if (response.status === 204) {\n return;\n }\n\n return response.json() as Promise<T>;\n }\n\n async get<T>(url: string) {\n const response = await this.fetch(url);\n return response.json() as Promise<T>;\n }\n\n async post<T>(url: string, dto: Dto) {\n return this.fetchPossibleEmptyResponse<T>(\"POST\", url, dto);\n }\n\n async put<T>(url: string, dto: Dto) {\n return this.fetchPossibleEmptyResponse<T>(\"PUT\", url, dto);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { get } from \"stack-trace\";\n\nexport enum CacheLifetime {\n Day = 60 * 60 * 24 * 1000,\n Week = 60 * 60 * 24 * 7 * 1000,\n}\n\nexport abstract class AbstractCache {\n constructor(protected cacheName: string) {}\n\n public abstract cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T>;\n\n public abstract get<T>(key: string): Promise<T | undefined>;\n\n public abstract set<T>(key: string, value: T, lifetime?: number): void;\n\n public abstract remove(key: string): void;\n\n public abstract clear(): void;\n\n public getCacheKey(): string {\n const errorMessage = \"Could not determine cache key. Please provide a key manually.\";\n const trace = get();\n if (trace.length < 3) {\n throw new Error(errorMessage);\n }\n\n const functionName = get()[2].getFunctionName();\n if (!functionName) {\n throw new Error(errorMessage);\n }\n\n return functionName;\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\n\nexport class CookieCache extends AbstractCache {\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n throw new Error(\"Not implemented, use get() and set()\");\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n if (document.cookie.includes(`${key}=`)) {\n return document.cookie.split(`${key}=`)[1]?.split(\";\")[0] as T;\n }\n\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {\n const expires = lifetime ? new Date(Date.now() + lifetime).toUTCString() : \"\";\n document.cookie = `${key}=${value}; expires=${expires}; path=/; samesite=strict; secure`;\n }\n\n public remove(key: string): void {\n document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n }\n\n public clear(): void {\n throw new Error(\"Not implemented, use remove()\");\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\n\ntype CacheItem = {\n value: any;\n expiresAt?: number;\n};\n\nexport class FilesystemCache extends AbstractCache {\n protected initialized = false;\n\n protected state: { [key: string]: CacheItem } = {};\n\n public async cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n key = key ?? this.getCacheKey();\n\n const cachedValue = await this.get<T>(key);\n if (cachedValue) {\n return cachedValue;\n }\n\n const result = await callbackWhenEmpty();\n this.set(key, result, lifetime);\n return result;\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n if (!this.initialized) {\n await this._initialize();\n }\n\n const expires = this.state[key]?.expiresAt;\n if (Object.keys(this.state).includes(key) && (expires === undefined || expires > Date.now())) {\n return this.state[key].value;\n }\n\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {\n const expiresAt = lifetime ? Date.now() + lifetime : undefined;\n const content: CacheItem = { value };\n if (expiresAt) {\n content.expiresAt = expiresAt;\n }\n this.state[key] = content;\n this.writeState();\n }\n\n public remove(key: string): void {\n delete this.state[key];\n this.writeState();\n }\n\n public clear(): void {\n this.state = {};\n fs.unlinkSync(this.getFilePath());\n }\n\n public getFilePath() {\n return path.join(os.homedir(), \".tss\", `${this.cacheName}.json`);\n }\n\n protected _initialize() {\n this.initialized = true;\n if (fs.existsSync(this.getFilePath())) {\n this.state = JSON.parse(fs.readFileSync(this.getFilePath(), \"utf8\"));\n }\n }\n\n protected writeState() {\n if (!fs.existsSync(path.dirname(this.getFilePath()))) {\n fs.mkdirSync(path.dirname(this.getFilePath()));\n }\n\n fs.writeFileSync(this.getFilePath(), JSON.stringify(this.state));\n }\n}\n", "import { AbstractCache } from \"./abstractCache\";\n\nexport class NullCache extends AbstractCache {\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n return callbackWhenEmpty();\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n return undefined;\n }\n\n public set<T>(key: string, value: T, lifetime?: number): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport util from \"util\";\nimport child_process from \"child_process\";\n\n// TODO error handling en lifetime\nexport class OnePasswordCache extends AbstractCache {\n protected asyncExec = util.promisify(child_process.exec);\n\n public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {\n throw new Error(\"Not implemented, use get() and set()\");\n }\n\n public async get<T>(key: string): Promise<T | undefined> {\n const { stdout, stderr } = await this.asyncExec(`op item get \"${key}\" --fields label=credential --format json`);\n\n if (stderr) {\n console.log(stderr);\n throw new Error(\"ERROR\");\n }\n\n return JSON.parse(stdout).value;\n }\n\n public async set<T>(key: string, value: T, lifetime?: number): Promise<void> {\n let action = `op item edit '${key}' 'credential=${value}'`;\n\n try {\n const t = await this.get(key);\n } catch (e) {\n action = `op item create --category=\"API Credential\" --title ${key} 'credential=${value}'`;\n }\n\n const { stdout, stderr } = await this.asyncExec(action);\n\n if (stderr) {\n console.log(stderr);\n throw new Error(\"ERROR\");\n }\n }\n\n public async remove(key: string): Promise<void> {\n await this.asyncExec(`op item delete '${key}'`);\n }\n\n public clear(): void {\n // Loopje maken en heel 1password leeg maken?\n }\n}\n", "import { AbstractCache } from \"../cache\";\nimport { TssApi } from \"../index\";\n\nexport class BaseModule {\n constructor(protected api: TssApi, protected cache: AbstractCache) {}\n\n public getCache() {\n return this.cache;\n }\n\n public setCache(cache: AbstractCache) {\n this.cache = cache;\n }\n}\n", "import { BaseModule } from \"./base\";\nimport { AuthenticationOptionsDto, VerificationResponseDto } from \"tering-serieuze-types\";\nimport {\n AuthenticationResponseJSON,\n PublicKeyCredentialCreationOptionsJSON,\n RegistrationResponseJSON,\n} from \"@simplewebauthn/typescript-types\";\n\nexport class AuthModule extends BaseModule {\n public static cacheKey = \"TSS-TOKEN\";\n\n async getToken(): Promise<string | undefined> {\n return this.cache.get(AuthModule.cacheKey);\n }\n\n async setToken(token: string, lifetime?: number) {\n return this.cache.set(AuthModule.cacheKey, token, lifetime);\n }\n\n async setCode(code: string) {\n // TODO any ?!\n const { accessToken } = await this.api.post<any>(`auth/setCode?code=${code}`, {});\n return accessToken;\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n\n async getRegistrationOptions(registrationToken: string) {\n return this.api.get<PublicKeyCredentialCreationOptionsJSON>(`auth/registration-options/${registrationToken}`);\n }\n\n async getAuthenticationOptions() {\n return this.api.get<AuthenticationOptionsDto>(\"auth/authentication-options\");\n }\n\n async verifyRegistration(registrationToken: string, registrationResponse: RegistrationResponseJSON) {\n return this.api.post<VerificationResponseDto>(\n `auth/verify-registration/${registrationToken}`,\n registrationResponse\n );\n }\n\n async verifyAuthentication(token: string, response: AuthenticationResponseJSON) {\n return this.api.post<VerificationResponseDto>(`auth/verify-authentication/${token}`, response);\n }\n}\n", "import type { JingleFolder, Jingle, PlayJingleDto, BigBrotherItem } from \"tering-serieuze-types\";\nimport { BaseModule } from \"./base\";\nimport { CacheLifetime } from \"../cache\";\n\nexport class JingleModule extends BaseModule {\n async getGrouped() {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<JingleFolder[]>(\"jingle/grouped\");\n },\n \"getGrouped\",\n CacheLifetime.Week\n );\n }\n\n async getAll() {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<Jingle[]>(\"jingle\");\n },\n \"getAll\",\n CacheLifetime.Week\n );\n }\n\n async play(playJingleDto: PlayJingleDto) {\n console.log(`Playing jingle ${playJingleDto.folder}/${playJingleDto.file}`);\n return this.api.post(\"jingle/play\", playJingleDto);\n }\n\n async getBigBrotherData() {\n return this.api.get<BigBrotherItem[]>(\"jingle/bigbrother\");\n }\n}\n", "import { BaseModule } from \"./base\";\nimport type { SetWindowStateDto, User } from \"tering-serieuze-types\";\n\nexport class UserModule extends BaseModule {\n async get(userId?: string) {\n return this.cache.cacheOrGet(() => {\n const userIdParam = userId ? `/${userId}` : \"\";\n return this.api.get<User>(`user${userIdParam}`);\n });\n }\n\n async getAll() {\n return this.cache.cacheOrGet(() => {\n return this.api.get<User[]>(\"user/all\");\n });\n }\n\n async setWindowState(setWindowStateDto: SetWindowStateDto) {\n return this.api.putPossibleEmptyResponse(\"user/windowState\", setWindowStateDto);\n }\n}\n", "import { AbstractCache, NullCache } from \"./cache\";\nimport { AuthModule, JingleModule, UserModule } from \"./api\";\nimport type { Dto } from \"tering-serieuze-types\";\n\nexport * from \"./api\";\nexport * from \"./cache\";\n\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\nexport interface SDKRequestInit extends RequestInit {\n method?: HttpMethod;\n}\n\nexport enum CacheType {\n jingle = \"jingle\",\n auth = \"auth\",\n user = \"user\",\n}\n\nexport type ApiConfiguration = {\n API_URL: string;\n};\n\nexport type CacheConfiguration = {\n [key in keyof typeof CacheType]?: AbstractCache;\n};\n\nexport class ErrorResponse extends Error {\n constructor(public readonly status: number, public readonly message: string) {\n super();\n }\n}\n\nexport class TssApi {\n auth: AuthModule;\n\n jingle: JingleModule;\n\n user: UserModule;\n\n constructor(protected readonly apiConfiguration: ApiConfiguration, cacheConfiguration?: CacheConfiguration) {\n this.jingle = new JingleModule(this, cacheConfiguration?.jingle ?? new NullCache(\"jingle\"));\n this.auth = new AuthModule(this, cacheConfiguration?.auth ?? new NullCache(\"auth\"));\n this.user = new UserModule(this, cacheConfiguration?.user ?? new NullCache(\"user\"));\n }\n\n async fetch(url: string, config: SDKRequestInit = {}) {\n config.method = config.method ?? \"GET\";\n config.headers = {\n ...config.headers,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${await this.auth.getToken()}`,\n };\n\n const apiPrefix = this.apiConfiguration.API_URL;\n\n if (apiPrefix.match(/^https?:\\/\\/localhost/) !== null && typeof process !== \"undefined\" && process.env) {\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;\n }\n\n const fullUrl = `${apiPrefix}/api/${url}`;\n console.log(\"Fetching url\", fullUrl);\n\n let response;\n try {\n response = await fetch(fullUrl, config);\n } catch (e) {\n throw new ErrorResponse(503, \"API erg dood\");\n }\n\n if (response.status >= 400) {\n const error = await response.json();\n throw new ErrorResponse(error.statusCode, error.message ?? error.error);\n }\n\n return response;\n }\n\n protected async fetchPossibleEmptyResponse<T>(method: HttpMethod, url: string, dto: Dto) {\n return this.fetch(url, {\n method,\n body: JSON.stringify(dto),\n });\n }\n\n async get<T>(url: string) {\n const response = await this.fetch(url);\n return response.json() as Promise<T>;\n }\n\n async post<T>(url: string, dto: Dto) {\n const response = await this.fetchPossibleEmptyResponse<T>(\"POST\", url, dto);\n if (response === undefined) {\n throw new Error(\"Response was undefined\");\n }\n return (await response.json()) as Promise<T>;\n }\n\n async postPossibleEmptyResponse(url: string, dto: Dto) {\n return this.fetchPossibleEmptyResponse(\"POST\", url, dto);\n }\n\n async put<T>(url: string, dto: Dto) {\n const response = await this.fetchPossibleEmptyResponse<T>(\"PUT\", url, dto);\n if (response === undefined) {\n throw new Error(\"Response was undefined\");\n }\n return (await response.json()) as Promise<T>;\n }\n\n async putPossibleEmptyResponse(url: string, dto: Dto) {\n return this.fetchPossibleEmptyResponse(\"PUT\", url, dto);\n }\n}\n"],
5
+ "mappings": ";;;;;;;;AAAA,SAAS,WAAW;AAEb,IAAK,gBAAL,kBAAKA,mBAAL;AACH,EAAAA,8BAAA,SAAM,SAAN;AACA,EAAAA,8BAAA,UAAO,UAAP;AAFQ,SAAAA;AAAA,GAAA;AAKL,IAAe,gBAAf,MAA6B;AAAA,EAChC,YAAsB,WAAmB;AAAnB;AAAA,EAAoB;AAAA,EAYnC,cAAsB;AACzB,UAAM,eAAe;AACrB,UAAM,QAAQ,IAAI;AAClB,QAAI,MAAM,SAAS,GAAG;AAClB,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAEA,UAAM,eAAe,IAAI,EAAE,CAAC,EAAE,gBAAgB;AAC9C,QAAI,CAAC,cAAc;AACf,YAAM,IAAI,MAAM,YAAY;AAAA,IAChC;AAEA,WAAO;AAAA,EACX;AACJ;;;AChCO,IAAM,cAAN,cAA0B,cAAc;AAAA,EACpC,WAAc,mBAAqC,KAAc,UAA+B;AACnG,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAAA,EAEA,MAAa,IAAO,KAAqC;AACrD,QAAI,SAAS,OAAO,SAAS,GAAG,MAAM,GAAG;AACrC,aAAO,SAAS,OAAO,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAAA,IAC5D;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,IAAO,KAAa,OAAU,UAAyB;AAC1D,UAAM,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,EAAE,YAAY,IAAI;AAC3E,aAAS,SAAS,GAAG,OAAO,kBAAkB;AAAA,EAClD;AAAA,EAEO,OAAO,KAAmB;AAC7B,aAAS,SAAS,GAAG;AAAA,EACzB;AAAA,EAEO,QAAc;AACjB,UAAM,IAAI,MAAM,+BAA+B;AAAA,EACnD;AACJ;;;AC1BA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAOR,IAAM,kBAAN,cAA8B,cAAc;AAAA,EACrC,cAAc;AAAA,EAEd,QAAsC,CAAC;AAAA,EAEjD,MAAa,WAAc,mBAAqC,KAAc,UAA+B;AACzG,UAAM,OAAO,KAAK,YAAY;AAE9B,UAAM,cAAc,MAAM,KAAK,IAAO,GAAG;AACzC,QAAI,aAAa;AACb,aAAO;AAAA,IACX;AAEA,UAAM,SAAS,MAAM,kBAAkB;AACvC,SAAK,IAAI,KAAK,QAAQ,QAAQ;AAC9B,WAAO;AAAA,EACX;AAAA,EAEA,MAAa,IAAO,KAAqC;AACrD,QAAI,CAAC,KAAK,aAAa;AACnB,YAAM,KAAK,YAAY;AAAA,IAC3B;AAEA,UAAM,UAAU,KAAK,MAAM,GAAG,GAAG;AACjC,QAAI,OAAO,KAAK,KAAK,KAAK,EAAE,SAAS,GAAG,MAAM,YAAY,UAAa,UAAU,KAAK,IAAI,IAAI;AAC1F,aAAO,KAAK,MAAM,GAAG,EAAE;AAAA,IAC3B;AAEA,WAAO;AAAA,EACX;AAAA,EAEO,IAAO,KAAa,OAAU,UAAyB;AAC1D,UAAM,YAAY,WAAW,KAAK,IAAI,IAAI,WAAW;AACrD,UAAM,UAAqB,EAAE,MAAM;AACnC,QAAI,WAAW;AACX,cAAQ,YAAY;AAAA,IACxB;AACA,SAAK,MAAM,GAAG,IAAI;AAClB,SAAK,WAAW;AAAA,EACpB;AAAA,EAEO,OAAO,KAAmB;AAC7B,WAAO,KAAK,MAAM,GAAG;AACrB,SAAK,WAAW;AAAA,EACpB;AAAA,EAEO,QAAc;AACjB,SAAK,QAAQ,CAAC;AACd,OAAG,WAAW,KAAK,YAAY,CAAC;AAAA,EACpC;AAAA,EAEO,cAAc;AACjB,WAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,gBAAgB;AAAA,EACnE;AAAA,EAEU,cAAc;AACpB,SAAK,cAAc;AACnB,QAAI,GAAG,WAAW,KAAK,YAAY,CAAC,GAAG;AACnC,WAAK,QAAQ,KAAK,MAAM,GAAG,aAAa,KAAK,YAAY,GAAG,MAAM,CAAC;AAAA,IACvE;AAAA,EACJ;AAAA,EAEU,aAAa;AACnB,QAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,KAAK,YAAY,CAAC,CAAC,GAAG;AAClD,SAAG,UAAU,KAAK,QAAQ,KAAK,YAAY,CAAC,CAAC;AAAA,IACjD;AAEA,OAAG,cAAc,KAAK,YAAY,GAAG,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,EACnE;AACJ;;;AC7EO,IAAM,YAAN,cAAwB,cAAc;AAAA,EAClC,WAAc,mBAAqC,KAAc,UAA+B;AACnG,WAAO,kBAAkB;AAAA,EAC7B;AAAA,EAEA,MAAa,IAAO,KAAqC;AACrD,WAAO;AAAA,EACX;AAAA,EAEO,IAAO,KAAa,OAAU,UAAyB;AAAA,EAAC;AAAA,EAExD,OAAO,KAAmB;AAAA,EAAC;AAAA,EAE3B,QAAc;AAAA,EAAC;AAC1B;;;ACfA,OAAO,UAAU;AACjB,OAAO,mBAAmB;AAGnB,IAAM,mBAAN,cAA+B,cAAc;AAAA,EACtC,YAAY,KAAK,UAAU,cAAc,IAAI;AAAA,EAEhD,WAAc,mBAAqC,KAAc,UAA+B;AACnG,UAAM,IAAI,MAAM,sCAAsC;AAAA,EAC1D;AAAA,EAEA,MAAa,IAAO,KAAqC;AACrD,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,KAAK,UAAU,gBAAgB,8CAA8C;AAE9G,QAAI,QAAQ;AACR,cAAQ,IAAI,MAAM;AAClB,YAAM,IAAI,MAAM,OAAO;AAAA,IAC3B;AAEA,WAAO,KAAK,MAAM,MAAM,EAAE;AAAA,EAC9B;AAAA,EAEA,MAAa,IAAO,KAAa,OAAU,UAAkC;AACzE,QAAI,SAAS,iBAAiB,oBAAoB;AAElD,QAAI;AACA,YAAM,IAAI,MAAM,KAAK,IAAI,GAAG;AAAA,IAChC,SAAS,GAAP;AACE,eAAS,sDAAsD,mBAAmB;AAAA,IACtF;AAEA,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,KAAK,UAAU,MAAM;AAEtD,QAAI,QAAQ;AACR,cAAQ,IAAI,MAAM;AAClB,YAAM,IAAI,MAAM,OAAO;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,MAAa,OAAO,KAA4B;AAC5C,UAAM,KAAK,UAAU,mBAAmB,MAAM;AAAA,EAClD;AAAA,EAEO,QAAc;AAAA,EAErB;AACJ;;;AC5CO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAAsB,KAAuB,OAAsB;AAA7C;AAAuB;AAAA,EAAuB;AAAA,EAE7D,WAAW;AACd,WAAO,KAAK;AAAA,EAChB;AAAA,EAEO,SAAS,OAAsB;AAClC,SAAK,QAAQ;AAAA,EACjB;AACJ;;;ACLO,IAAM,cAAN,cAAyB,WAAW;AAAA,EAGvC,MAAM,WAAwC;AAC1C,WAAO,KAAK,MAAM,IAAI,YAAW,QAAQ;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAS,OAAe,UAAmB;AAC7C,WAAO,KAAK,MAAM,IAAI,YAAW,UAAU,OAAO,QAAQ;AAAA,EAC9D;AAAA,EAEA,MAAM,QAAQ,MAAc;AAExB,UAAM,EAAE,YAAY,IAAI,MAAM,KAAK,IAAI,KAAU,qBAAqB,QAAQ,CAAC,CAAC;AAChF,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc;AAChB,WAAO,KAAK,MAAM,OAAO,YAAW,QAAQ;AAAA,EAChD;AAAA,EAEA,MAAM,uBAAuB,mBAA2B;AACpD,WAAO,KAAK,IAAI,IAA4C,6BAA6B,mBAAmB;AAAA,EAChH;AAAA,EAEA,MAAM,2BAA2B;AAC7B,WAAO,KAAK,IAAI,IAA8B,6BAA6B;AAAA,EAC/E;AAAA,EAEA,MAAM,mBAAmB,mBAA2B,sBAAgD;AAChG,WAAO,KAAK,IAAI;AAAA,MACZ,4BAA4B;AAAA,MAC5B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,qBAAqB,OAAe,UAAsC;AAC5E,WAAO,KAAK,IAAI,KAA8B,8BAA8B,SAAS,QAAQ;AAAA,EACjG;AACJ;AAvCO,IAAM,aAAN;AACH,cADS,YACK,YAAW;;;ACLtB,IAAM,eAAN,cAA2B,WAAW;AAAA,EACzC,MAAM,aAAa;AACf,WAAO,KAAK,MAAM;AAAA,MACd,MAAM;AACF,eAAO,KAAK,IAAI,IAAoB,gBAAgB;AAAA,MACxD;AAAA,MACA;AAAA;AAAA,IAEJ;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS;AACX,WAAO,KAAK,MAAM;AAAA,MACd,MAAM;AACF,eAAO,KAAK,IAAI,IAAc,QAAQ;AAAA,MAC1C;AAAA,MACA;AAAA;AAAA,IAEJ;AAAA,EACJ;AAAA,EAEA,MAAM,KAAK,eAA8B;AACrC,YAAQ,IAAI,kBAAkB,cAAc,UAAU,cAAc,MAAM;AAC1E,WAAO,KAAK,IAAI,KAAK,eAAe,aAAa;AAAA,EACrD;AAAA,EAEA,MAAM,oBAAoB;AACtB,WAAO,KAAK,IAAI,IAAsB,mBAAmB;AAAA,EAC7D;AACJ;;;AC9BO,IAAM,aAAN,cAAyB,WAAW;AAAA,EACvC,MAAM,IAAI,QAAiB;AACvB,WAAO,KAAK,MAAM,WAAW,MAAM;AAC/B,YAAM,cAAc,SAAS,IAAI,WAAW;AAC5C,aAAO,KAAK,IAAI,IAAU,OAAO,aAAa;AAAA,IAClD,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,SAAS;AACX,WAAO,KAAK,MAAM,WAAW,MAAM;AAC/B,aAAO,KAAK,IAAI,IAAY,UAAU;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,eAAe,mBAAsC;AACvD,WAAO,KAAK,IAAI,yBAAyB,oBAAoB,iBAAiB;AAAA,EAClF;AACJ;;;ACPO,IAAK,YAAL,kBAAKC,eAAL;AACH,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,UAAO;AAHC,SAAAA;AAAA,GAAA;AAcL,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACrC,YAA4B,QAAgC,SAAiB;AACzE,UAAM;AADkB;AAAgC;AAAA,EAE5D;AACJ;AAEO,IAAM,SAAN,MAAa;AAAA,EAOhB,YAA+B,kBAAoC,oBAAyC;AAA7E;AAC3B,SAAK,SAAS,IAAI,aAAa,MAAM,oBAAoB,UAAU,IAAI,UAAU,QAAQ,CAAC;AAC1F,SAAK,OAAO,IAAI,WAAW,MAAM,oBAAoB,QAAQ,IAAI,UAAU,MAAM,CAAC;AAClF,SAAK,OAAO,IAAI,WAAW,MAAM,oBAAoB,QAAQ,IAAI,UAAU,MAAM,CAAC;AAAA,EACtF;AAAA,EAVA;AAAA,EAEA;AAAA,EAEA;AAAA,EAQA,MAAM,MAAM,KAAa,SAAyB,CAAC,GAAG;AAClD,WAAO,SAAS,OAAO,UAAU;AACjC,WAAO,UAAU;AAAA,MACb,GAAG,OAAO;AAAA,MACV,gBAAgB;AAAA,MAChB,eAAe,UAAU,MAAM,KAAK,KAAK,SAAS;AAAA,IACtD;AAEA,UAAM,YAAY,KAAK,iBAAiB;AAExC,QAAI,UAAU,MAAM,uBAAuB,MAAM,QAAQ,OAAO,YAAY,eAAe,QAAQ,KAAK;AACpG,cAAQ,IAAI,+BAA+B;AAAA,IAC/C;AAEA,UAAM,UAAU,GAAG,iBAAiB;AACpC,YAAQ,IAAI,gBAAgB,OAAO;AAEnC,QAAI;AACJ,QAAI;AACA,iBAAW,MAAM,MAAM,SAAS,MAAM;AAAA,IAC1C,SAAS,GAAP;AACE,YAAM,IAAI,cAAc,KAAK,cAAc;AAAA,IAC/C;AAEA,QAAI,SAAS,UAAU,KAAK;AACxB,YAAM,QAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,IAAI,cAAc,MAAM,YAAY,MAAM,WAAW,MAAM,KAAK;AAAA,IAC1E;AAEA,WAAO;AAAA,EACX;AAAA,EAEA,MAAgB,2BAA8B,QAAoB,KAAa,KAAU;AACrF,WAAO,KAAK,MAAM,KAAK;AAAA,MACnB;AAAA,MACA,MAAM,KAAK,UAAU,GAAG;AAAA,IAC5B,CAAC;AAAA,EACL;AAAA,EAEA,MAAM,IAAO,KAAa;AACtB,UAAM,WAAW,MAAM,KAAK,MAAM,GAAG;AACrC,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,KAAQ,KAAa,KAAU;AACjC,UAAM,WAAW,MAAM,KAAK,2BAA8B,QAAQ,KAAK,GAAG;AAC1E,QAAI,aAAa,QAAW;AACxB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,0BAA0B,KAAa,KAAU;AACnD,WAAO,KAAK,2BAA2B,QAAQ,KAAK,GAAG;AAAA,EAC3D;AAAA,EAEA,MAAM,IAAO,KAAa,KAAU;AAChC,UAAM,WAAW,MAAM,KAAK,2BAA8B,OAAO,KAAK,GAAG;AACzE,QAAI,aAAa,QAAW;AACxB,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC5C;AACA,WAAQ,MAAM,SAAS,KAAK;AAAA,EAChC;AAAA,EAEA,MAAM,yBAAyB,KAAa,KAAU;AAClD,WAAO,KAAK,2BAA2B,OAAO,KAAK,GAAG;AAAA,EAC1D;AACJ;",
6
6
  "names": ["CacheLifetime", "CacheType"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tering-serieuze-sdk",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "description": "Teringserieuze sdk",
5
5
  "author": "Frank",
6
6
  "main": "dist/index.mjs",
@@ -26,12 +26,13 @@
26
26
  "stack-trace": "^1.0.0-pre2"
27
27
  },
28
28
  "devDependencies": {
29
+ "@simplewebauthn/typescript-types": "^7.0.0",
29
30
  "@types/node": "^18.15.3",
30
31
  "@types/stack-trace": "^0.0.30",
31
32
  "@vitest/coverage-c8": "^0.28.5",
32
33
  "esbuild": "^0.17.12",
33
34
  "prettier": "^2.8.1",
34
- "tering-serieuze-types": "^1.11.0",
35
+ "tering-serieuze-types": "^1.13.0",
35
36
  "vitest": "^0.28.5"
36
37
  }
37
38
  }
package/src/api/auth.ts CHANGED
@@ -1,4 +1,10 @@
1
1
  import { BaseModule } from "./base";
2
+ import { AuthenticationOptionsDto, VerificationResponseDto } from "tering-serieuze-types";
3
+ import {
4
+ AuthenticationResponseJSON,
5
+ PublicKeyCredentialCreationOptionsJSON,
6
+ RegistrationResponseJSON,
7
+ } from "@simplewebauthn/typescript-types";
2
8
 
3
9
  export class AuthModule extends BaseModule {
4
10
  public static cacheKey = "TSS-TOKEN";
@@ -20,4 +26,23 @@ export class AuthModule extends BaseModule {
20
26
  async removeToken() {
21
27
  return this.cache.remove(AuthModule.cacheKey);
22
28
  }
29
+
30
+ async getRegistrationOptions(registrationToken: string) {
31
+ return this.api.get<PublicKeyCredentialCreationOptionsJSON>(`auth/registration-options/${registrationToken}`);
32
+ }
33
+
34
+ async getAuthenticationOptions() {
35
+ return this.api.get<AuthenticationOptionsDto>("auth/authentication-options");
36
+ }
37
+
38
+ async verifyRegistration(registrationToken: string, registrationResponse: RegistrationResponseJSON) {
39
+ return this.api.post<VerificationResponseDto>(
40
+ `auth/verify-registration/${registrationToken}`,
41
+ registrationResponse
42
+ );
43
+ }
44
+
45
+ async verifyAuthentication(token: string, response: AuthenticationResponseJSON) {
46
+ return this.api.post<VerificationResponseDto>(`auth/verify-authentication/${token}`, response);
47
+ }
23
48
  }
package/src/api/user.ts CHANGED
@@ -16,6 +16,6 @@ export class UserModule extends BaseModule {
16
16
  }
17
17
 
18
18
  async setWindowState(setWindowStateDto: SetWindowStateDto) {
19
- return this.api.put("user/windowState", setWindowStateDto);
19
+ return this.api.putPossibleEmptyResponse("user/windowState", setWindowStateDto);
20
20
  }
21
21
  }
@@ -1,8 +1,8 @@
1
1
  import { get } from "stack-trace";
2
2
 
3
3
  export enum CacheLifetime {
4
- Day = 60 * 60 * 24,
5
- Week = 60 * 60 * 24 * 7,
4
+ Day = 60 * 60 * 24 * 1000,
5
+ Week = 60 * 60 * 24 * 7 * 1000,
6
6
  }
7
7
 
8
8
  export abstract class AbstractCache {
package/src/index.ts CHANGED
@@ -77,16 +77,10 @@ export class TssApi {
77
77
  }
78
78
 
79
79
  protected async fetchPossibleEmptyResponse<T>(method: HttpMethod, url: string, dto: Dto) {
80
- const response = await this.fetch(url, {
80
+ return this.fetch(url, {
81
81
  method,
82
82
  body: JSON.stringify(dto),
83
83
  });
84
-
85
- if (response.status === 204) {
86
- return;
87
- }
88
-
89
- return response.json() as Promise<T>;
90
84
  }
91
85
 
92
86
  async get<T>(url: string) {
@@ -95,10 +89,26 @@ export class TssApi {
95
89
  }
96
90
 
97
91
  async post<T>(url: string, dto: Dto) {
98
- return this.fetchPossibleEmptyResponse<T>("POST", url, dto);
92
+ const response = await this.fetchPossibleEmptyResponse<T>("POST", url, dto);
93
+ if (response === undefined) {
94
+ throw new Error("Response was undefined");
95
+ }
96
+ return (await response.json()) as Promise<T>;
97
+ }
98
+
99
+ async postPossibleEmptyResponse(url: string, dto: Dto) {
100
+ return this.fetchPossibleEmptyResponse("POST", url, dto);
99
101
  }
100
102
 
101
103
  async put<T>(url: string, dto: Dto) {
102
- return this.fetchPossibleEmptyResponse<T>("PUT", url, dto);
104
+ const response = await this.fetchPossibleEmptyResponse<T>("PUT", url, dto);
105
+ if (response === undefined) {
106
+ throw new Error("Response was undefined");
107
+ }
108
+ return (await response.json()) as Promise<T>;
109
+ }
110
+
111
+ async putPossibleEmptyResponse(url: string, dto: Dto) {
112
+ return this.fetchPossibleEmptyResponse("PUT", url, dto);
103
113
  }
104
114
  }