@sequencemedia/minimserver 0.1.23 → 0.1.27

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/app.js CHANGED
@@ -1,7 +1,5 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- require('@babel/register')
4
-
5
3
  require('dotenv/config')
6
4
 
7
5
  const debug = require('debug')
@@ -10,12 +8,16 @@ const psList = require('ps-list')
10
8
 
11
9
  const {
12
10
  execute
13
- } = require('./src')
11
+ } = require('./lib')
14
12
 
15
13
  const commander = require('commander')
16
14
 
17
15
  const PACKAGE = require('./package')
18
16
 
17
+ const log = debug('minimserver')
18
+
19
+ log('`minimserver` is awake')
20
+
19
21
  const NAME = 'ms.App'
20
22
  process.title = NAME
21
23
 
@@ -53,8 +55,6 @@ async function app () {
53
55
  return
54
56
  }
55
57
 
56
- const log = debug('minimserver:log')
57
-
58
58
  const {
59
59
  pid,
60
60
  argv,
package/babel.config.js CHANGED
@@ -4,7 +4,7 @@ const presets = [
4
4
  {
5
5
  useBuiltIns: 'usage',
6
6
  targets: {
7
- node: '12.9.0'
7
+ node: 'current'
8
8
  },
9
9
  corejs: 3
10
10
  }
@@ -12,6 +12,7 @@ const presets = [
12
12
  ]
13
13
 
14
14
  const plugins = [
15
+ '@babel/transform-runtime',
15
16
  '@babel/proposal-export-default-from',
16
17
  '@babel/proposal-export-namespace-from',
17
18
  'syntax-async-functions',
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.rescan=rescan;exports.restart=restart;exports.relaunch=relaunch;exports.exit=exit;exports.createFactory=createFactory;exports.changeFactory=changeFactory;exports.removeFactory=removeFactory;exports.queueRescanFactory=queueRescanFactory;exports.queueRestartFactory=queueRestartFactory;exports.queueRelaunchFactory=queueRelaunchFactory;exports.ignorePatternFactory=ignorePatternFactory;exports.execute=execute;var _os=_interopRequireDefault(require("os"));var _path=_interopRequireDefault(require("path"));var _child_process=require("child_process");var _fsExtra=require("fs-extra");var _sacredFs=require("sacred-fs");var _chokidar=_interopRequireDefault(require("chokidar"));var _anymatch=_interopRequireDefault(require("anymatch"));var _del=_interopRequireDefault(require("del"));var _debug=_interopRequireDefault(require("debug"));function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}const error=(0,_debug.default)('minimserver:error');const log=(0,_debug.default)('minimserver:log');async function originDirExists(path){try{await(0,_sacredFs.stat)(path);return true;}catch(e){const{code}=e;if(code!=='ENOENT'){const{message}=e;error(message);}return false;}}const removeAllM3UFromDestinationDir=async path=>(0,_del.default)(path,{force:true});const ensureDestinationDir=path=>new Promise((resolve,reject)=>{(0,_fsExtra.ensureDir)(path,e=>!e?resolve():reject(e));});const ensureDestinationM3U=filePath=>new Promise((resolve,reject)=>{(0,_fsExtra.ensureFile)(filePath,e=>!e?resolve():reject(e));});function rescan(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d rescan`,(e,r)=>!e?resolve(r):reject(e));});}function restart(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d restart`,(e,r)=>!e?resolve(r):reject(e));});}function relaunch(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d relaunch`,(e,r)=>!e?resolve(r):reject(e));});}function exit(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d exit`,(e,r)=>!e?resolve(r):reject(e));});}function createFactory(origin,destination){return async function create(filePath){const to=filePath.replace(origin,destination);log('create',to);try{await ensureDestinationM3U(to);return(0,_sacredFs.copyFile)(filePath,to);}catch(e){const{code}=e;if(code==='ENOENT'){error(`ENOENT in create for "${filePath}"`);}else{const{message}=e;error(message);}}};}function changeFactory(origin,destination){return async function change(filePath){const to=filePath.replace(origin,destination);log('change',to);try{await ensureDestinationM3U(to);return(0,_sacredFs.copyFile)(filePath,to);}catch(e){const{code}=e;if(code==='ENOENT'){error(`ENOENT in change for "${filePath}"`);}else{const{message}=e;error(message);}}};}function removeFactory(origin,destination){return async function remove(filePath){const to=filePath.replace(origin,destination);log('remove',to);try{return(0,_del.default)(to,{force:true});}catch({message}){error(message);}};}function queueRescanFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await rescan(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function queueRestartFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await restart(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function queueRelaunchFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await relaunch(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function ignorePatternFactory(ignore){const ignorePatterns=ignore.split(',');return function ignorePattern(filePath){return /(^|[/\\])\../.test(filePath)||(0,_anymatch.default)(ignorePatterns,filePath);};}async function execute(origin='.',destination='.',server='http://0.0.0.0:9790',ignore='',bounce=60000){let watcher;try{const o=_path.default.resolve(origin.replace('~',_os.default.homedir));if(!(await originDirExists(o)))throw new Error(`Origin "${origin}" does not exist.`);const d=_path.default.resolve(destination.replace('~',_os.default.homedir));const ignorePattern=ignorePatternFactory(ignore);watcher=_chokidar.default.watch(o,{ignored:ignorePattern});const create=createFactory(o,d);const change=changeFactory(o,d);const remove=removeFactory(o,d);await ensureDestinationDir(d);await removeAllM3UFromDestinationDir(d);const queueRescan=queueRescanFactory(server,bounce);watcher.on('add',async function handleAdd(filePath){try{await create(filePath);queueRescan();}catch({message}){error(message);}}).on('change',async function handleChange(filePath){try{await change(filePath);queueRescan();}catch({message}){error(message);}}).on('unlink',async function handleUnlink(filePath){try{await remove(filePath);queueRescan();}catch({message}){error(message);}}).on('error',({message})=>{error(`Error in watcher: "${message}"`);});queueRescan();}catch({message}){if(watcher)watcher.close();error(message);}}
1
+ "use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.changeFactory=changeFactory;exports.createFactory=createFactory;exports.ensureDestinationDir=ensureDestinationDir;exports.ensureDestinationM3U=ensureDestinationM3U;exports.execute=execute;exports.exit=exit;exports.ignorePatternFactory=ignorePatternFactory;exports.queueRelaunchFactory=queueRelaunchFactory;exports.queueRescanFactory=queueRescanFactory;exports.queueRestartFactory=queueRestartFactory;exports.relaunch=relaunch;exports.removeAllM3UFromDestinationDir=removeAllM3UFromDestinationDir;exports.removeFactory=removeFactory;exports.rescan=rescan;exports.restart=restart;var _os=_interopRequireDefault(require("os"));var _path=_interopRequireDefault(require("path"));var _child_process=require("child_process");var _fsExtra=require("fs-extra");var _promises=require("fs/promises");var _chokidar=_interopRequireDefault(require("chokidar"));var _anymatch=_interopRequireDefault(require("anymatch"));var _del=_interopRequireDefault(require("del"));var _debug=_interopRequireDefault(require("debug"));const error=(0,_debug.default)('minimserver:error');const log=(0,_debug.default)('minimserver');log('`minimserver` is awake');async function originDirExists(path){try{await(0,_promises.stat)(path);return true;}catch(e){const{code}=e;if(code!=='ENOENT'){const{message}=e;error(message);}return false;}}async function removeAllM3UFromDestinationDir(path){return await(0,_del.default)(path,{force:true});}function ensureDestinationDir(path){return new Promise((resolve,reject)=>{(0,_fsExtra.ensureDir)(path,e=>!e?resolve():reject(e));});}function ensureDestinationM3U(filePath){return new Promise((resolve,reject)=>{(0,_fsExtra.ensureFile)(filePath,e=>!e?resolve():reject(e));});}function rescan(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d rescan`,(e,r)=>!e?resolve(r):reject(e));});}function restart(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d restart`,(e,r)=>!e?resolve(r):reject(e));});}function relaunch(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d relaunch`,(e,r)=>!e?resolve(r):reject(e));});}function exit(server){return new Promise((resolve,reject)=>{(0,_child_process.exec)(`curl -X POST -H "Content-Type: text/plain" ${server} -d exit`,(e,r)=>!e?resolve(r):reject(e));});}function createFactory(origin,destination){return async function create(filePath){const to=filePath.replace(origin,destination);log('create',to);try{await ensureDestinationM3U(to);return await(0,_promises.copyFile)(filePath,to);}catch(e){const{code}=e;if(code==='ENOENT'){error(`ENOENT in create for "${filePath}"`);}else{const{message}=e;error(message);}}};}function changeFactory(origin,destination){return async function change(filePath){const to=filePath.replace(origin,destination);log('change',to);try{await ensureDestinationM3U(to);return await(0,_promises.copyFile)(filePath,to);}catch(e){const{code}=e;if(code==='ENOENT'){error(`ENOENT in change for "${filePath}"`);}else{const{message}=e;error(message);}}};}function removeFactory(origin,destination){return async function remove(filePath){const to=filePath.replace(origin,destination);log('remove',to);try{return await(0,_del.default)(to,{force:true});}catch({message}){error(message);}};}function queueRescanFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await rescan(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function queueRestartFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await restart(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function queueRelaunchFactory(server,bounce){let t=null;let x=null;let y=null;return function enqueue(){if(t){clearTimeout(t);if(x){y=true;return;}}t=setTimeout(async function dequeue(){x=true;try{const response=await relaunch(server);log(response.trim());t=null;x=null;if(y){y=null;enqueue();}}catch({message}){error(message);}},bounce);};}function ignorePatternFactory(ignore){const ignorePatterns=ignore.split(',');return function ignorePattern(filePath){return /(^|[/\\])\../.test(filePath)||(0,_anymatch.default)(ignorePatterns,filePath);};}async function execute(origin='.',destination='.',server='http://0.0.0.0:9790',ignore='',bounce=60000){let watcher;try{const o=_path.default.resolve(origin.replace('~',_os.default.homedir));if(!(await originDirExists(o)))throw new Error(`Origin "${origin}" does not exist.`);const d=_path.default.resolve(destination.replace('~',_os.default.homedir));const ignorePattern=ignorePatternFactory(ignore);watcher=_chokidar.default.watch(o,{ignored:ignorePattern});const create=createFactory(o,d);const change=changeFactory(o,d);const remove=removeFactory(o,d);await ensureDestinationDir(d);await removeAllM3UFromDestinationDir(d);const queueRescan=queueRescanFactory(server,bounce);watcher.on('add',async function handleAdd(filePath){try{await create(filePath);queueRescan();}catch({message}){error(message);}}).on('change',async function handleChange(filePath){try{await change(filePath);queueRescan();}catch({message}){error(message);}}).on('unlink',async function handleUnlink(filePath){try{await remove(filePath);queueRescan();}catch({message}){error(message);}}).on('error',function handleError({message}){error(`Error in watcher: "${message}"`);});queueRescan();}catch({message}){if(watcher)watcher.close();error(message);}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequencemedia/minimserver",
3
- "version": "0.1.23",
3
+ "version": "0.1.27",
4
4
  "description": "Watch for changes to M3Us and rescan MinimServer",
5
5
  "keywords": [
6
6
  "minimserver",
@@ -18,7 +18,7 @@
18
18
  "author": "Jonathan Perry for Sequence Media Limited <sequencemedia@sequencemedia.net>",
19
19
  "license": "MIT",
20
20
  "engines": {
21
- "node": ">=12.19.0"
21
+ "node": ">=16.13.0"
22
22
  },
23
23
  "repository": {
24
24
  "type": "git",
@@ -42,33 +42,36 @@
42
42
  "prebuild": "npm run clean"
43
43
  },
44
44
  "dependencies": {
45
- "@babel/cli": "^7.14.8",
46
- "@babel/core": "^7.14.8",
47
- "@babel/plugin-proposal-export-default-from": "^7.14.5",
48
- "@babel/plugin-proposal-export-namespace-from": "^7.14.5",
49
- "@babel/polyfill": "^7.12.1",
50
- "@babel/preset-env": "^7.14.8",
51
- "@babel/register": "^7.14.5",
52
- "babel-plugin-module-resolver": "^4.1.0",
53
- "babel-plugin-syntax-async-functions": "^6.13.0",
54
- "core-js": "^3.16.0",
45
+ "@babel/runtime": "^7.16.3",
55
46
  "anymatch": "^3.1.2",
56
47
  "chokidar": "^3.5.2",
57
- "commander": "^8.1.0",
48
+ "commander": "^8.3.0",
58
49
  "cross-env": "^7.0.3",
59
50
  "debug": "^4.3.2",
60
51
  "del": "^6.0.0",
61
52
  "dotenv": "^10.0.0",
62
53
  "fs-extra": "^10.0.0",
63
- "ps-list": "^7.2.0",
64
- "sacred-fs": "^1.2.1",
65
- "supports-color": "^9.0.2"
54
+ "ps-list": "7.2.0",
55
+ "supports-color": "^9.1.0"
66
56
  },
67
57
  "devDependencies": {
68
- "@babel/eslint-parser": "^7.14.7",
69
- "eslint": "^7.32.0",
58
+ "@babel/cli": "^7.16.0",
59
+ "@babel/core": "^7.16.0",
60
+ "@babel/eslint-parser": "^7.16.3",
61
+ "@babel/plugin-proposal-export-default-from": "^7.16.0",
62
+ "@babel/plugin-proposal-export-namespace-from": "^7.16.0",
63
+ "@babel/plugin-transform-runtime": "^7.16.4",
64
+ "@babel/preset-env": "^7.16.4",
65
+ "@babel/register": "^7.16.0",
66
+ "babel-plugin-module-resolver": "^4.1.0",
67
+ "babel-plugin-syntax-async-functions": "^6.13.0",
68
+ "core-js": "^3.19.1",
69
+ "eslint": "7.32.0",
70
+ "eslint-config-standard": "^16.0.3",
70
71
  "eslint-import-resolver-babel-module": "^5.3.1",
71
- "rimraf": "^3.0.2",
72
- "standard": "^16.0.3"
72
+ "eslint-plugin-import": "^2.25.3",
73
+ "eslint-plugin-node": "^11.1.0",
74
+ "eslint-plugin-promise": "^5.1.1",
75
+ "rimraf": "^3.0.2"
73
76
  }
74
77
  }
package/src/index.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  stat,
14
14
  copyFile
15
- } from 'sacred-fs'
15
+ } from 'fs/promises'
16
16
 
17
17
  import chokidar from 'chokidar'
18
18
  import anymatch from 'anymatch'
@@ -21,7 +21,9 @@ import del from 'del'
21
21
  import debug from 'debug'
22
22
 
23
23
  const error = debug('minimserver:error')
24
- const log = debug('minimserver:log')
24
+ const log = debug('minimserver')
25
+
26
+ log('`minimserver` is awake')
25
27
 
26
28
  async function originDirExists (path) {
27
29
  try {
@@ -43,19 +45,34 @@ async function originDirExists (path) {
43
45
  }
44
46
  }
45
47
 
46
- const removeAllM3UFromDestinationDir = async (path) => del(path, { force: true })
48
+ export async function removeAllM3UFromDestinationDir (path) {
49
+ /**
50
+ * log('removeAllM3UFromDestinationDir')
51
+ */
52
+ return await del(path, { force: true })
53
+ }
47
54
 
48
- const ensureDestinationDir = (path) => (
49
- new Promise((resolve, reject) => {
50
- ensureDir(path, (e) => (!e) ? resolve() : reject(e))
51
- })
52
- )
55
+ export function ensureDestinationDir (path) {
56
+ /*
57
+ * log('ensureDestinationDir')
58
+ */
59
+ return (
60
+ new Promise((resolve, reject) => {
61
+ ensureDir(path, (e) => (!e) ? resolve() : reject(e))
62
+ })
63
+ )
64
+ }
53
65
 
54
- const ensureDestinationM3U = (filePath) => (
55
- new Promise((resolve, reject) => {
56
- ensureFile(filePath, (e) => (!e) ? resolve() : reject(e))
57
- })
58
- )
66
+ export function ensureDestinationM3U (filePath) {
67
+ /*
68
+ * log('ensureDestinationM3U')
69
+ */
70
+ return (
71
+ new Promise((resolve, reject) => {
72
+ ensureFile(filePath, (e) => (!e) ? resolve() : reject(e))
73
+ })
74
+ )
75
+ }
59
76
 
60
77
  export function rescan (server) {
61
78
  /*
@@ -112,7 +129,9 @@ export function createFactory (origin, destination) {
112
129
 
113
130
  try {
114
131
  await ensureDestinationM3U(to)
115
- return copyFile(filePath, to)
132
+ return (
133
+ await copyFile(filePath, to)
134
+ )
116
135
  } catch (e) {
117
136
  const {
118
137
  code
@@ -142,7 +161,9 @@ export function changeFactory (origin, destination) {
142
161
 
143
162
  try {
144
163
  await ensureDestinationM3U(to)
145
- return copyFile(filePath, to)
164
+ return (
165
+ await copyFile(filePath, to)
166
+ )
146
167
  } catch (e) {
147
168
  const {
148
169
  code
@@ -171,7 +192,7 @@ export function removeFactory (origin, destination) {
171
192
  log('remove', to)
172
193
 
173
194
  try {
174
- return del(to, { force: true })
195
+ return await del(to, { force: true })
175
196
  } catch ({ message }) {
176
197
  error(message)
177
198
  }
@@ -383,7 +404,7 @@ export async function execute (
383
404
  error(message)
384
405
  }
385
406
  })
386
- .on('error', ({ message }) => {
407
+ .on('error', function handleError ({ message }) {
387
408
  error(`Error in watcher: "${message}"`)
388
409
  })
389
410
 
@@ -1,58 +0,0 @@
1
- version: 2.1
2
-
3
- jobs:
4
- publish:
5
- docker:
6
- - image: circleci/node:lts
7
- steps:
8
- - checkout
9
- - run:
10
- name: Publish to NPM
11
- command: |
12
- echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" > ~/.npmrc
13
-
14
- PATTERN="([0-9]+)\.([0-9]+)\.([0-9]+)"
15
- NAME=$(node -p "require('./package').name")
16
- VERSION=$(node -p "require('./package').version")
17
- PUBLISHED_VERSION=$(npm view $NAME version)
18
-
19
- echo Version is $VERSION
20
- echo Published version is $PUBLISHED_VERSION
21
-
22
- [[ $VERSION =~ $PATTERN ]]
23
-
24
- VERSION_MAJOR="${BASH_REMATCH[1]}"
25
- VERSION_MINOR="${BASH_REMATCH[2]}"
26
- VERSION_PATCH="${BASH_REMATCH[3]}"
27
-
28
- [[ $PUBLISHED_VERSION =~ $PATTERN ]]
29
-
30
- PUBLISHED_VERSION_MAJOR="${BASH_REMATCH[1]}"
31
- PUBLISHED_VERSION_MINOR="${BASH_REMATCH[2]}"
32
- PUBLISHED_VERSION_PATCH="${BASH_REMATCH[3]}"
33
-
34
- if [ $VERSION_MAJOR -gt $PUBLISHED_VERSION_MAJOR ] || [ $VERSION_MINOR -gt $PUBLISHED_VERSION_MINOR ] || [ $VERSION_PATCH -gt $PUBLISHED_VERSION_PATCH ]
35
- then
36
- set +e
37
-
38
- npm ci
39
- npm publish
40
-
41
- if [[ $? != 0 ]];
42
- then
43
- echo Version $VERSION was not published
44
- else
45
- echo Published version $VERSION
46
- fi
47
- fi
48
-
49
- workflows:
50
- version: 2
51
- commit-workflow:
52
- jobs:
53
- - publish:
54
- filters:
55
- branches:
56
- only: master
57
- tags:
58
- only: /^v.*/
@@ -1,9 +0,0 @@
1
- version: 2
2
-
3
- updates:
4
- - package-ecosystem: "npm"
5
- directory: "/"
6
- schedule:
7
- interval: "daily"
8
- reviewers:
9
- - sequencemedialimited