museria 0.2.49 → 0.3.2

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.
Files changed (74) hide show
  1. package/.eslintrc +10 -2
  2. package/.github/workflows/build.yml +3 -3
  3. package/.github/workflows/publish.yml +3 -3
  4. package/README.md +55 -59
  5. package/bin/actions.js +28 -28
  6. package/bin/index.js +4 -4
  7. package/bin/runner.js +1 -1
  8. package/bin/utils.js +6 -2
  9. package/dist/client/museria.client.js +7 -7
  10. package/dist/face/45a265d0f07b31cde85f.ttf +0 -0
  11. package/dist/face/6205fd00fb1b573e9f0f.ttf +0 -0
  12. package/dist/face/8d3cabfc66809162fb4d.woff2 +0 -0
  13. package/dist/face/fb8184add5a3101ad0a3.woff2 +0 -0
  14. package/dist/face/museria.face.js +33 -13
  15. package/dist/face/style.css +13 -11
  16. package/package.json +41 -40
  17. package/src/browser/client/index.js +2 -1
  18. package/src/browser/face/client.js +2 -1
  19. package/src/browser/face/controllers/app/app.html +77 -69
  20. package/src/browser/face/controllers/app/app.js +14 -7
  21. package/src/browser/face/controllers/app/app.scss +2 -22
  22. package/src/browser/face/index.js +3 -3
  23. package/src/browser/face/styles/main.scss +91 -11
  24. package/src/browser/face/styles/vars.scss +0 -1
  25. package/src/client.js +73 -74
  26. package/src/collection/transports/music/index.js +20 -18
  27. package/src/db/transports/database/index.js +7 -5
  28. package/src/db/transports/loki/index.js +30 -25
  29. package/src/errors.js +2 -1
  30. package/src/index.js +8 -6
  31. package/src/node.js +312 -323
  32. package/src/schema.js +27 -29
  33. package/src/server/transports/express/api/butler/controllers.js +7 -10
  34. package/src/server/transports/express/api/butler/routes.js +5 -5
  35. package/src/server/transports/express/api/master/controllers.js +7 -10
  36. package/src/server/transports/express/api/master/routes.js +5 -5
  37. package/src/server/transports/express/api/node/controllers.js +52 -61
  38. package/src/server/transports/express/api/node/routes.js +10 -10
  39. package/src/server/transports/express/api/routes.js +1 -1
  40. package/src/server/transports/express/api/slave/controllers.js +7 -10
  41. package/src/server/transports/express/api/slave/routes.js +6 -6
  42. package/src/server/transports/express/client/controllers.js +40 -61
  43. package/src/server/transports/express/client/routes.js +33 -39
  44. package/src/server/transports/express/controllers.js +10 -21
  45. package/src/server/transports/express/index.js +23 -20
  46. package/src/server/transports/express/midds.js +67 -67
  47. package/src/server/transports/express/routes.js +12 -12
  48. package/src/utils.js +175 -184
  49. package/test/client.js +311 -305
  50. package/test/db/database.js +32 -28
  51. package/test/db/loki.js +78 -74
  52. package/test/group.js +161 -156
  53. package/test/index.js +20 -10
  54. package/test/node.js +461 -460
  55. package/test/routes.js +404 -399
  56. package/test/server/express.js +35 -31
  57. package/test/services.js +25 -18
  58. package/test/tools.js +8 -6
  59. package/test/utils.js +236 -234
  60. package/webpack.client.js +9 -7
  61. package/webpack.face.js +8 -6
  62. package/dist/face/fa-brands-400.eot +0 -0
  63. package/dist/face/fa-brands-400.svg +0 -3717
  64. package/dist/face/fa-brands-400.ttf +0 -0
  65. package/dist/face/fa-brands-400.woff +0 -0
  66. package/dist/face/fa-brands-400.woff2 +0 -0
  67. package/dist/face/fa-solid-900.eot +0 -0
  68. package/dist/face/fa-solid-900.svg +0 -5034
  69. package/dist/face/fa-solid-900.ttf +0 -0
  70. package/dist/face/fa-solid-900.woff +0 -0
  71. package/dist/face/fa-solid-900.woff2 +0 -0
  72. /package/dist/face/{open-sans.ttf → 17e98b9e5586529b13cc.ttf} +0 -0
  73. /package/dist/face/{proxima-nova.ttf → 326601dfabd91e3f016c.ttf} +0 -0
  74. /package/dist/face/{logo.svg → ee9c6af64aa224827cec.svg} +0 -0
