@bzenky/spoti 0.2.0 → 0.3.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/README.md +72 -4
- package/dist/app.d.ts +19 -1
- package/dist/app.js +310 -16
- package/dist/app.js.map +1 -1
- package/dist/auth/config.d.ts +1 -1
- package/dist/auth/config.js +3 -3
- package/dist/auth/config.js.map +1 -1
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/services/auth.service.d.ts +1 -1
- package/dist/services/auth.service.js +9 -3
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/catalog.service.d.ts +9 -0
- package/dist/services/catalog.service.js +22 -0
- package/dist/services/catalog.service.js.map +1 -0
- package/dist/services/device.service.js +22 -2
- package/dist/services/device.service.js.map +1 -1
- package/dist/services/library.service.d.ts +13 -0
- package/dist/services/library.service.js +46 -0
- package/dist/services/library.service.js.map +1 -0
- package/dist/services/mappers.d.ts +10 -0
- package/dist/services/mappers.js +104 -0
- package/dist/services/mappers.js.map +1 -0
- package/dist/services/models.d.ts +45 -0
- package/dist/services/player.service.d.ts +4 -1
- package/dist/services/player.service.js +21 -14
- package/dist/services/player.service.js.map +1 -1
- package/dist/services/playlist.service.d.ts +9 -0
- package/dist/services/playlist.service.js +33 -0
- package/dist/services/playlist.service.js.map +1 -0
- package/dist/services/recent.service.d.ts +7 -0
- package/dist/services/recent.service.js +24 -0
- package/dist/services/recent.service.js.map +1 -0
- package/dist/services/search.service.d.ts +5 -1
- package/dist/services/search.service.js +32 -17
- package/dist/services/search.service.js.map +1 -1
- package/dist/services/update.service.d.ts +57 -0
- package/dist/services/update.service.js +313 -0
- package/dist/services/update.service.js.map +1 -0
- package/dist/spotify/client.js +14 -1
- package/dist/spotify/client.js.map +1 -1
- package/dist/spotify/scopes.d.ts +1 -1
- package/dist/spotify/scopes.js +4 -0
- package/dist/spotify/scopes.js.map +1 -1
- package/dist/spotify/types.d.ts +110 -8
- package/dist/storage/config.d.ts +2 -1
- package/dist/storage/config.js +18 -1
- package/dist/storage/config.js.map +1 -1
- package/dist/storage/update-cache.d.ts +29 -0
- package/dist/storage/update-cache.js +135 -0
- package/dist/storage/update-cache.js.map +1 -0
- package/dist/ui/output.d.ts +10 -1
- package/dist/ui/output.js +60 -0
- package/dist/ui/output.js.map +1 -1
- package/dist/ui/prompts.d.ts +12 -1
- package/dist/ui/prompts.js +73 -6
- package/dist/ui/prompts.js.map +1 -1
- package/dist/update-worker.d.ts +9 -0
- package/dist/update-worker.js +91 -0
- package/dist/update-worker.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { mkdir, open, stat, unlink } from 'node:fs/promises';
|
|
3
|
+
import { dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { UpdateService, } from './services/update.service.js';
|
|
6
|
+
const WORKER_FLAG = '--spoti-update-worker';
|
|
7
|
+
const STALE_LOCK_MS = 60_000;
|
|
8
|
+
/** Automatic update failures are intentionally hidden from normal CLI commands. */
|
|
9
|
+
export async function runBackgroundUpdateCheck(checker) {
|
|
10
|
+
try {
|
|
11
|
+
return await checker.checkInBackground();
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Starts at most one independent refresh process. The process can finish after the invoking
|
|
19
|
+
* CLI exits and writes the cache for a later invocation to display.
|
|
20
|
+
*/
|
|
21
|
+
export async function startUpdateWorker(currentVersion, cachePath) {
|
|
22
|
+
const lockPath = `${cachePath}.lock`;
|
|
23
|
+
if (!(await acquireUpdateWorkerLock(lockPath)))
|
|
24
|
+
return false;
|
|
25
|
+
const modulePath = fileURLToPath(import.meta.url);
|
|
26
|
+
const runtimeArguments = modulePath.endsWith('.ts') ? process.execArgv : [];
|
|
27
|
+
try {
|
|
28
|
+
const child = spawn(process.execPath, [...runtimeArguments, modulePath, WORKER_FLAG, currentVersion, lockPath], {
|
|
29
|
+
detached: true,
|
|
30
|
+
stdio: 'ignore',
|
|
31
|
+
shell: false,
|
|
32
|
+
});
|
|
33
|
+
child.once('error', () => {
|
|
34
|
+
void unlink(lockPath).catch(() => undefined);
|
|
35
|
+
});
|
|
36
|
+
child.unref();
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
await unlink(lockPath).catch(() => undefined);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function acquireUpdateWorkerLock(lockPath) {
|
|
45
|
+
try {
|
|
46
|
+
await mkdir(dirname(lockPath), { recursive: true, mode: 0o700 });
|
|
47
|
+
const handle = await open(lockPath, 'wx', 0o600);
|
|
48
|
+
await handle.close();
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (!hasCode(error, 'EEXIST'))
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const lock = await stat(lockPath);
|
|
57
|
+
if (Date.now() - lock.mtimeMs < STALE_LOCK_MS)
|
|
58
|
+
return false;
|
|
59
|
+
await unlink(lockPath);
|
|
60
|
+
const handle = await open(lockPath, 'wx', 0o600);
|
|
61
|
+
await handle.close();
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function workerMain(currentVersion, lockPath) {
|
|
69
|
+
try {
|
|
70
|
+
await new UpdateService(currentVersion).checkForeground();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// The foreground method records a failed timestamp; automatic checks remain silent.
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await unlink(lockPath).catch(() => undefined);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function hasCode(error, code) {
|
|
80
|
+
return (typeof error === 'object' &&
|
|
81
|
+
error !== null &&
|
|
82
|
+
'code' in error &&
|
|
83
|
+
error.code === code);
|
|
84
|
+
}
|
|
85
|
+
if (process.argv[2] === WORKER_FLAG) {
|
|
86
|
+
const currentVersion = process.argv[3];
|
|
87
|
+
const lockPath = process.argv[4];
|
|
88
|
+
if (currentVersion && lockPath)
|
|
89
|
+
await workerMain(currentVersion, lockPath);
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=update-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-worker.js","sourceRoot":"","sources":["../src/update-worker.ts"],"names":[],"mappings":"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"}
|