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 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
- throw new Error("Failed to regenerate token, invalid server response.")
29
- }
30
-
31
- // set new token
32
- _session2.default.token = response.data.token
33
- _session2.default.refreshToken = response.data.refreshToken
34
-
35
- // emit event
36
- __comty_shared_state.eventBus.emit("session:refreshed")
37
- __comty_shared_state.refreshingToken = false
38
-
39
- _.reauthenticateWebsockets.call(void 0, )
40
-
41
- return true
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 }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _packagejson = require('../package.json'); var _packagejson2 = _interopRequireDefault(_packagejson);
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 _models = require('./models');
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 _remote = require('./remote'); var _remote2 = _interopRequireDefault(_remote);
8
+ var _remotes = require('./remotes'); var _remotes2 = _interopRequireDefault(_remotes);
10
9
 
11
- globalThis.isServerMode = typeof window === "undefined" && typeof global !== "undefined"
10
+ globalThis.isServerMode =
11
+ typeof window === "undefined" && typeof global !== "undefined"
12
12
 
13
13
  if (globalThis.isServerMode) {
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
- }
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
- accessKey = null,
172
- privateKey = null,
173
- enableWs = false,
174
- origin = _remote2.default.origin,
31
+ accessKey = null,
32
+ privateKey = null,
33
+ enableWs = false,
34
+ origin = _remotes2.default.origin,
35
+ eventBus = new (0, _events2.default)(),
175
36
  } = {}) {
176
- const sharedState = globalThis.__comty_shared_state = {
177
- eventBus: new (0, _events2.default)(),
178
- mainOrigin: origin,
179
- baseRequest: null,
180
- sockets: new Map(),
181
- rest: null,
182
- version: _packagejson2.default.version,
183
- }
184
-
185
- sharedState.rest = _models.createHandlers.call(void 0, )
186
-
187
- if (privateKey && accessKey && globalThis.isServerMode) {
188
- _withStorage2.default.engine.set("token", `${accessKey}:${privateKey}`)
189
- }
190
-
191
- sharedState.baseRequest = _axios2.default.create({
192
- baseURL: origin,
193
- headers: {
194
- "Content-Type": "application/json",
195
- }
196
- })
197
-
198
- // create a interceptor to attach the token every request
199
- sharedState.baseRequest.interceptors.request.use((config) => {
200
- // check if current request has no Authorization header, if so, attach the token
201
- if (!config.headers["Authorization"]) {
202
- const sessionToken = _withStorage2.default.engine.get("token")
203
-
204
- if (sessionToken) {
205
- config.headers["Authorization"] = `${globalThis.isServerMode ? "Server" : "Bearer"} ${sessionToken}`
206
- } else {
207
- console.warn("Making a request with no session token")
208
- }
209
- }
210
-
211
- return config
212
- })
213
-
214
- if (enableWs) {
215
- createWebsockets()
216
- }
217
-
218
- return sharedState
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