@@ -1,32 +1,26 @@
1
- const errors = require('../../../../errors');
2
- const utils = require('../../../../utils');
1
+ import errors from "../../../../errors.js";
2
+ import utils from "../../../../utils.js";
3
3
 
4
- /**
5
- * Request the song
6
- */
7
- module.exports.requestSong = node => {
4
+ export const requestSong = node => {
8
5
  return async (req, res, next) => {
9
6
  try {
10
7
  const title = req.query.title;
11
- node.songTitleTest(title);
8
+ node.songTitleTest(title);
12
9
  const link = await node.getSongLink(title, req.query.type);
13
10
 
14
- if(!link) {
11
+ if (!link) {
15
12
  throw new errors.NotFoundError('File not found');
16
13
  }
17
14
 
18
15
  res.redirect(link);
19
16
  }
20
- catch(err) {
17
+ catch (err) {
21
18
  next(err);
22
19
  }
23
- }
20
+ };
24
21
  };
25
22
 
26
- /**
27
- * Get the song info
28
- */
29
- module.exports.getSongInfo = node => {
23
+ export const getSongInfo = node => {
30
24
  return async (req, res, next) => {
31
25
  try {
32
26
  const title = req.body.title;
@@ -34,51 +28,42 @@ module.exports.getSongInfo = node => {
34
28
  const info = await node.getSongInfo(title, node.prepareClientMessageOptions(req.body));
35
29
  res.send({ info });
36
30
  }
37
- catch(err) {
31
+ catch (err) {
38
32
  next(err);
39
33
  }
40
- }
34
+ };
41
35
  };
42
36
 
43
- /*
44
- * Find songs
45
- */
46
- module.exports.findSongs = node => {
47
- return async (req, res, next) => {
48
- try {
49
- const str = req.body.str;
50
- const limit = req.body.limit;
51
- const songs = await node.findSongs(str, node.prepareClientMessageOptions(req.body, {
52
- limit
53
- }));
54
- res.send({ songs });
55
- }
56
- catch(err) {
57
- next(err);
58
- }
59
- }
37
+ export const findSongs = node => {
38
+ return async (req, res, next) => {
39
+ try {
40
+ const str = req.body.str;
41
+ const limit = req.body.limit;
42
+ const songs = await node.findSongs(str, node.prepareClientMessageOptions(req.body, {
43
+ limit
44
+ }));
45
+ res.send({ songs });
46
+ }
47
+ catch (err) {
48
+ next(err);
49
+ }
50
+ };
60
51
  };
61
52
 
62
- /*
63
- * Find artist songs
64
- */
65
- module.exports.findArtistSongs = node => {
53
+ export const findArtistSongs = node => {
66
54
  return async (req, res, next) => {
67
55
  try {
68
56
  const artist = req.body.artist;
69
57
  const songs = await node.findArtistSongs(artist, node.prepareClientMessageOptions(req.body));
70
58
  res.send({ songs });
71
59
  }
72
- catch(err) {
60
+ catch (err) {
73
61
  next(err);
74
62
  }
75
- }
76
- };
63
+ };
64
+ };
77
65
 
78
- /**
79
- * Get the song link
80
- */
81
- module.exports.getSongLink = node => {
66
+ export const getSongLink = node => {
82
67
  return async (req, res, next) => {
83
68
  try {
84
69
  const title = req.body.title;
@@ -86,40 +71,34 @@ module.exports.getSongLink = node => {
86
71
  const link = await node.getSongLink(title, req.body.type, node.prepareClientMessageOptions(req.body));
87
72
  res.send({ link });
88
73
  }
89
- catch(err) {
74
+ catch (err) {
90
75
  next(err);
91
76
  }
92
- }
77
+ };
93
78
  };
94
79
 
95
- /**
96
- * Add the song
97
- */
98
- module.exports.addSong = node => {
80
+ export const addSong = node => {
99
81
  return async (req, res, next) => {
100
82
  try {
101
83
  const file = req.body.file;
102
-
103
- if(!utils.isFileReadStream(file)) {
84
+
85
+ if (!utils.isFileReadStream(file)) {
104
86
  throw new errors.WorkError('"file" field is invalid', 'ERR_MUSERIA_INVALID_FILE_FIELD');
105
87
  }
106
88
 
107
- const result = await node.addSong(file, node.prepareClientMessageOptions(req.body, {
89
+ const result = await node.addSong(file, node.prepareClientMessageOptions(req.body, {
108
90
  controlled: !!req.body.controlled,
109
91
  priority: parseInt(req.body.priority || 0)
110
92
  }));
111
93
  res.send(result);
112
94
  }
113
- catch(err) {
95
+ catch (err) {
114
96
  next(err);
115
97
  }
116
- }
98
+ };
117
99
  };
118
100
 
119
- /**
120
- * Remove the song
121
- */
122
- module.exports.removeSong = node => {
101
+ export const removeSong = node => {
123
102
  return async (req, res, next) => {
124
103
  try {
125
104
  const title = req.body.title;
@@ -127,8 +106,8 @@ module.exports.removeSong = node => {
127
106
  const result = await node.removeSong(title, node.prepareClientMessageOptions(req.body));
128
107
  res.send(result);
129
108
  }
130
- catch(err) {
109
+ catch (err) {
131
110
  next(err);
132
111
  }
133
- }
112
+ };
134
113
  };
@@ -1,15 +1,15 @@
1
- const controllers = require('./controllers');
2
- const midds = require('../midds');
1
+ import * as controllers from "./controllers.js";
2
+ import midds from "../midds.js";
3
3
 
4
- module.exports = [
4
+ export default [
5
5
  /**
6
6
  * Request the song
7
- *
7
+ *
8
8
  * @api {get} /client/request-song/
9
9
  * @apiParam {string} title
10
10
  * @apiParam {string} type
11
11
  */
12
- {
12
+ {
13
13
  name: 'requestSong',
14
14
  method: 'get',
15
15
  url: '/request-song',
@@ -18,108 +18,102 @@ module.exports = [
18
18
  controllers.requestSong
19
19
  ]
20
20
  },
21
-
22
21
  /**
23
22
  * Get the song info
24
- *
23
+ *
25
24
  * @api {post} /client/get-song-info
26
25
  * @apiParam {string} title - song title
27
26
  * @apiSuccess {object} - { info: [{...}] }
28
27
  */
29
- {
30
- name: 'getSongInfo',
31
- method: 'post',
28
+ {
29
+ name: 'getSongInfo',
30
+ method: 'post',
32
31
  url: '/get-song-info',
33
32
  fn: [
34
33
  midds.requestQueueClient,
35
34
  controllers.getSongInfo
36
35
  ]
37
36
  },
38
-
39
37
  /**
40
38
  * Find songs
41
- *
39
+ *
42
40
  * @api {post} /client/find-songs
43
41
  * @apiParam {string} str
44
42
  * @apiSuccess {object} - { songs: [{...}] }
45
43
  */
46
- {
47
- name: 'findSongs',
48
- method: 'post',
44
+ {
45
+ name: 'findSongs',
46
+ method: 'post',
49
47
  url: '/find-songs',
50
48
  fn: [
51
49
  midds.requestQueueClient,
52
50
  controllers.findSongs
53
51
  ]
54
52
  },
55
-
56
53
  /**
57
54
  * Find artist songs
58
- *
55
+ *
59
56
  * @api {post} /client/find-artist-songs
60
57
  * @apiParam {string} artist
61
58
  * @apiSuccess {object} - { songs: [{...}] }
62
59
  */
63
- {
64
- name: 'findArtistSongs',
65
- method: 'post',
60
+ {
61
+ name: 'findArtistSongs',
62
+ method: 'post',
66
63
  url: '/find-artist-songs',
67
64
  fn: [
68
65
  midds.requestQueueClient,
69
66
  controllers.findArtistSongs
70
67
  ]
71
68
  },
72
-
73
69
  /**
74
70
  * Get the song link
75
- *
71
+ *
76
72
  * @api {post} /client/get-song-link
77
73
  * @apiParam {string} title - song title
78
74
  * @apiParam {string} type - file type
79
75
  * @apiSuccess {object} - { link: '' }
80
76
  */
81
- {
82
- name: 'getSongLink',
83
- method: 'post',
77
+ {
78
+ name: 'getSongLink',
79
+ method: 'post',
84
80
  url: '/get-song-link',
85
81
  fn: [
86
82
  midds.requestQueueClient,
87
83
  controllers.getSongLink
88
84
  ]
89
85
  },
90
-
91
86
  /**
92
87
  * Add the song
93
- *
88
+ *
94
89
  * @api {post} /client/add-song/
95
- * @apiParam {fs.ReadStream|string} file
90
+ * @apiParam {fs.ReadStream|string} file
96
91
  * @apiSuccess {object} - { title: '', audioLink: '', coverLink: '', tags: {...} }
97
92
  */
98
- {
99
- name: 'addSong',
93
+ {
94
+ name: 'addSong',
100
95
  method: 'post',
101
- url: '/add-song',
96
+ url: '/add-song',
102
97
  fn: (node) => [
103
98
  midds.requestQueueClient(node, { limit: node.options.request.clientStoringConcurrency }),
104
- midds.filesFormData(node),
105
- controllers.addSong(node)
99
+ midds.filesFormData(node),
100
+ controllers.addSong(node)
106
101
  ]
107
102
  },
108
-
109
103
  /**
110
104
  * Remove the song
111
- *
105
+ *
112
106
  * @api {post} /client/remove-song
113
107
  * @apiParam {string} title - song title
114
108
  * @apiSuccess {object} - { removed: 0 }
115
109
  */
116
- {
110
+ {
117
111
  name: 'removeSong',
118
- method: 'post',
112
+ method: 'post',
119
113
  url: '/remove-song',
120
114
  fn: [
121
115
  midds.requestQueueClient,
122
116
  controllers.removeSong
123
117
  ]
124
- }
125
- ];
118
+ }
119
+ ];
@@ -1,24 +1,13 @@
1
- const express = require('express');
2
- const favicon = require('serve-favicon');
3
- const path = require('path');
1
+ import * as express from "express";
2
+ import faviconLib from "serve-favicon";
3
+ import path from "path";
4
4
 
5
- /**
6
- * Server index page handler
7
- */
8
- module.exports.indexPage = () => {
9
- return (req, res) => res.sendFile(path.resolve(__dirname, '../../../browser/face/index.html'));
10
- };
5
+ const __dirname = new URL('.', import.meta.url).pathname;
6
+ const favicon = () => faviconLib(path.resolve(__dirname, '../../../browser/face/favicon.png'));
7
+ const stat = () => express.static(path.resolve(__dirname, '../../../../dist/face'));
11
8
 
12
- /**
13
- * Server favicon handler
14
- */
15
- module.exports.favicon = () => {
16
- return favicon(path.resolve(__dirname, '../../../browser/face/favicon.png'));
9
+ export const indexPage = () => {
10
+ return (req, res) => res.sendFile(path.resolve(__dirname, '../../../browser/face/index.html'));
17
11
  };
18
-
19
- /**
20
- * Server static handler
21
- */
22
- module.exports.static = () => {
23
- return express.static(path.resolve(__dirname, '../../../../dist/face'));
24
- };
12
+ export { favicon };
13
+ export { stat as static };
@@ -1,16 +1,19 @@
1
- const ServerExpressStoracle = require('storacle/src/server/transports/express')();
2
- const ServerExpressMetastocle = require('metastocle/src/server/transports/express')(ServerExpressStoracle);
3
- const routes = require('./routes');
4
- const routesClient = require('./client/routes');
5
- const routesApi = require('./api/routes');
6
- const routesApiMaster = require('./api/master/routes');
7
- const routesApiButler = require('./api/butler/routes');
8
- const routesApiSlave = require('./api/slave/routes');
9
- const routesApiNode = require('./api/node/routes');
1
+ import expressStoracle from "storacle/src/server/transports/express/index.js";
2
+ import expressMetastocle from "metastocle/src/server/transports/express/index.js";
3
+ import routes from "./routes.js";
4
+ import routesClient from "./client/routes.js";
5
+ import routesApi from "./api/routes.js";
6
+ import routesApiMaster from "./api/master/routes.js";
7
+ import routesApiButler from "./api/butler/routes.js";
8
+ import routesApiSlave from "./api/slave/routes.js";
9
+ import routesApiNode from "./api/node/routes.js";
10
10
 
11
- module.exports = (Parent) => {
11
+ const ServerExpressStoracle = expressStoracle();
12
+ const ServerExpressMetastocle = expressMetastocle(ServerExpressStoracle);
13
+
14
+ export default (Parent) => {
12
15
  return class ServerExpressMuseria extends (Parent || ServerExpressMetastocle) {
13
- /**
16
+ /**
14
17
  * @see ServerExpressMetastocle.prototype.getMainRoutes
15
18
  */
16
19
  getMainRoutes() {
@@ -22,26 +25,26 @@ module.exports = (Parent) => {
22
25
  arr.splice(arr.findIndex(r => r.name == 'notFound'), 0, ...end);
23
26
  return arr;
24
27
  }
25
-
28
+
26
29
  /**
27
30
  * @see ServerExpressMetastocle.prototype.getClientRoutes
28
31
  */
29
32
  getClientRoutes() {
30
33
  const remove = [
31
- 'addDocument', 'updateDocuments',
34
+ 'addDocument', 'updateDocuments',
32
35
  'deleteDocuments', 'getDocumentsCount',
33
36
  'getDocumentByPk', 'getDocuments', 'removeFile'
34
37
  ];
35
38
  return super.getClientRoutes().filter(r => !remove.includes(r.name)).concat(routesClient);
36
39
  }
37
-
40
+
38
41
  /**
39
42
  * @see ServerExpressMetastocle.prototype.getApiRoutes
40
43
  */
41
- getApiRoutes() {
44
+ getApiRoutes() {
42
45
  return super.getApiRoutes().concat(routesApi);
43
46
  }
44
-
47
+
45
48
  /**
46
49
  * @see ServerExpressMetastocle.prototype.getApiMasterRoutes
47
50
  */
@@ -57,7 +60,7 @@ module.exports = (Parent) => {
57
60
  const remove = ['updateDocuments', 'deleteDocuments', 'removeFile'];
58
61
  return super.getApiButlerRoutes().filter(r => !remove.includes(r.name)).concat(routesApiButler);
59
62
  }
60
-
63
+
61
64
  /**
62
65
  * @see ServerExpressMetastocle.prototype.getApiSlaveRoutes
63
66
  */
@@ -65,7 +68,7 @@ module.exports = (Parent) => {
65
68
  const remove = ['updateDocuments', 'deleteDocuments', 'removeFile'];
66
69
  return super.getApiSlaveRoutes().filter(r => !remove.includes(r.name)).concat(routesApiSlave);
67
70
  }
68
-
71
+
69
72
  /**
70
73
  * @see ServerExpressMetastocle.prototype.getApiNodeRoutes
71
74
  */
@@ -73,5 +76,5 @@ module.exports = (Parent) => {
73
76
  const remove = ['addDocument', 'storFile'];
74
77
  return super.getApiNodeRoutes().filter(r => !remove.includes(r.name)).concat(routesApiNode);
75
78
  }
76
- }
77
- };
79
+ };
80
+ };