tering-serieuze-sdk 3.10.1 → 3.12.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/biome.json +104 -0
- package/dist/index.mjs +6 -1
- package/dist/index.mjs.map +2 -2
- package/index.d.ts +3 -3
- package/package.json +4 -2
- package/src/api/auth.ts +14 -15
- package/src/api/base.ts +4 -1
- package/src/api/jingle.ts +6 -6
- package/src/api/k8s.ts +5 -0
- package/src/api/user.ts +1 -1
- package/src/cache/cookieCache.ts +5 -4
- package/src/cache/filesystemCache.ts +2 -2
- package/src/cache/nullCache.ts +12 -6
- package/src/cache/onePasswordCache.ts +5 -5
- package/src/index.ts +21 -15
- package/test/api/base.test.ts +1 -1
- package/test/api/jingle.test.ts +1 -1
- package/test/cache/filesystemCache.test.ts +5 -5
- package/tsconfig.json +16 -16
- package/types/environment.d.ts +1 -0
- package/.prettierrc +0 -6
package/biome.json
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
|
|
3
|
+
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
|
|
4
|
+
"files": {
|
|
5
|
+
"includes": ["**/*.ts", "**/*.js", "**/*.mts", "**/*.json", "**/*.md", "!package*.json"]
|
|
6
|
+
},
|
|
7
|
+
"formatter": {
|
|
8
|
+
"enabled": true,
|
|
9
|
+
"indentStyle": "space",
|
|
10
|
+
"indentWidth": 4,
|
|
11
|
+
"lineWidth": 120
|
|
12
|
+
},
|
|
13
|
+
"linter": {
|
|
14
|
+
"enabled": true,
|
|
15
|
+
"rules": {
|
|
16
|
+
"recommended": true,
|
|
17
|
+
"complexity": {
|
|
18
|
+
"noExcessiveCognitiveComplexity": "error",
|
|
19
|
+
"noExcessiveNestedTestSuites": "error",
|
|
20
|
+
"noUselessStringConcat": "error"
|
|
21
|
+
},
|
|
22
|
+
"correctness": {
|
|
23
|
+
"noUndeclaredVariables": "error"
|
|
24
|
+
},
|
|
25
|
+
"nursery": {
|
|
26
|
+
"noAwaitInLoop": "error",
|
|
27
|
+
"noUnassignedVariables": "error",
|
|
28
|
+
"useNumericSeparators": "error",
|
|
29
|
+
"useObjectSpread": "error",
|
|
30
|
+
"useParseIntRadix": "error",
|
|
31
|
+
"useReadonlyClassProperties": "error"
|
|
32
|
+
},
|
|
33
|
+
"performance": {
|
|
34
|
+
"noBarrelFile": "error",
|
|
35
|
+
"noDelete": "error",
|
|
36
|
+
"noNamespaceImport": "error",
|
|
37
|
+
"noReExportAll": "error"
|
|
38
|
+
},
|
|
39
|
+
"style": {
|
|
40
|
+
"noCommonJs": "error",
|
|
41
|
+
"noInferrableTypes": "error",
|
|
42
|
+
"noNamespace": "error",
|
|
43
|
+
"noNestedTernary": "error",
|
|
44
|
+
"noNonNullAssertion": "error",
|
|
45
|
+
"noParameterAssign": "error",
|
|
46
|
+
"noSubstr": "error",
|
|
47
|
+
"noUnusedTemplateLiteral": "error",
|
|
48
|
+
"noUselessElse": "error",
|
|
49
|
+
"noYodaExpression": "error",
|
|
50
|
+
"useArrayLiterals": "error",
|
|
51
|
+
"useAsConstAssertion": "error",
|
|
52
|
+
"useBlockStatements": "error",
|
|
53
|
+
"useCollapsedIf": "error",
|
|
54
|
+
"useConsistentArrayType": "error",
|
|
55
|
+
"useConsistentBuiltinInstantiation": "error",
|
|
56
|
+
"useConst": "error",
|
|
57
|
+
"useDefaultParameterLast": "error",
|
|
58
|
+
"useDefaultSwitchClause": "error",
|
|
59
|
+
"useExplicitLengthCheck": "error",
|
|
60
|
+
"useForOf": "error",
|
|
61
|
+
"useImportType": "off",
|
|
62
|
+
"useLiteralEnumMembers": "error",
|
|
63
|
+
"useNodejsImportProtocol": "error",
|
|
64
|
+
"useNumberNamespace": "error",
|
|
65
|
+
"useShorthandAssign": "error",
|
|
66
|
+
"useShorthandFunctionType": "error",
|
|
67
|
+
"useThrowNewError": "error",
|
|
68
|
+
"useThrowOnlyError": "error",
|
|
69
|
+
"useTrimStartEnd": "error"
|
|
70
|
+
},
|
|
71
|
+
"suspicious": {
|
|
72
|
+
"noDuplicateTestHooks": "error",
|
|
73
|
+
"noEmptyBlockStatements": "error",
|
|
74
|
+
"noEvolvingTypes": "error",
|
|
75
|
+
"noExportsInTest": "error",
|
|
76
|
+
"noFocusedTests": "error",
|
|
77
|
+
"noMisplacedAssertion": "error",
|
|
78
|
+
"noSkippedTests": "error",
|
|
79
|
+
"noVar": "error",
|
|
80
|
+
"useAwait": "error",
|
|
81
|
+
"useErrorMessage": "error",
|
|
82
|
+
"useNumberToFixedDigitsArgument": "error"
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
"domains": {
|
|
86
|
+
"test": "all"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"javascript": {
|
|
90
|
+
"parser": {
|
|
91
|
+
"unsafeParameterDecoratorsEnabled": true
|
|
92
|
+
},
|
|
93
|
+
"formatter": {
|
|
94
|
+
"quoteStyle": "single"
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"assist": {
|
|
98
|
+
"actions": {
|
|
99
|
+
"source": {
|
|
100
|
+
"organizeImports": "on"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
package/dist/index.mjs
CHANGED
|
@@ -343,6 +343,9 @@ var JingleModule = class extends BaseModule {
|
|
|
343
343
|
|
|
344
344
|
// src/api/k8s.ts
|
|
345
345
|
var K8sModule = class extends BaseModule {
|
|
346
|
+
getPods() {
|
|
347
|
+
return this.api.get("k8s");
|
|
348
|
+
}
|
|
346
349
|
async deletePod(podName) {
|
|
347
350
|
return this.api.delete(`k8s/${podName}`);
|
|
348
351
|
}
|
|
@@ -397,9 +400,11 @@ var TssApi = class {
|
|
|
397
400
|
config.method = config.method ?? "GET";
|
|
398
401
|
config.headers = {
|
|
399
402
|
...config.headers,
|
|
400
|
-
"Content-Type": "application/json",
|
|
401
403
|
Authorization: `Bearer ${await this.auth.getToken()}`
|
|
402
404
|
};
|
|
405
|
+
if (!config.headers["Content-Type"]) {
|
|
406
|
+
config.headers["Content-Type"] = config.body ? "application/json" : "text/plain";
|
|
407
|
+
}
|
|
403
408
|
const apiPrefix = this.apiConfiguration.API_URL;
|
|
404
409
|
if (apiPrefix.match(/^https?:\/\/localhost/) !== null && typeof process !== "undefined" && process.env) {
|
|
405
410
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/stack-trace/index.js", "../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/k8s.ts", "../src/api/user.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\n", "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 if (fs.existsSync(this.getFilePath())) {\n fs.unlinkSync(this.getFilePath());\n }\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, type TokenContent } from 'tering-serieuze-types';\nimport type {\n AuthenticationResponseJSON,\n PublicKeyCredentialCreationOptionsJSON,\n RegistrationResponseJSON,\n} from '@simplewebauthn/types';\n\nexport function parseJwt<T>(token: string): T {\n let jsonPayload;\n\n if (typeof Buffer !== 'undefined') {\n jsonPayload = Buffer.from(token.split('.')[1], 'base64').toString();\n } else {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n jsonPayload = decodeURIComponent(\n window\n .atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(''),\n );\n }\n\n return JSON.parse(jsonPayload) as T;\n}\n\nexport class AuthModule extends BaseModule {\n public static cacheKey = 'TSS-TOKEN';\n\n async getToken(): Promise<string | undefined> {\n return process.env.TSS_TOKEN ?? 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}`, {}, { credentials: 'include' });\n return accessToken;\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n\n async getSessionId() {\n const token = await this.getToken();\n const { sessionId } = parseJwt<TokenContent>(token ?? '');\n return sessionId;\n }\n\n async removeSession(sessionId?: string) {\n const session = sessionId ?? (await this.getSessionId());\n await this.api.delete(`session/${session}`, { credentials: 'include' });\n }\n\n async logout() {\n await this.removeSession();\n await this.removeToken();\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 { credentials: 'include' },\n );\n }\n\n async verifyAuthentication(token: string, response: AuthenticationResponseJSON) {\n return this.api.post<VerificationResponseDto>(`auth/verify-authentication/${token}`, response, {\n credentials: 'include',\n });\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(): Promise<JingleFolder[]> {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<JingleFolder[]>('jingle/grouped');\n },\n 'getGrouped',\n CacheLifetime.Day,\n );\n }\n\n async getAll(): Promise<Jingle[]> {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<Jingle[]>('jingle');\n },\n 'getAll',\n CacheLifetime.Day,\n );\n }\n\n async getRecentlyAdded(): Promise<Jingle[]> {\n const jingles = await this.getAll();\n return jingles.sort((a, b) => b.mtime - a.mtime).slice(0, 30);\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(): Promise<BigBrotherItem[]> {\n return this.api.get<BigBrotherItem[]>('jingle/bigbrother');\n }\n\n async find(query: string, jingles: Jingle[] = []): Promise<Jingle[]> {\n jingles = jingles.length ? jingles : await this.getAll();\n\n const queryParts = query.split(' ');\n const matches = jingles.filter((jingle) =>\n queryParts.every((queryPart) => (jingle.folder + '/' + jingle.file).includes(queryPart)),\n );\n\n return matches.sort((a, b) => {\n const aScore = a.keywords.filter((keyword) => query.includes(keyword)).length;\n const bScore = b.keywords.filter((keyword) => query.includes(keyword)).length;\n\n return bScore - aScore;\n });\n }\n}\n", "import { BaseModule } from './base';\n\nexport class K8sModule extends BaseModule {\n async deletePod(podName: string) {\n return this.api.delete(`k8s/${podName}`);\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, K8sModule, 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 k8s = 'k8s',\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 jingle: JingleModule;\n k8s: K8sModule;\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.k8s = new K8sModule(this, cacheConfiguration?.k8s ?? new NullCache('k8s'));\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>(\n method: HttpMethod,\n url: string,\n dto: Dto,\n config: SDKRequestInit = {},\n ) {\n return this.fetch(url, {\n method,\n ...config,\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, config: SDKRequestInit = {}) {\n const response = await this.fetchPossibleEmptyResponse<T>('POST', url, dto, config);\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 async delete<T>(url: string, config: SDKRequestInit = {}) {\n return this.fetch(url, {\n method: 'DELETE',\n ...config,\n });\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["export function get(belowFn) {\r\n const oldLimit = Error.stackTraceLimit;\r\n Error.stackTraceLimit = Infinity;\r\n\r\n const dummyObject = {};\r\n\r\n const v8Handler = Error.prepareStackTrace;\r\n Error.prepareStackTrace = function(dummyObject, v8StackTrace) {\r\n return v8StackTrace;\r\n };\r\n Error.captureStackTrace(dummyObject, belowFn || get);\r\n\r\n const v8StackTrace = dummyObject.stack;\r\n Error.prepareStackTrace = v8Handler;\r\n Error.stackTraceLimit = oldLimit;\r\n\r\n return v8StackTrace;\r\n}\r\n\r\nexport function parse(err) {\r\n if (!err.stack) {\r\n return [];\r\n }\r\n\r\n const lines = err.stack.split('\\n').slice(1);\r\n return lines\r\n .map(function(line) {\r\n if (line.match(/^\\s*[-]{4,}$/)) {\r\n return createParsedCallSite({\r\n fileName: line,\r\n lineNumber: null,\r\n functionName: null,\r\n typeName: null,\r\n methodName: null,\r\n columnNumber: null,\r\n 'native': null,\r\n });\r\n }\r\n\r\n const lineMatch = line.match(/at (?:(.+?)\\s+\\()?(?:(.+?):(\\d+)(?::(\\d+))?|([^)]+))\\)?/);\r\n if (!lineMatch) {\r\n return;\r\n }\r\n\r\n let object = null;\r\n let method = null;\r\n let functionName = null;\r\n let typeName = null;\r\n let methodName = null;\r\n let isNative = (lineMatch[5] === 'native');\r\n\r\n if (lineMatch[1]) {\r\n functionName = lineMatch[1];\r\n let methodStart = functionName.lastIndexOf('.');\r\n if (functionName[methodStart-1] == '.')\r\n methodStart--;\r\n if (methodStart > 0) {\r\n object = functionName.substr(0, methodStart);\r\n method = functionName.substr(methodStart + 1);\r\n const objectEnd = object.indexOf('.Module');\r\n if (objectEnd > 0) {\r\n functionName = functionName.substr(objectEnd + 1);\r\n object = object.substr(0, objectEnd);\r\n }\r\n }\r\n }\r\n\r\n if (method) {\r\n typeName = object;\r\n methodName = method;\r\n }\r\n\r\n if (method === '<anonymous>') {\r\n methodName = null;\r\n functionName = null;\r\n }\r\n\r\n const properties = {\r\n fileName: lineMatch[2] || null,\r\n lineNumber: parseInt(lineMatch[3], 10) || null,\r\n functionName: functionName,\r\n typeName: typeName,\r\n methodName: methodName,\r\n columnNumber: parseInt(lineMatch[4], 10) || null,\r\n 'native': isNative,\r\n };\r\n\r\n return createParsedCallSite(properties);\r\n })\r\n .filter(function(callSite) {\r\n return !!callSite;\r\n });\r\n}\r\n\r\nfunction CallSite(properties) {\r\n for (const property in properties) {\r\n this[property] = properties[property];\r\n }\r\n}\r\n\r\nconst strProperties = [\r\n 'this',\r\n 'typeName',\r\n 'functionName',\r\n 'methodName',\r\n 'fileName',\r\n 'lineNumber',\r\n 'columnNumber',\r\n 'function',\r\n 'evalOrigin'\r\n];\r\n\r\nconst boolProperties = [\r\n 'topLevel',\r\n 'eval',\r\n 'native',\r\n 'constructor'\r\n];\r\n\r\nstrProperties.forEach(function (property) {\r\n CallSite.prototype[property] = null;\r\n CallSite.prototype['get' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nboolProperties.forEach(function (property) {\r\n CallSite.prototype[property] = false;\r\n CallSite.prototype['is' + property[0].toUpperCase() + property.substr(1)] = function () {\r\n return this[property];\r\n }\r\n});\r\n\r\nfunction createParsedCallSite(properties) {\r\n return new CallSite(properties);\r\n}\r\n", "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 if (fs.existsSync(this.getFilePath())) {\n fs.unlinkSync(this.getFilePath());\n }\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, type TokenContent } from 'tering-serieuze-types';\nimport type {\n AuthenticationResponseJSON,\n PublicKeyCredentialCreationOptionsJSON,\n RegistrationResponseJSON,\n} from '@simplewebauthn/types';\n\nexport function parseJwt<T>(token: string): T {\n let jsonPayload;\n\n if (typeof Buffer !== 'undefined') {\n jsonPayload = Buffer.from(token.split('.')[1], 'base64').toString();\n } else {\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n jsonPayload = decodeURIComponent(\n window\n .atob(base64)\n .split('')\n .map(function (c) {\n return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n })\n .join(''),\n );\n }\n\n return JSON.parse(jsonPayload) as T;\n}\n\nexport class AuthModule extends BaseModule {\n public static cacheKey = 'TSS-TOKEN';\n\n async getToken(): Promise<string | undefined> {\n return process.env.TSS_TOKEN ?? 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}`, {}, { credentials: 'include' });\n return accessToken;\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n\n async getSessionId() {\n const token = await this.getToken();\n const { sessionId } = parseJwt<TokenContent>(token ?? '');\n return sessionId;\n }\n\n async removeSession(sessionId?: string) {\n const session = sessionId ?? (await this.getSessionId());\n await this.api.delete(`session/${session}`, { credentials: 'include' });\n }\n\n async logout() {\n await this.removeSession();\n await this.removeToken();\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 { credentials: 'include' },\n );\n }\n\n async verifyAuthentication(token: string, response: AuthenticationResponseJSON) {\n return this.api.post<VerificationResponseDto>(`auth/verify-authentication/${token}`, response, {\n credentials: 'include',\n });\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(): Promise<JingleFolder[]> {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<JingleFolder[]>('jingle/grouped');\n },\n 'getGrouped',\n CacheLifetime.Day,\n );\n }\n\n async getAll(): Promise<Jingle[]> {\n return this.cache.cacheOrGet(\n () => {\n return this.api.get<Jingle[]>('jingle');\n },\n 'getAll',\n CacheLifetime.Day,\n );\n }\n\n async getRecentlyAdded(): Promise<Jingle[]> {\n const jingles = await this.getAll();\n return jingles.sort((a, b) => b.mtime - a.mtime).slice(0, 30);\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(): Promise<BigBrotherItem[]> {\n return this.api.get<BigBrotherItem[]>('jingle/bigbrother');\n }\n\n async find(query: string, jingles: Jingle[] = []): Promise<Jingle[]> {\n jingles = jingles.length ? jingles : await this.getAll();\n\n const queryParts = query.split(' ');\n const matches = jingles.filter((jingle) =>\n queryParts.every((queryPart) => (jingle.folder + '/' + jingle.file).includes(queryPart)),\n );\n\n return matches.sort((a, b) => {\n const aScore = a.keywords.filter((keyword) => query.includes(keyword)).length;\n const bScore = b.keywords.filter((keyword) => query.includes(keyword)).length;\n\n return bScore - aScore;\n });\n }\n}\n", "import { BaseModule } from './base';\nimport type { Pod } from 'tering-serieuze-types';\n\nexport class K8sModule extends BaseModule {\n getPods() {\n return this.api.get<Pod[]>('k8s');\n }\n\n async deletePod(podName: string) {\n return this.api.delete(`k8s/${podName}`);\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, K8sModule, 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 k8s = 'k8s',\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 jingle: JingleModule;\n k8s: K8sModule;\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.k8s = new K8sModule(this, cacheConfiguration?.k8s ?? new NullCache('k8s'));\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 Authorization: `Bearer ${await this.auth.getToken()}`,\n };\n\n // @ts-ignore\n if (!config.headers['Content-Type']) {\n // @ts-ignore\n config.headers['Content-Type'] = config.body ? 'application/json' : 'text/plain';\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>(\n method: HttpMethod,\n url: string,\n dto: Dto,\n config: SDKRequestInit = {},\n ) {\n return this.fetch(url, {\n method,\n ...config,\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, config: SDKRequestInit = {}) {\n const response = await this.fetchPossibleEmptyResponse<T>('POST', url, dto, config);\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 async delete<T>(url: string, config: SDKRequestInit = {}) {\n return this.fetch(url, {\n method: 'DELETE',\n ...config,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["dummyObject", "v8StackTrace", "CacheLifetime", "CacheType"]
|
|
7
7
|
}
|
package/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
1
|
+
export * from './src';
|
|
2
|
+
export * from './src/api';
|
|
3
|
+
export * from './src/cache';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tering-serieuze-sdk",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.12.0",
|
|
4
4
|
"description": "Teringserieuze sdk",
|
|
5
5
|
"author": "Frank",
|
|
6
6
|
"main": "dist/index.mjs",
|
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
"type": "module",
|
|
10
10
|
"scripts": {
|
|
11
11
|
"test": "API_URL=https://localhost:8081 vitest",
|
|
12
|
+
"lint": "biome ci . --error-on-warnings",
|
|
12
13
|
"coverage": "vitest run --coverage",
|
|
13
14
|
"dev": "esbuild src/index.ts --bundle --platform=node --outfile=dist/index.mjs --packages=external --sourcemap=external --format=esm --watch",
|
|
15
|
+
"prebuild": "npm run lint && npm run test",
|
|
14
16
|
"build": "esbuild src/index.ts --bundle --platform=node --outfile=dist/index.mjs --sourcemap=external --format=esm",
|
|
15
17
|
"webstorm-integration": "vitest --watch --reporter=dot --reporter=json --outputFile=.vitest-result.json",
|
|
16
18
|
"version": "npm run build && git add -A dist"
|
|
@@ -29,11 +31,11 @@
|
|
|
29
31
|
"stack-trace": "^1.0.0-pre2"
|
|
30
32
|
},
|
|
31
33
|
"devDependencies": {
|
|
34
|
+
"@biomejs/biome": "^2.1.2",
|
|
32
35
|
"@simplewebauthn/types": "^12.0.0",
|
|
33
36
|
"@types/node": "^18.19.4",
|
|
34
37
|
"@vitest/coverage-c8": "^0.28.5",
|
|
35
38
|
"esbuild": "^0.17.12",
|
|
36
|
-
"prettier": "^2.8.1",
|
|
37
39
|
"tering-serieuze-types": "^1.24.0",
|
|
38
40
|
"vitest": "^0.28.5"
|
|
39
41
|
}
|
package/src/api/auth.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { BaseModule } from './base';
|
|
2
|
-
import { AuthenticationOptionsDto, VerificationResponseDto, type TokenContent } from 'tering-serieuze-types';
|
|
3
1
|
import type {
|
|
4
2
|
AuthenticationResponseJSON,
|
|
5
3
|
PublicKeyCredentialCreationOptionsJSON,
|
|
6
4
|
RegistrationResponseJSON,
|
|
7
5
|
} from '@simplewebauthn/types';
|
|
6
|
+
import { AuthenticationOptionsDto, type TokenContent, VerificationResponseDto } from 'tering-serieuze-types';
|
|
7
|
+
import { BaseModule } from './base';
|
|
8
8
|
|
|
9
9
|
export function parseJwt<T>(token: string): T {
|
|
10
|
-
let jsonPayload;
|
|
10
|
+
let jsonPayload = '';
|
|
11
11
|
|
|
12
12
|
if (typeof Buffer !== 'undefined') {
|
|
13
13
|
jsonPayload = Buffer.from(token.split('.')[1], 'base64').toString();
|
|
@@ -18,9 +18,8 @@ export function parseJwt<T>(token: string): T {
|
|
|
18
18
|
window
|
|
19
19
|
.atob(base64)
|
|
20
20
|
.split('')
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
})
|
|
21
|
+
// biome-ignore lint/style/useTemplate: Hier wel handig
|
|
22
|
+
.map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))
|
|
24
23
|
.join(''),
|
|
25
24
|
);
|
|
26
25
|
}
|
|
@@ -31,11 +30,11 @@ export function parseJwt<T>(token: string): T {
|
|
|
31
30
|
export class AuthModule extends BaseModule {
|
|
32
31
|
public static cacheKey = 'TSS-TOKEN';
|
|
33
32
|
|
|
34
|
-
|
|
35
|
-
return process.env.TSS_TOKEN ?? this.cache.get(AuthModule.cacheKey);
|
|
33
|
+
getToken(): Promise<string | undefined> {
|
|
34
|
+
return Promise.resolve(process.env.TSS_TOKEN) ?? this.cache.get(AuthModule.cacheKey);
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
setToken(token: string, lifetime?: number) {
|
|
39
38
|
return this.cache.set(AuthModule.cacheKey, token, lifetime);
|
|
40
39
|
}
|
|
41
40
|
|
|
@@ -45,7 +44,7 @@ export class AuthModule extends BaseModule {
|
|
|
45
44
|
return accessToken;
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
removeToken() {
|
|
49
48
|
return this.cache.remove(AuthModule.cacheKey);
|
|
50
49
|
}
|
|
51
50
|
|
|
@@ -62,18 +61,18 @@ export class AuthModule extends BaseModule {
|
|
|
62
61
|
|
|
63
62
|
async logout() {
|
|
64
63
|
await this.removeSession();
|
|
65
|
-
|
|
64
|
+
this.removeToken();
|
|
66
65
|
}
|
|
67
66
|
|
|
68
|
-
|
|
67
|
+
getRegistrationOptions(registrationToken: string) {
|
|
69
68
|
return this.api.get<PublicKeyCredentialCreationOptionsJSON>(`auth/registration-options/${registrationToken}`);
|
|
70
69
|
}
|
|
71
70
|
|
|
72
|
-
|
|
71
|
+
getAuthenticationOptions() {
|
|
73
72
|
return this.api.get<AuthenticationOptionsDto>('auth/authentication-options');
|
|
74
73
|
}
|
|
75
74
|
|
|
76
|
-
|
|
75
|
+
verifyRegistration(registrationToken: string, registrationResponse: RegistrationResponseJSON) {
|
|
77
76
|
return this.api.post<VerificationResponseDto>(
|
|
78
77
|
`auth/verify-registration/${registrationToken}`,
|
|
79
78
|
registrationResponse,
|
|
@@ -81,7 +80,7 @@ export class AuthModule extends BaseModule {
|
|
|
81
80
|
);
|
|
82
81
|
}
|
|
83
82
|
|
|
84
|
-
|
|
83
|
+
verifyAuthentication(token: string, response: AuthenticationResponseJSON) {
|
|
85
84
|
return this.api.post<VerificationResponseDto>(`auth/verify-authentication/${token}`, response, {
|
|
86
85
|
credentials: 'include',
|
|
87
86
|
});
|
package/src/api/base.ts
CHANGED
|
@@ -2,7 +2,10 @@ import { AbstractCache } from '../cache';
|
|
|
2
2
|
import { TssApi } from '../index';
|
|
3
3
|
|
|
4
4
|
export class BaseModule {
|
|
5
|
-
constructor(
|
|
5
|
+
constructor(
|
|
6
|
+
protected api: TssApi,
|
|
7
|
+
protected cache: AbstractCache,
|
|
8
|
+
) {}
|
|
6
9
|
|
|
7
10
|
public getCache() {
|
|
8
11
|
return this.cache;
|
package/src/api/jingle.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import { BaseModule } from './base';
|
|
1
|
+
import type { BigBrotherItem, Jingle, JingleFolder, PlayJingleDto } from 'tering-serieuze-types';
|
|
3
2
|
import { CacheLifetime } from '../cache';
|
|
3
|
+
import { BaseModule } from './base';
|
|
4
4
|
|
|
5
5
|
export class JingleModule extends BaseModule {
|
|
6
|
-
|
|
6
|
+
getGrouped(): Promise<JingleFolder[]> {
|
|
7
7
|
return this.cache.cacheOrGet(
|
|
8
8
|
() => {
|
|
9
9
|
return this.api.get<JingleFolder[]>('jingle/grouped');
|
|
@@ -13,7 +13,7 @@ export class JingleModule extends BaseModule {
|
|
|
13
13
|
);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
getAll(): Promise<Jingle[]> {
|
|
17
17
|
return this.cache.cacheOrGet(
|
|
18
18
|
() => {
|
|
19
19
|
return this.api.get<Jingle[]>('jingle');
|
|
@@ -28,12 +28,12 @@ export class JingleModule extends BaseModule {
|
|
|
28
28
|
return jingles.sort((a, b) => b.mtime - a.mtime).slice(0, 30);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
play(playJingleDto: PlayJingleDto) {
|
|
32
32
|
console.log(`Playing jingle ${playJingleDto.folder}/${playJingleDto.file}`);
|
|
33
33
|
return this.api.post('jingle/play', playJingleDto);
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
getBigBrotherData(): Promise<BigBrotherItem[]> {
|
|
37
37
|
return this.api.get<BigBrotherItem[]>('jingle/bigbrother');
|
|
38
38
|
}
|
|
39
39
|
|
package/src/api/k8s.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import type { Pod } from 'tering-serieuze-types';
|
|
1
2
|
import { BaseModule } from './base';
|
|
2
3
|
|
|
3
4
|
export class K8sModule extends BaseModule {
|
|
5
|
+
getPods() {
|
|
6
|
+
return this.api.get<Pod[]>('k8s');
|
|
7
|
+
}
|
|
8
|
+
|
|
4
9
|
async deletePod(podName: string) {
|
|
5
10
|
return this.api.delete(`k8s/${podName}`);
|
|
6
11
|
}
|
package/src/api/user.ts
CHANGED
package/src/cache/cookieCache.ts
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noDocumentCookie: Hier mag het hoor */
|
|
1
2
|
import { AbstractCache } from './abstractCache';
|
|
2
3
|
|
|
3
4
|
export class CookieCache extends AbstractCache {
|
|
4
|
-
public cacheOrGet<T>(
|
|
5
|
+
public cacheOrGet<T>(): Promise<T> {
|
|
5
6
|
throw new Error('Not implemented, use get() and set()');
|
|
6
7
|
}
|
|
7
8
|
|
|
8
|
-
public
|
|
9
|
+
public get<T>(key: string): Promise<T | undefined> {
|
|
9
10
|
if (document.cookie.includes(`${key}=`)) {
|
|
10
|
-
return document.cookie.split(`${key}=`)[1]?.split(';')[0] as T;
|
|
11
|
+
return Promise.resolve(document.cookie.split(`${key}=`)[1]?.split(';')[0] as T);
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
return undefined;
|
|
14
|
+
return Promise.resolve(undefined);
|
|
14
15
|
}
|
|
15
16
|
|
|
16
17
|
public set<T>(key: string, value: T, lifetime?: number): void {
|
package/src/cache/nullCache.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
import { AbstractCache } from './abstractCache';
|
|
2
2
|
|
|
3
3
|
export class NullCache extends AbstractCache {
|
|
4
|
-
public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T
|
|
4
|
+
public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>): Promise<T> {
|
|
5
5
|
return callbackWhenEmpty();
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
public
|
|
9
|
-
return undefined;
|
|
8
|
+
public get<T>(): Promise<T | undefined> {
|
|
9
|
+
return Promise.resolve(undefined);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
public set<T>(
|
|
12
|
+
public set<T>(): void {
|
|
13
|
+
// void
|
|
14
|
+
}
|
|
13
15
|
|
|
14
|
-
public remove(
|
|
16
|
+
public remove(): void {
|
|
17
|
+
// void
|
|
18
|
+
}
|
|
15
19
|
|
|
16
|
-
public clear(): void {
|
|
20
|
+
public clear(): void {
|
|
21
|
+
// void
|
|
22
|
+
}
|
|
17
23
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import child_process from 'node:child_process';
|
|
2
|
+
import util from 'node:util';
|
|
1
3
|
import { AbstractCache } from './abstractCache';
|
|
2
|
-
import util from 'util';
|
|
3
|
-
import child_process from 'child_process';
|
|
4
4
|
|
|
5
5
|
// TODO error handling en lifetime
|
|
6
6
|
export class OnePasswordCache extends AbstractCache {
|
|
7
7
|
protected asyncExec = util.promisify(child_process.exec);
|
|
8
8
|
|
|
9
|
-
public cacheOrGet<T>(
|
|
9
|
+
public cacheOrGet<T>(): Promise<T> {
|
|
10
10
|
throw new Error('Not implemented, use get() and set()');
|
|
11
11
|
}
|
|
12
12
|
|
|
@@ -21,7 +21,7 @@ export class OnePasswordCache extends AbstractCache {
|
|
|
21
21
|
return JSON.parse(stdout).value;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
public async set<T>(key: string, value: T
|
|
24
|
+
public async set<T>(key: string, value: T): Promise<void> {
|
|
25
25
|
let action = `op item edit '${key}' 'credential=${value}'`;
|
|
26
26
|
|
|
27
27
|
try {
|
|
@@ -30,7 +30,7 @@ export class OnePasswordCache extends AbstractCache {
|
|
|
30
30
|
action = `op item create --category="API Credential" --title ${key} 'credential=${value}'`;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
const {
|
|
33
|
+
const { stderr } = await this.asyncExec(action);
|
|
34
34
|
|
|
35
35
|
if (stderr) {
|
|
36
36
|
console.log(stderr);
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AbstractCache, NullCache } from './cache';
|
|
2
|
-
import { AuthModule, JingleModule, K8sModule, UserModule } from './api';
|
|
3
1
|
import type { Dto } from 'tering-serieuze-types';
|
|
2
|
+
import { AuthModule, JingleModule, K8sModule, UserModule } from './api';
|
|
3
|
+
import { AbstractCache, NullCache } from './cache';
|
|
4
4
|
|
|
5
5
|
export * from './api';
|
|
6
6
|
export * from './cache';
|
|
@@ -27,7 +27,10 @@ export type CacheConfiguration = {
|
|
|
27
27
|
};
|
|
28
28
|
|
|
29
29
|
export class ErrorResponse extends Error {
|
|
30
|
-
constructor(
|
|
30
|
+
constructor(
|
|
31
|
+
public readonly status: number,
|
|
32
|
+
public readonly message: string,
|
|
33
|
+
) {
|
|
31
34
|
super();
|
|
32
35
|
}
|
|
33
36
|
}
|
|
@@ -38,7 +41,10 @@ export class TssApi {
|
|
|
38
41
|
k8s: K8sModule;
|
|
39
42
|
user: UserModule;
|
|
40
43
|
|
|
41
|
-
constructor(
|
|
44
|
+
constructor(
|
|
45
|
+
protected readonly apiConfiguration: ApiConfiguration,
|
|
46
|
+
cacheConfiguration?: CacheConfiguration,
|
|
47
|
+
) {
|
|
42
48
|
this.jingle = new JingleModule(this, cacheConfiguration?.jingle ?? new NullCache('jingle'));
|
|
43
49
|
this.auth = new AuthModule(this, cacheConfiguration?.auth ?? new NullCache('auth'));
|
|
44
50
|
this.k8s = new K8sModule(this, cacheConfiguration?.k8s ?? new NullCache('k8s'));
|
|
@@ -49,10 +55,15 @@ export class TssApi {
|
|
|
49
55
|
config.method = config.method ?? 'GET';
|
|
50
56
|
config.headers = {
|
|
51
57
|
...config.headers,
|
|
52
|
-
'Content-Type': 'application/json',
|
|
53
58
|
Authorization: `Bearer ${await this.auth.getToken()}`,
|
|
54
59
|
};
|
|
55
60
|
|
|
61
|
+
// @ts-ignore
|
|
62
|
+
if (!config.headers['Content-Type']) {
|
|
63
|
+
// @ts-ignore
|
|
64
|
+
config.headers['Content-Type'] = config.body ? 'application/json' : 'text/plain';
|
|
65
|
+
}
|
|
66
|
+
|
|
56
67
|
const apiPrefix = this.apiConfiguration.API_URL;
|
|
57
68
|
|
|
58
69
|
if (apiPrefix.match(/^https?:\/\/localhost/) !== null && typeof process !== 'undefined' && process.env) {
|
|
@@ -62,7 +73,7 @@ export class TssApi {
|
|
|
62
73
|
const fullUrl = `${apiPrefix}/api/${url}`;
|
|
63
74
|
console.log('Fetching url', fullUrl);
|
|
64
75
|
|
|
65
|
-
let response;
|
|
76
|
+
let response: Response;
|
|
66
77
|
try {
|
|
67
78
|
response = await fetch(fullUrl, config);
|
|
68
79
|
} catch (e) {
|
|
@@ -77,12 +88,7 @@ export class TssApi {
|
|
|
77
88
|
return response;
|
|
78
89
|
}
|
|
79
90
|
|
|
80
|
-
protected
|
|
81
|
-
method: HttpMethod,
|
|
82
|
-
url: string,
|
|
83
|
-
dto: Dto,
|
|
84
|
-
config: SDKRequestInit = {},
|
|
85
|
-
) {
|
|
91
|
+
protected fetchPossibleEmptyResponse<T>(method: HttpMethod, url: string, dto: Dto, config: SDKRequestInit = {}) {
|
|
86
92
|
return this.fetch(url, {
|
|
87
93
|
method,
|
|
88
94
|
...config,
|
|
@@ -103,7 +109,7 @@ export class TssApi {
|
|
|
103
109
|
return (await response.json()) as Promise<T>;
|
|
104
110
|
}
|
|
105
111
|
|
|
106
|
-
|
|
112
|
+
postPossibleEmptyResponse(url: string, dto: Dto) {
|
|
107
113
|
return this.fetchPossibleEmptyResponse('POST', url, dto);
|
|
108
114
|
}
|
|
109
115
|
|
|
@@ -115,11 +121,11 @@ export class TssApi {
|
|
|
115
121
|
return (await response.json()) as Promise<T>;
|
|
116
122
|
}
|
|
117
123
|
|
|
118
|
-
|
|
124
|
+
putPossibleEmptyResponse(url: string, dto: Dto) {
|
|
119
125
|
return this.fetchPossibleEmptyResponse('PUT', url, dto);
|
|
120
126
|
}
|
|
121
127
|
|
|
122
|
-
|
|
128
|
+
delete<T>(url: string, config: SDKRequestInit = {}) {
|
|
123
129
|
return this.fetch(url, {
|
|
124
130
|
method: 'DELETE',
|
|
125
131
|
...config,
|
package/test/api/base.test.ts
CHANGED
package/test/api/jingle.test.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { existsSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
1
3
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { FilesystemCache } from '../../src
|
|
3
|
-
import { existsSync, unlinkSync, writeFileSync } from 'fs';
|
|
4
|
-
import path from 'path';
|
|
4
|
+
import { FilesystemCache } from '../../src';
|
|
5
5
|
|
|
6
6
|
describe('filesystemCache', () => {
|
|
7
7
|
let cache: FilesystemCache;
|
|
@@ -59,7 +59,7 @@ describe('filesystemCache', () => {
|
|
|
59
59
|
});
|
|
60
60
|
|
|
61
61
|
it('Should use the function name as key, when no key is passed', async () => {
|
|
62
|
-
let expected
|
|
62
|
+
let expected = 0;
|
|
63
63
|
await (async function doeHet() {
|
|
64
64
|
expected = await cache.cacheOrGet(() => Promise.resolve(50));
|
|
65
65
|
})();
|
|
@@ -95,7 +95,7 @@ describe('filesystemCache', () => {
|
|
|
95
95
|
expect(cachedValue).toBe(otherCorrectValue);
|
|
96
96
|
});
|
|
97
97
|
|
|
98
|
-
it('Should be able to clear the cache',
|
|
98
|
+
it('Should be able to clear the cache', () => {
|
|
99
99
|
expect(existsSync(cache.getFilePath())).toBe(false);
|
|
100
100
|
cache.set('test', 1);
|
|
101
101
|
expect(existsSync(cache.getFilePath())).toBe(true);
|
package/tsconfig.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"rootDir": "src",
|
|
4
|
+
"outDir": "dist",
|
|
5
|
+
"strict": true,
|
|
6
|
+
"target": "ESNext",
|
|
7
|
+
"module": "ES2022",
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"moduleResolution": "node",
|
|
11
|
+
"strictNullChecks": true,
|
|
12
|
+
"noImplicitAny": true,
|
|
13
|
+
"experimentalDecorators": true,
|
|
14
|
+
"strictPropertyInitialization": false,
|
|
15
|
+
"verbatimModuleSyntax": true
|
|
16
|
+
}
|
|
17
|
+
}
|
package/types/environment.d.ts
CHANGED