comty.js 0.60.6 → 0.61.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/addons.js +23 -0
- package/dist/helpers/processWithAddons.js +30 -0
- package/dist/helpers/refreshToken.js +44 -40
- package/dist/index.js +64 -202
- package/dist/models/auth/index.js +261 -187
- package/dist/models/follows/index.js +2 -2
- package/dist/models/music/getters/favouriteFolder.js +42 -0
- package/dist/models/music/getters/index.js +31 -34
- package/dist/models/music/getters/isItemFavourited.js +33 -0
- package/dist/models/music/getters/recentlyPlayed.js +11 -0
- package/dist/models/music/index.js +29 -19
- package/dist/models/music/setters/index.js +31 -34
- package/dist/models/music/setters/putTrackLyrics.js +12 -0
- package/dist/models/music/setters/toggleItemFavourite.js +36 -0
- package/dist/models/nfc/index.js +5 -1
- package/dist/models/post/index.js +88 -0
- package/dist/models/radio/getters/list.js +11 -0
- package/dist/models/radio/index.js +5 -0
- package/dist/models/search/index.js +52 -33
- package/dist/models/spectrum/index.js +132 -92
- package/dist/models/user/index.js +131 -133
- package/dist/remote.js +7 -19
- package/dist/remotes.js +36 -0
- package/dist/rtclient.js +131 -0
- package/dist/utils/standartListMerge.js +18 -0
- package/dist/ws.js +139 -0
- package/package.json +25 -25
package/dist/addons.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); class AddonsManager {constructor() { AddonsManager.prototype.__init.call(this); }
|
|
2
|
+
__init() {this.addons = new Map()}
|
|
3
|
+
|
|
4
|
+
register(name, addon) {
|
|
5
|
+
this.addons.set(name, addon)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
get(name) {
|
|
9
|
+
return this.addons.get(name)
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// search all addons registered, and find all addons that has a addon[operation] function
|
|
13
|
+
getByOperation(operation) {
|
|
14
|
+
return Array.from(this.addons.values())
|
|
15
|
+
.filter((addon) => addon[operation])
|
|
16
|
+
.map((addon) => {
|
|
17
|
+
return {
|
|
18
|
+
id: addon.constructor.id,
|
|
19
|
+
fn: addon[operation],
|
|
20
|
+
}
|
|
21
|
+
})
|
|
22
|
+
}
|
|
23
|
+
} exports.default = AddonsManager;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); async function processAddons({
|
|
2
|
+
operation,
|
|
3
|
+
initialData,
|
|
4
|
+
fnArguments,
|
|
5
|
+
normalizeAddonResult,
|
|
6
|
+
}) {
|
|
7
|
+
const addons = __comty_shared_state.addons.getByOperation(operation)
|
|
8
|
+
|
|
9
|
+
let processedData = initialData
|
|
10
|
+
|
|
11
|
+
if (typeof fnArguments === "undefined") {
|
|
12
|
+
fnArguments = []
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
for (const addon of addons) {
|
|
16
|
+
try {
|
|
17
|
+
const addonResult = await addon.fn(...fnArguments)
|
|
18
|
+
|
|
19
|
+
processedData = normalizeAddonResult({
|
|
20
|
+
operation,
|
|
21
|
+
currentData: processedData,
|
|
22
|
+
addonResult,
|
|
23
|
+
})
|
|
24
|
+
} catch (error) {
|
|
25
|
+
console.error(`Error in [${operation}] addon:`, error)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return processedData
|
|
30
|
+
} exports.default = processAddons;
|
|
@@ -1,42 +1,46 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _session = require('../models/session'); var _session2 = _interopRequireDefault(_session);
|
|
2
|
-
var _ = require('..');
|
|
3
|
-
exports. default = async () => {
|
|
4
|
-
__comty_shared_state.eventBus.emit("session:refreshing")
|
|
5
|
-
__comty_shared_state.refreshingToken = true
|
|
6
|
-
|
|
7
|
-
// send request to regenerate token
|
|
8
|
-
const response = await __comty_shared_state.baseRequest({
|
|
9
|
-
method: "POST",
|
|
10
|
-
url: "/auth",
|
|
11
|
-
data: {
|
|
12
|
-
authToken: await _session2.default.token,
|
|
13
|
-
refreshToken: await _session2.default.refreshToken,
|
|
14
|
-
}
|
|
15
|
-
}).catch((error) => {
|
|
16
|
-
return false
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
if (!response) {
|
|
20
|
-
__comty_shared_state.refreshingToken = false
|
|
21
|
-
|
|
22
|
-
throw new Error("Failed to regenerate token.")
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (!_optionalChain([response, 'access', _3 => _3.data, 'optionalAccess', _4 => _4.token])) {
|
|
26
|
-
__comty_shared_state.refreshingToken = false
|
|
27
2
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
3
|
+
exports. default = async () => {
|
|
4
|
+
__comty_shared_state.eventBus.emit("session:refreshing")
|
|
5
|
+
__comty_shared_state.refreshingToken = true
|
|
6
|
+
|
|
7
|
+
// send request to regenerate token
|
|
8
|
+
const response = await __comty_shared_state
|
|
9
|
+
.baseRequest({
|
|
10
|
+
method: "POST",
|
|
11
|
+
url: "/auth",
|
|
12
|
+
data: {
|
|
13
|
+
authToken: await _session2.default.token,
|
|
14
|
+
refreshToken: await _session2.default.refreshToken,
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
.catch((error) => {
|
|
18
|
+
return false
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
if (!response) {
|
|
22
|
+
__comty_shared_state.refreshingToken = false
|
|
23
|
+
|
|
24
|
+
throw new Error("Failed to regenerate token.")
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (!_optionalChain([response, 'access', _ => _.data, 'optionalAccess', _2 => _2.token])) {
|
|
28
|
+
__comty_shared_state.refreshingToken = false
|
|
29
|
+
|
|
30
|
+
throw new Error("Failed to regenerate token, invalid server response.")
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// set new token
|
|
34
|
+
_session2.default.token = response.data.token
|
|
35
|
+
_session2.default.refreshToken = response.data.refreshToken
|
|
36
|
+
|
|
37
|
+
// emit event
|
|
38
|
+
__comty_shared_state.eventBus.emit("session:refreshed")
|
|
39
|
+
__comty_shared_state.refreshingToken = false
|
|
40
|
+
|
|
41
|
+
if (typeof __comty_shared_state.ws === "object") {
|
|
42
|
+
await __comty_shared_state.ws.connectAll()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return true
|
|
46
|
+
}
|
package/dist/index.js
CHANGED
|
@@ -1,166 +1,26 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _packagejson = require('../package.json'); var _packagejson2 = _interopRequireDefault(_packagejson);
|
|
2
2
|
var _events = require('@foxify/events'); var _events2 = _interopRequireDefault(_events);
|
|
3
|
-
|
|
4
3
|
var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios);
|
|
5
|
-
var _socketioclient = require('socket.io-client');
|
|
6
4
|
|
|
7
|
-
var
|
|
5
|
+
var _addons = require('./addons'); var _addons2 = _interopRequireDefault(_addons);
|
|
6
|
+
var _ws = require('./ws'); var _ws2 = _interopRequireDefault(_ws);
|
|
8
7
|
var _withStorage = require('./helpers/withStorage'); var _withStorage2 = _interopRequireDefault(_withStorage);
|
|
9
|
-
var
|
|
8
|
+
var _remotes = require('./remotes'); var _remotes2 = _interopRequireDefault(_remotes);
|
|
10
9
|
|
|
11
|
-
globalThis.isServerMode =
|
|
10
|
+
globalThis.isServerMode =
|
|
11
|
+
typeof window === "undefined" && typeof global !== "undefined"
|
|
12
12
|
|
|
13
13
|
if (globalThis.isServerMode) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
const { Buffer } = require("buffer")
|
|
15
|
+
|
|
16
|
+
globalThis.b64Decode = (data) => {
|
|
17
|
+
return Buffer.from(data, "base64").toString("utf-8")
|
|
18
|
+
}
|
|
19
|
+
globalThis.b64Encode = (data) => {
|
|
20
|
+
return Buffer.from(data, "utf-8").toString("base64")
|
|
21
|
+
}
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/**
|
|
25
|
-
* Creates websockets by disconnecting and removing listeners from existing instances,
|
|
26
|
-
* then creating new instances for each websocket in the remote.websockets array.
|
|
27
|
-
* Registers event listeners for connection, disconnection, reconnection, error, and any other events.
|
|
28
|
-
*
|
|
29
|
-
* @return {Promise<void>} A promise that resolves when all websockets have been created and event listeners have been registered.
|
|
30
|
-
*/
|
|
31
|
-
async function createWebsockets() {
|
|
32
|
-
if (!_remote2.default.websockets) {
|
|
33
|
-
return false
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const instances = globalThis.__comty_shared_state.sockets
|
|
37
|
-
|
|
38
|
-
for (let [key, instance] of Object.entries(instances)) {
|
|
39
|
-
if (instance.connected) {
|
|
40
|
-
// disconnect first
|
|
41
|
-
instance.disconnect()
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// remove current listeners
|
|
45
|
-
instance.removeAllListeners()
|
|
46
|
-
|
|
47
|
-
delete globalThis.__comty_shared_state.sockets[key]
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
for (let ws of _remote2.default.websockets) {
|
|
51
|
-
let opts = {
|
|
52
|
-
transports: ["websocket"],
|
|
53
|
-
autoConnect: _nullishCoalesce(ws.autoConnect, () => ( true)),
|
|
54
|
-
forceNew: true,
|
|
55
|
-
path: ws.path,
|
|
56
|
-
..._nullishCoalesce(ws.params, () => ( {})),
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (ws.noAuth !== true) {
|
|
60
|
-
opts.auth = {
|
|
61
|
-
token: _withStorage2.default.engine.get("token"),
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
globalThis.__comty_shared_state.sockets[ws.namespace] = _socketioclient.io.call(void 0, _remote2.default.origin, opts)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// regsister events
|
|
69
|
-
for (let [key, instance] of Object.entries(instances)) {
|
|
70
|
-
instance.on("connect", () => {
|
|
71
|
-
//console.debug(`[WS-API][${key}] Connected`)
|
|
72
|
-
|
|
73
|
-
globalThis.__comty_shared_state.eventBus.emit(`${key}:connected`)
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
instance.on("disconnect", () => {
|
|
77
|
-
//console.debug(`[WS-API][${key}] Disconnected`)
|
|
78
|
-
|
|
79
|
-
globalThis.__comty_shared_state.eventBus.emit(`${key}:disconnected`)
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
instance.on("reconnect", () => {
|
|
83
|
-
// console.debug(`[WS-API][${key}] Reconnected`)
|
|
84
|
-
|
|
85
|
-
globalThis.__comty_shared_state.eventBus.emit(`${key}:reconnected`)
|
|
86
|
-
|
|
87
|
-
reauthenticateWebsockets()
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
instance.on("error", (error) => {
|
|
91
|
-
//console.error(`[WS-API][${key}] Error`, error)
|
|
92
|
-
|
|
93
|
-
globalThis.__comty_shared_state.eventBus.emit(`${key}:error`, error)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
instance.onAny((event, ...args) => {
|
|
97
|
-
//console.debug(`[WS-API][${key}] Event (${event})`, ...args)
|
|
98
|
-
|
|
99
|
-
globalThis.__comty_shared_state.eventBus.emit(`${key}:${event}`, ...args)
|
|
100
|
-
})
|
|
101
|
-
}
|
|
102
|
-
} exports.createWebsockets = createWebsockets;
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Disconnects all websocket instances by calling the `disconnect` method on each instance.
|
|
106
|
-
*
|
|
107
|
-
* @return {Promise<void>} A promise that resolves when all websocket instances have been disconnected.
|
|
108
|
-
*/
|
|
109
|
-
async function disconnectWebsockets() {
|
|
110
|
-
const instances = globalThis.__comty_shared_state.sockets
|
|
111
|
-
|
|
112
|
-
for (let [key, instance] of Object.entries(instances)) {
|
|
113
|
-
if (instance.connected) {
|
|
114
|
-
instance.disconnect()
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
} exports.disconnectWebsockets = disconnectWebsockets;
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Reconnects all websocket instances by disconnecting and reconnecting them with the current token.
|
|
121
|
-
*
|
|
122
|
-
* @return {Promise<void>} A promise that resolves when all websocket instances have been reconnected.
|
|
123
|
-
*/
|
|
124
|
-
async function reconnectWebsockets() {
|
|
125
|
-
const instances = globalThis.__comty_shared_state.sockets
|
|
126
|
-
|
|
127
|
-
for (let [key, instance] of Object.entries(instances)) {
|
|
128
|
-
if (instance.connected) {
|
|
129
|
-
// disconnect first
|
|
130
|
-
instance.disconnect()
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
instance.auth = {
|
|
134
|
-
token: _withStorage2.default.engine.get("token"),
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
instance.connect()
|
|
138
|
-
}
|
|
139
|
-
} exports.reconnectWebsockets = reconnectWebsockets;
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Reauthenticates all websocket instances with the current token. If a websocket instance is not connected, it connects to the server. If it is connected, it emits an "auth:reauth" event with the current token.
|
|
143
|
-
*
|
|
144
|
-
* @return {Promise<void>} Promise that resolves when all websocket instances have been reauthenticated.
|
|
145
|
-
*/
|
|
146
|
-
async function reauthenticateWebsockets() {
|
|
147
|
-
const instances = globalThis.__comty_shared_state.sockets
|
|
148
|
-
|
|
149
|
-
for (let [key, instance] of Object.entries(instances)) {
|
|
150
|
-
const token = _withStorage2.default.engine.get("token")
|
|
151
|
-
|
|
152
|
-
instance.auth = {
|
|
153
|
-
token: token,
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (!instance.connected) {
|
|
157
|
-
instance.connect()
|
|
158
|
-
} else {
|
|
159
|
-
instance.emit("auth:reauth", token)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
} exports.reauthenticateWebsockets = reauthenticateWebsockets;
|
|
163
|
-
|
|
164
24
|
/**
|
|
165
25
|
* Create a client with the specified access key, private key, and websocket enablement.
|
|
166
26
|
*
|
|
@@ -168,54 +28,56 @@ if (globalThis.isServerMode) {
|
|
|
168
28
|
* @return {Object} sharedState - Object containing eventBus, mainOrigin, baseRequest, sockets, rest, and version
|
|
169
29
|
*/
|
|
170
30
|
function createClient({
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
31
|
+
accessKey = null,
|
|
32
|
+
privateKey = null,
|
|
33
|
+
enableWs = false,
|
|
34
|
+
origin = _remotes2.default.origin,
|
|
35
|
+
eventBus = new (0, _events2.default)(),
|
|
175
36
|
} = {}) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
37
|
+
const sharedState = (globalThis.__comty_shared_state = {
|
|
38
|
+
eventBus: eventBus,
|
|
39
|
+
mainOrigin: origin,
|
|
40
|
+
baseRequest: null,
|
|
41
|
+
ws: null,
|
|
42
|
+
rest: null,
|
|
43
|
+
version: _packagejson2.default.version,
|
|
44
|
+
addons: new (0, _addons2.default)(),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
if (privateKey && accessKey && globalThis.isServerMode) {
|
|
48
|
+
_withStorage2.default.engine.set("token", `${accessKey}:${privateKey}`)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
sharedState.baseRequest = _axios2.default.create({
|
|
52
|
+
baseURL: origin,
|
|
53
|
+
headers: {
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
// create a interceptor to attach the token every request
|
|
59
|
+
sharedState.baseRequest.interceptors.request.use((config) => {
|
|
60
|
+
// check if current request has no Authorization header, if so, attach the token
|
|
61
|
+
if (!config.headers["Authorization"]) {
|
|
62
|
+
const sessionToken = _withStorage2.default.engine.get("token")
|
|
63
|
+
|
|
64
|
+
if (sessionToken) {
|
|
65
|
+
config.headers["Authorization"] =
|
|
66
|
+
`${globalThis.isServerMode ? "Server" : "Bearer"} ${sessionToken}`
|
|
67
|
+
} else {
|
|
68
|
+
console.warn("Making a request with no session token")
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return config
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
if (enableWs == true) {
|
|
76
|
+
__comty_shared_state.ws = new (0, _ws2.default)()
|
|
77
|
+
sharedState.ws.connectAll()
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return sharedState
|
|
219
81
|
} exports.createClient = createClient;
|
|
220
82
|
|
|
221
|
-
exports. default = createClient
|
|
83
|
+
exports. default = createClient
|