tering-serieuze-sdk 1.0.1 → 1.0.3
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 +18 -10
- package/dist/index.mjs.map +2 -2
- package/package.json +1 -1
- package/src/api/jingle.ts +15 -6
- package/src/cache/onePasswordCache.ts +5 -5
package/dist/index.mjs
CHANGED
|
@@ -126,13 +126,13 @@ var NullCache = class extends AbstractCache {
|
|
|
126
126
|
// src/cache/onePasswordCache.ts
|
|
127
127
|
import { promisify } from "util";
|
|
128
128
|
import { exec } from "child_process";
|
|
129
|
-
var asyncExec = promisify(exec);
|
|
130
129
|
var OnePasswordCache = class extends AbstractCache {
|
|
130
|
+
asyncExec = promisify(exec);
|
|
131
131
|
cacheOrGet(callbackWhenEmpty, key, lifetime) {
|
|
132
132
|
throw new Error("Not implemented, use get() and set()");
|
|
133
133
|
}
|
|
134
134
|
async get(key) {
|
|
135
|
-
const { stdout, stderr } = await asyncExec(`op item get "${key}" --fields label=credential --format json`);
|
|
135
|
+
const { stdout, stderr } = await this.asyncExec(`op item get "${key}" --fields label=credential --format json`);
|
|
136
136
|
if (stderr) {
|
|
137
137
|
console.log(stderr);
|
|
138
138
|
throw new Error("ERROR");
|
|
@@ -146,14 +146,14 @@ var OnePasswordCache = class extends AbstractCache {
|
|
|
146
146
|
} catch (e) {
|
|
147
147
|
action = `op item create --category="API Credential" --title ${key} 'credential=${value}'`;
|
|
148
148
|
}
|
|
149
|
-
const { stdout, stderr } = await asyncExec(action);
|
|
149
|
+
const { stdout, stderr } = await this.asyncExec(action);
|
|
150
150
|
if (stderr) {
|
|
151
151
|
console.log(stderr);
|
|
152
152
|
throw new Error("ERROR");
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
async remove(key) {
|
|
156
|
-
await asyncExec(`op item delete '${key}'`);
|
|
156
|
+
await this.asyncExec(`op item delete '${key}'`);
|
|
157
157
|
}
|
|
158
158
|
clear() {
|
|
159
159
|
}
|
|
@@ -191,14 +191,22 @@ __publicField(AuthModule, "cacheKey", "TSS-TOKEN");
|
|
|
191
191
|
// src/api/jingle.ts
|
|
192
192
|
var JingleModule = class extends BaseModule {
|
|
193
193
|
async getGrouped() {
|
|
194
|
-
return this.cache.cacheOrGet(
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
return this.cache.cacheOrGet(
|
|
195
|
+
() => {
|
|
196
|
+
return this.api.fetch("jingle/grouped");
|
|
197
|
+
},
|
|
198
|
+
"getGrouped",
|
|
199
|
+
604800 /* Week */
|
|
200
|
+
);
|
|
197
201
|
}
|
|
198
202
|
async getAll() {
|
|
199
|
-
return this.cache.cacheOrGet(
|
|
200
|
-
|
|
201
|
-
|
|
203
|
+
return this.cache.cacheOrGet(
|
|
204
|
+
() => {
|
|
205
|
+
return this.api.fetch("jingle");
|
|
206
|
+
},
|
|
207
|
+
"getAll",
|
|
208
|
+
604800 /* Week */
|
|
209
|
+
);
|
|
202
210
|
}
|
|
203
211
|
async play(folder, file) {
|
|
204
212
|
console.log(`Playing jingle ${folder}/${file}`);
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 // TODO implement\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): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } 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 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 (existsSync(this.getFilePath())) {\n this.state = JSON.parse(readFileSync(this.getFilePath(), \"utf8\"));\n }\n }\n\n protected writeState() {\n if (!existsSync(path.dirname(this.getFilePath()))) {\n mkdirSync(path.dirname(this.getFilePath()));\n }\n\n 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): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport { promisify } from \"util\";\nimport { exec } from \"child_process\";\n\nconst asyncExec = promisify(exec);\n\n// TODO error handling\nexport class OnePasswordCache 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 const { stdout, stderr } = await 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): 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 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 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 protected 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) {\n return this.cache.set(AuthModule.cacheKey, token);\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n}\n", "import { JingleFolder, Jingle } from \"tering-serieuze-types\";\nimport { BaseModule } from \"./base\";\n\nexport class JingleModule extends BaseModule {\n async getGrouped() {\n return this.cache.cacheOrGet(() => {\n return this.api.fetch<JingleFolder[]>(\"jingle/grouped\");\n });\n }\n\n async getAll() {\n return this.cache.cacheOrGet(() => {\n return this.api.fetch<Jingle[]>(\"jingle\");\n });\n }\n\n async play(folder: string, file: string) {\n console.log(`Playing jingle ${folder}/${file}`);\n return this.api.post(\"jingle/play\", { folder, file });\n }\n}\n", "import { BaseModule } from \"./base\";\nimport { 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.fetch<User>(`user${userIdParam}`);\n });\n }\n}\n", "import { AbstractCache, NullCache } from \"./cache\";\nimport { AuthModule, JingleModule, UserModule } from \"./api\";\nimport {\n BadRequestException,\n ForbiddenException,\n NotFoundException,\n UnauthorizedException,\n UnprocessableEntityException,\n} from \"@nestjs/common\";\n\nexport * from \"./api\";\nexport * from \"./cache\";\n\nexport interface SDKRequestInit extends RequestInit {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n}\n\nexport enum CacheType {\n jingle = \"jingle\",\n auth = \"auth\",\n user = \"user\",\n}\n\nexport type CacheConfiguration = {\n [key in keyof typeof CacheType]?: AbstractCache;\n};\n\nexport class TssApi {\n auth: AuthModule;\n\n jingle: JingleModule;\n\n user: UserModule;\n\n constructor(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<T>(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 = process.env.API_URL ?? \"https://tss.maxserv.dev:8081\";\n const response = await fetch(apiPrefix + \"/api/\" + url, config);\n switch (response.status) {\n case 400:\n throw new BadRequestException(response.statusText);\n case 401:\n throw new UnauthorizedException(response.statusText);\n case 403:\n throw new ForbiddenException(response.statusText);\n case 404:\n throw new NotFoundException(response.statusText);\n case 422:\n throw new UnprocessableEntityException(response.statusText);\n }\n\n return response.json() as Promise<T>;\n }\n\n async post<T>(url: string, body: any) {\n return this.fetch<T>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\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,\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 // TODO implement\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): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } 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 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 (existsSync(this.getFilePath())) {\n this.state = JSON.parse(readFileSync(this.getFilePath(), \"utf8\"));\n }\n }\n\n protected writeState() {\n if (!existsSync(path.dirname(this.getFilePath()))) {\n mkdirSync(path.dirname(this.getFilePath()));\n }\n\n 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): void {}\n\n public remove(key: string): void {}\n\n public clear(): void {}\n}\n", "import { AbstractCache } from \"./abstractCache\";\nimport { promisify } from \"util\";\nimport { exec } from \"child_process\";\n\n// TODO error handling\nexport class OnePasswordCache extends AbstractCache {\n protected asyncExec = promisify(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): 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 protected 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) {\n return this.cache.set(AuthModule.cacheKey, token);\n }\n\n async removeToken() {\n return this.cache.remove(AuthModule.cacheKey);\n }\n}\n", "import { JingleFolder, Jingle } 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.fetch<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.fetch<Jingle[]>(\"jingle\");\n },\n \"getAll\",\n CacheLifetime.Week\n );\n }\n\n async play(folder: string, file: string) {\n console.log(`Playing jingle ${folder}/${file}`);\n return this.api.post(\"jingle/play\", { folder, file });\n }\n}\n", "import { BaseModule } from \"./base\";\nimport { 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.fetch<User>(`user${userIdParam}`);\n });\n }\n}\n", "import { AbstractCache, NullCache } from \"./cache\";\nimport { AuthModule, JingleModule, UserModule } from \"./api\";\nimport {\n BadRequestException,\n ForbiddenException,\n NotFoundException,\n UnauthorizedException,\n UnprocessableEntityException,\n} from \"@nestjs/common\";\n\nexport * from \"./api\";\nexport * from \"./cache\";\n\nexport interface SDKRequestInit extends RequestInit {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n}\n\nexport enum CacheType {\n jingle = \"jingle\",\n auth = \"auth\",\n user = \"user\",\n}\n\nexport type CacheConfiguration = {\n [key in keyof typeof CacheType]?: AbstractCache;\n};\n\nexport class TssApi {\n auth: AuthModule;\n\n jingle: JingleModule;\n\n user: UserModule;\n\n constructor(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<T>(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 = process.env.API_URL ?? \"https://tss.maxserv.dev:8081\";\n const response = await fetch(apiPrefix + \"/api/\" + url, config);\n switch (response.status) {\n case 400:\n throw new BadRequestException(response.statusText);\n case 401:\n throw new UnauthorizedException(response.statusText);\n case 403:\n throw new ForbiddenException(response.statusText);\n case 404:\n throw new NotFoundException(response.statusText);\n case 422:\n throw new UnprocessableEntityException(response.statusText);\n }\n\n return response.json() as Promise<T>;\n }\n\n async post<T>(url: string, body: any) {\n return this.fetch<T>(url, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["CacheLifetime", "CacheType"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/src/api/jingle.ts
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
import { JingleFolder, Jingle } from "tering-serieuze-types";
|
|
2
2
|
import { BaseModule } from "./base";
|
|
3
|
+
import { CacheLifetime } from "../cache";
|
|
3
4
|
|
|
4
5
|
export class JingleModule extends BaseModule {
|
|
5
6
|
async getGrouped() {
|
|
6
|
-
return this.cache.cacheOrGet(
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
return this.cache.cacheOrGet(
|
|
8
|
+
() => {
|
|
9
|
+
return this.api.fetch<JingleFolder[]>("jingle/grouped");
|
|
10
|
+
},
|
|
11
|
+
"getGrouped",
|
|
12
|
+
CacheLifetime.Week
|
|
13
|
+
);
|
|
9
14
|
}
|
|
10
15
|
|
|
11
16
|
async getAll() {
|
|
12
|
-
return this.cache.cacheOrGet(
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
return this.cache.cacheOrGet(
|
|
18
|
+
() => {
|
|
19
|
+
return this.api.fetch<Jingle[]>("jingle");
|
|
20
|
+
},
|
|
21
|
+
"getAll",
|
|
22
|
+
CacheLifetime.Week
|
|
23
|
+
);
|
|
15
24
|
}
|
|
16
25
|
|
|
17
26
|
async play(folder: string, file: string) {
|
|
@@ -2,16 +2,16 @@ import { AbstractCache } from "./abstractCache";
|
|
|
2
2
|
import { promisify } from "util";
|
|
3
3
|
import { exec } from "child_process";
|
|
4
4
|
|
|
5
|
-
const asyncExec = promisify(exec);
|
|
6
|
-
|
|
7
5
|
// TODO error handling
|
|
8
6
|
export class OnePasswordCache extends AbstractCache {
|
|
7
|
+
protected asyncExec = promisify(exec);
|
|
8
|
+
|
|
9
9
|
public cacheOrGet<T>(callbackWhenEmpty: () => Promise<T>, key?: string, lifetime?: number): Promise<T> {
|
|
10
10
|
throw new Error("Not implemented, use get() and set()");
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
public async get<T>(key: string): Promise<T | undefined> {
|
|
14
|
-
const { stdout, stderr } = await asyncExec(`op item get "${key}" --fields label=credential --format json`);
|
|
14
|
+
const { stdout, stderr } = await this.asyncExec(`op item get "${key}" --fields label=credential --format json`);
|
|
15
15
|
|
|
16
16
|
if (stderr) {
|
|
17
17
|
console.log(stderr);
|
|
@@ -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 { stdout, stderr } = await asyncExec(action);
|
|
33
|
+
const { stdout, stderr } = await this.asyncExec(action);
|
|
34
34
|
|
|
35
35
|
if (stderr) {
|
|
36
36
|
console.log(stderr);
|
|
@@ -39,7 +39,7 @@ export class OnePasswordCache extends AbstractCache {
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
public async remove(key: string): Promise<void> {
|
|
42
|
-
await asyncExec(`op item delete '${key}'`);
|
|
42
|
+
await this.asyncExec(`op item delete '${key}'`);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
public clear(): void {
|