museria 0.2.48 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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 +56 -60
  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 +315 -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
+ };