@webos-tools/cli 3.0.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.
Files changed (177) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.js +52 -0
  3. package/APIs.js +79 -0
  4. package/CHANGELOG.md +110 -0
  5. package/LICENSE +201 -0
  6. package/README.md +218 -0
  7. package/bin/ares-config.js +199 -0
  8. package/bin/ares-device-info.js +30 -0
  9. package/bin/ares-device.js +219 -0
  10. package/bin/ares-generate.js +270 -0
  11. package/bin/ares-inspect.js +179 -0
  12. package/bin/ares-install.js +223 -0
  13. package/bin/ares-launch.js +318 -0
  14. package/bin/ares-log.js +255 -0
  15. package/bin/ares-novacom.js +223 -0
  16. package/bin/ares-package.js +336 -0
  17. package/bin/ares-pull.js +156 -0
  18. package/bin/ares-push.js +155 -0
  19. package/bin/ares-server.js +174 -0
  20. package/bin/ares-setup-device.js +520 -0
  21. package/bin/ares-shell.js +132 -0
  22. package/bin/ares.js +166 -0
  23. package/files/conf/ares.json +49 -0
  24. package/files/conf/command-service.json +73 -0
  25. package/files/conf/config.json +22 -0
  26. package/files/conf/ipk.json +30 -0
  27. package/files/conf/novacom-devices.json +35 -0
  28. package/files/conf/query/query-app.json +14 -0
  29. package/files/conf/query/query-hosted.json +18 -0
  30. package/files/conf/query/query-package.json +10 -0
  31. package/files/conf/query/query-service.json +6 -0
  32. package/files/conf/sdk.json +8 -0
  33. package/files/conf/template.json +57 -0
  34. package/files/conf/webos_emul +27 -0
  35. package/files/conf-base/env/sdk-ose.json +8 -0
  36. package/files/conf-base/env/sdk-tv.json +8 -0
  37. package/files/conf-base/profile/config-ose.json +21 -0
  38. package/files/conf-base/profile/config-tv.json +22 -0
  39. package/files/conf-base/query/query-app.json +14 -0
  40. package/files/conf-base/query/query-hosted.json +18 -0
  41. package/files/conf-base/query/query-package.json +10 -0
  42. package/files/conf-base/query/query-service.json +6 -0
  43. package/files/conf-base/template-conf/ose-templates.json +67 -0
  44. package/files/conf-base/template-conf/tv-sdk-templates.json +57 -0
  45. package/files/help/ares-config.help +43 -0
  46. package/files/help/ares-device.help +94 -0
  47. package/files/help/ares-generate.help +65 -0
  48. package/files/help/ares-inspect.help +70 -0
  49. package/files/help/ares-install.help +90 -0
  50. package/files/help/ares-launch.help +100 -0
  51. package/files/help/ares-log-pmlogd.help +84 -0
  52. package/files/help/ares-log.help +101 -0
  53. package/files/help/ares-novacom.help +68 -0
  54. package/files/help/ares-package.help +101 -0
  55. package/files/help/ares-pull.help +38 -0
  56. package/files/help/ares-push.help +38 -0
  57. package/files/help/ares-server.help +39 -0
  58. package/files/help/ares-setup-device.help +75 -0
  59. package/files/help/ares-shell.help +42 -0
  60. package/files/help/ares.help +47 -0
  61. package/files/help/readme.help +23 -0
  62. package/files/schema/ApplicationDescription.schema +319 -0
  63. package/files/schema/NovacomDevices.schema +61 -0
  64. package/files/templates/ose-sdk-templates/appinfo/appinfo.json +10 -0
  65. package/files/templates/ose-sdk-templates/bootplate-web/index.html +88 -0
  66. package/files/templates/ose-sdk-templates/hosted-webapp/index.html +14 -0
  67. package/files/templates/ose-sdk-templates/icon/icon.png +0 -0
  68. package/files/templates/ose-sdk-templates/js-service/helloclient.js +31 -0
  69. package/files/templates/ose-sdk-templates/js-service/helloworld_webos_service.js +188 -0
  70. package/files/templates/ose-sdk-templates/qml-app/main.qml +68 -0
  71. package/files/templates/ose-sdk-templates/qmlappinfo/appinfo.json +10 -0
  72. package/files/templates/ose-sdk-templates/serviceinfo/package.json +11 -0
  73. package/files/templates/ose-sdk-templates/serviceinfo/services.json +8 -0
  74. package/files/templates/tv-sdk-templates/appinfo/appinfo.json +10 -0
  75. package/files/templates/tv-sdk-templates/bootplate-web/index.html +58 -0
  76. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/LICENSE-2.0.txt +202 -0
  77. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV-dev.js +1 -0
  78. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV.js +1 -0
  79. package/files/templates/tv-sdk-templates/hosted-webapp/index.html +14 -0
  80. package/files/templates/tv-sdk-templates/js-service/helloworld_service.js +37 -0
  81. package/files/templates/tv-sdk-templates/packageinfo/packageinfo.json +4 -0
  82. package/files/templates/tv-sdk-templates/serviceinfo/package.json +11 -0
  83. package/files/templates/tv-sdk-templates/serviceinfo/services.json +8 -0
  84. package/files/templates/tv-sdk-templates/webicon/icon.png +0 -0
  85. package/files/templates/tv-sdk-templates/webicon/largeIcon.png +0 -0
  86. package/lib/base/ares.html +40 -0
  87. package/lib/base/cli-appdata.js +289 -0
  88. package/lib/base/cli-control.js +44 -0
  89. package/lib/base/common-tools.js +29 -0
  90. package/lib/base/error-handler.js +265 -0
  91. package/lib/base/file-watcher.js +155 -0
  92. package/lib/base/help-format.js +147 -0
  93. package/lib/base/luna.js +178 -0
  94. package/lib/base/novacom.js +1191 -0
  95. package/lib/base/sdkenv.js +59 -0
  96. package/lib/base/server.js +137 -0
  97. package/lib/base/setup-device.js +324 -0
  98. package/lib/base/version-tools.js +79 -0
  99. package/lib/com.sdk.ares.hostedapp.ipk +0 -0
  100. package/lib/device.js +1419 -0
  101. package/lib/generator.js +377 -0
  102. package/lib/inspect.js +494 -0
  103. package/lib/install.js +463 -0
  104. package/lib/launch.js +605 -0
  105. package/lib/log.js +584 -0
  106. package/lib/package.js +2129 -0
  107. package/lib/pull.js +231 -0
  108. package/lib/pusher.js +210 -0
  109. package/lib/session.js +74 -0
  110. package/lib/shell.js +193 -0
  111. package/lib/tar-filter-pack.js +62 -0
  112. package/lib/util/copy.js +31 -0
  113. package/lib/util/createFileName.js +40 -0
  114. package/lib/util/eof.js +30 -0
  115. package/lib/util/json.js +63 -0
  116. package/lib/util/merge.js +14 -0
  117. package/lib/util/objclone.js +40 -0
  118. package/lib/util/spinner.js +37 -0
  119. package/npm-shrinkwrap.json +85 -0
  120. package/package.json +98 -0
  121. package/spec/helpers/reporter.js +65 -0
  122. package/spec/jsSpecs/apiTest/generator.spec.js +372 -0
  123. package/spec/jsSpecs/apiTest/inspector.spec.js +89 -0
  124. package/spec/jsSpecs/apiTest/installer.spec.js +67 -0
  125. package/spec/jsSpecs/apiTest/launcher.spec.js +150 -0
  126. package/spec/jsSpecs/apiTest/packager.spec.js +194 -0
  127. package/spec/jsSpecs/apiTest/puller.spec.js +101 -0
  128. package/spec/jsSpecs/apiTest/pusher.spec.js +103 -0
  129. package/spec/jsSpecs/apiTest/server.spec.js +115 -0
  130. package/spec/jsSpecs/apiTest/setupDevice.spec.js +93 -0
  131. package/spec/jsSpecs/apiTest/shell.spec.js +49 -0
  132. package/spec/jsSpecs/ares-config.spec.js +78 -0
  133. package/spec/jsSpecs/ares-device.spec.js +443 -0
  134. package/spec/jsSpecs/ares-generate.spec.js +397 -0
  135. package/spec/jsSpecs/ares-inspect.spec.js +252 -0
  136. package/spec/jsSpecs/ares-install.spec.js +150 -0
  137. package/spec/jsSpecs/ares-launch.spec.js +301 -0
  138. package/spec/jsSpecs/ares-log.spec.js +824 -0
  139. package/spec/jsSpecs/ares-novacom.spec.js +149 -0
  140. package/spec/jsSpecs/ares-package.spec.js +1211 -0
  141. package/spec/jsSpecs/ares-pull.spec.js +157 -0
  142. package/spec/jsSpecs/ares-push.spec.js +146 -0
  143. package/spec/jsSpecs/ares-server.spec.js +160 -0
  144. package/spec/jsSpecs/ares-setup-device.spec.js +281 -0
  145. package/spec/jsSpecs/ares-shell.spec.js +220 -0
  146. package/spec/jsSpecs/ares.spec.js +83 -0
  147. package/spec/jsSpecs/common-spec.js +169 -0
  148. package/spec/support/jasmine.json +22 -0
  149. package/spec/tempFiles/com.jasmine.native.app_0.0.1_arm.ipk +0 -0
  150. package/spec/tempFiles/com.jasmine.native.app_0.0.1_x86.ipk +0 -0
  151. package/spec/tempFiles/com.jasmine.web.app_0.0.1_all.ipk +0 -0
  152. package/spec/tempFiles/com.logtest.web.app_1.0.0_all.ipk +0 -0
  153. package/spec/tempFiles/copyFiles/helloFile.txt +1 -0
  154. package/spec/tempFiles/copyFiles/testFile.txt +1 -0
  155. package/spec/tempFiles/ipks/com.sample.echo_0.0.1_all.ipk +0 -0
  156. package/spec/tempFiles/ipks/com.web.app_1.0.0_all.ipk +0 -0
  157. package/spec/tempFiles/nativeApp/auto/pkg_arm64/GLES2 +0 -0
  158. package/spec/tempFiles/nativeApp/auto/pkg_arm64/appinfo.json +9 -0
  159. package/spec/tempFiles/nativeApp/auto/pkg_arm64/icon.png +0 -0
  160. package/spec/tempFiles/nativeApp/auto/pkg_arm64/largeIcon.png +0 -0
  161. package/spec/tempFiles/nativeApp/ose/pkg_arm/Hello +0 -0
  162. package/spec/tempFiles/nativeApp/ose/pkg_arm/appinfo.json +9 -0
  163. package/spec/tempFiles/nativeApp/ose/pkg_arm/icon.png +0 -0
  164. package/spec/tempFiles/nativeApp/ose/pkg_arm/largeIcon.png +0 -0
  165. package/spec/tempFiles/nativeApp/ose/pkg_arm/package.properties +2 -0
  166. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/Hello +0 -0
  167. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/appinfo.json +9 -0
  168. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/icon.png +0 -0
  169. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/largeIcon.png +0 -0
  170. package/spec/tempFiles/nativeApp/rsi/pkg_x86/GLES2 +0 -0
  171. package/spec/tempFiles/nativeApp/rsi/pkg_x86/appinfo.json +9 -0
  172. package/spec/tempFiles/nativeApp/rsi/pkg_x86/icon.png +0 -0
  173. package/spec/tempFiles/nativeApp/rsi/pkg_x86/largeIcon.png +0 -0
  174. package/spec/tempFiles/sign/sign.crt +32 -0
  175. package/spec/tempFiles/sign/signPriv.key +52 -0
  176. package/spec/test_data/ares-generate.json +41 -0
  177. package/spec/test_data/ares.json +33 -0
package/lib/pull.js ADDED
@@ -0,0 +1,231 @@
1
+ /*
2
+ * Copyright (c) 2020-2024 LG Electronics Inc.
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ const async = require('async'),
8
+ fs = require('fs'),
9
+ mkdirp = require('mkdirp'),
10
+ npmlog = require('npmlog'),
11
+ path = require('path'),
12
+ streamBuffers = require('stream-buffers'),
13
+ util = require('util'),
14
+ errHndl = require('./base/error-handler'),
15
+ novacom = require('./base/novacom'),
16
+ spinner = require('./util/spinner');
17
+
18
+ (function() {
19
+ const log = npmlog;
20
+ log.heading = 'pull';
21
+ log.level = 'warn';
22
+
23
+ const pull = {
24
+ pull: function(srcPaths, dstPath, options, next, middleCb) {
25
+ if (typeof next !== 'function') {
26
+ throw errHndl.getErrMsg("MISSING_CALLBACK", "next", util.inspect(next));
27
+ }
28
+
29
+ const writeIsFile = new streamBuffers.WritableStreamBuffer(),
30
+ writeIsDir = new streamBuffers.WritableStreamBuffer(),
31
+ writeDirList = new streamBuffers.WritableStreamBuffer(),
32
+ writeFileList = new streamBuffers.WritableStreamBuffer();
33
+
34
+ let iCount = 0,
35
+ totalSize = 0,
36
+ timeStart = new Date().getTime(),
37
+ timeEnd = new Date().getTime(),
38
+ sourcePath = srcPaths,
39
+ destinationPath = dstPath,
40
+ stringArray = [];
41
+
42
+ String.prototype.replaceAll = function(token, newToken, ignoreCase) {
43
+ let str = this + "",
44
+ i = -1;
45
+
46
+ if (typeof token === "string") {
47
+ if (ignoreCase) {
48
+ while((i = str.toLowerCase().indexOf(token, i >= 0 ? i + newToken.length : 0)) !== -1) {
49
+ str = str.substring(0, i) + newToken + str.substring(i + token.length);
50
+ }
51
+ } else {
52
+ return this.split(token).join(newToken);
53
+ }
54
+ }
55
+ return str;
56
+ };
57
+
58
+ function _makeSession(next) {
59
+ if (options.session) {
60
+ return next(null, options.session);
61
+ } else {
62
+ const printTarget = true;
63
+ options.session = new novacom.Session(options.device, printTarget, next);
64
+ }
65
+ }
66
+
67
+ function _transferFiles(session, next) {
68
+ log.verbose('pull#transferFiles()', 'sourcePath:' + sourcePath + ', destinationPath:'+ destinationPath);
69
+ try {
70
+ const orginalSourcePath = sourcePath,
71
+ dirIndex = sourcePath.length;
72
+
73
+ sourcePath = sourcePath.replaceAll(" ","\\ ");
74
+ let cmd = "[ -f " + sourcePath + " ] && echo 'f' || echo 'nf'";
75
+
76
+ session.run(cmd, null, writeIsFile, null, function() {
77
+ if (!options.silent) {
78
+ spinner.start();
79
+ }
80
+ timeStart = new Date().getTime();
81
+ if (writeIsFile.getContentsAsString() === 'f\n') {
82
+ fs.exists(destinationPath, function(exists) {
83
+ let stats;
84
+ try {
85
+ stats = fs.lstatSync(destinationPath);
86
+ if (exists) {
87
+ if (stats.isDirectory()) {
88
+ destinationPath = path.resolve(destinationPath, path.basename(orginalSourcePath));
89
+ }
90
+ }
91
+ } catch (err) {
92
+ return setImmediate(next, errHndl.getErrMsg(err));
93
+ }
94
+ session.get(sourcePath, destinationPath, function(err) {
95
+ if (err) {
96
+ return setImmediate(next, err);
97
+ } else {
98
+ if (!options.ignore) {
99
+ spinner.stop();
100
+ middleCb("Pull: " + sourcePath + " -> " + destinationPath);
101
+ }
102
+ totalSize += stats.size;
103
+ iCount++;
104
+ setImmediate(next);
105
+ }
106
+ });
107
+ });
108
+ } else {
109
+ cmd = "[ -d " + sourcePath + " ] && echo 'd' || echo 'nd'";
110
+ session.run(cmd, null, writeIsDir, null, function() {
111
+ function _copyAllFolders(next) {
112
+ cmd = "find " + sourcePath + " -type d -follow -print";
113
+ session.run(cmd, null, writeDirList, null, function() {
114
+ stringArray = writeDirList.getContentsAsString().split('\n');
115
+ async.eachSeries(stringArray, function(item, callback) {
116
+ const filepath = path.join(destinationPath, item.substring(dirIndex));
117
+ mkdirp(filepath, function(err) {
118
+ if (!options.ignore && path.resolve(filepath) !== destinationPath) {
119
+ spinner.stop();
120
+ middleCb("Pull: " + item + " -> " + filepath);
121
+ }
122
+ setImmediate(callback, err);
123
+ });
124
+ }, function(err) {
125
+ setImmediate(next, err);
126
+ });
127
+ });
128
+ }
129
+
130
+ function _copyAllFiles(next) {
131
+ cmd = "find " + sourcePath + " -type f -follow -print";
132
+ session.run(cmd, null, writeFileList, null, function() {
133
+ if (writeFileList.size() === 0) {
134
+ return setImmediate(next);
135
+ }
136
+
137
+ stringArray = writeFileList.getContentsAsString().split('\n');
138
+ stringArray.pop();
139
+ async.eachSeries(stringArray, function(item, callback) {
140
+ const filepath = path.join(destinationPath, item.substring(dirIndex));
141
+ session.get(item.replaceAll(" ","\\ "), filepath, function(err) {
142
+ if (err) {
143
+ return setImmediate(next, err);
144
+ } else {
145
+ if (!options.ignore) {
146
+ spinner.stop();
147
+ middleCb("Pull: " + item + " -> " + filepath);
148
+ }
149
+ iCount++;
150
+ const stat = fs.lstatSync(filepath);
151
+ totalSize += stat.size;
152
+ setImmediate(callback);
153
+ }
154
+ });
155
+ }, function(err) {
156
+ setImmediate(next, err);
157
+ });
158
+ });
159
+ }
160
+
161
+ if (writeIsDir.getContentsAsString() === 'd\n') {
162
+ destinationPath = path.resolve(path.join(destinationPath, path.basename(sourcePath)));
163
+ try {
164
+ const stat = fs.lstatSync(destinationPath);
165
+ if (!stat.isDirectory()) {
166
+ return next(errHndl.getErrMsg("NOT_DIRTYPE_PATH", destinationPath));
167
+ }
168
+ } catch(e) {
169
+ if (e && e.code === 'ENOENT') {
170
+ mkdirp.sync(destinationPath);
171
+ } else {
172
+ return next(e);
173
+ }
174
+ }
175
+
176
+ if (!options.ignore) {
177
+ spinner.stop();
178
+ middleCb("Pull: " + sourcePath + " -> " + destinationPath);
179
+ }
180
+
181
+ async.waterfall([
182
+ _copyAllFolders,
183
+ _copyAllFiles
184
+ ], function(err, result) {
185
+ setImmediate(next, err, result);
186
+ });
187
+ } else {
188
+ const err = errHndl.getErrMsg("NOT_EXIST_PATH", "SOURCE", sourcePath);
189
+ return setImmediate(next, err);
190
+ }
191
+ });
192
+ }
193
+ });
194
+ }
195
+ catch (err) {
196
+ let error;
197
+ if (err.code === 1) {
198
+ error = errHndl.getErrMsg("INVALID_VALUE", "path", err);
199
+ }
200
+ finish(error);
201
+ }
202
+ }
203
+
204
+ function finish(err, result) {
205
+ log.silly("pull#finsish()", "err:", err, ", result:", result);
206
+ if (!err) {
207
+ timeEnd = new Date().getTime();
208
+ const timeDur = (timeEnd-timeStart)/1000;
209
+ if (!options.silent) {
210
+ spinner.stop();
211
+ middleCb(iCount+" file(s) pulled");
212
+ middleCb(Math.round((totalSize)/(1024*timeDur))+" KB/s ("+totalSize+" bytes in "+timeDur+"s)");
213
+ }
214
+ result = {msg:"Success"};
215
+ }
216
+ return next(err, result);
217
+ }
218
+
219
+ async.waterfall([
220
+ _makeSession,
221
+ _transferFiles
222
+ ], function(err, result) {
223
+ finish(err, result);
224
+ });
225
+ }
226
+ };
227
+
228
+ if (typeof module !== 'undefined' && module.exports) {
229
+ module.exports = pull;
230
+ }
231
+ }());
package/lib/pusher.js ADDED
@@ -0,0 +1,210 @@
1
+ /*
2
+ * Copyright (c) 2020-2024 LG Electronics Inc.
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ const async = require('async'),
8
+ fs = require('fs'),
9
+ log = require('npmlog'),
10
+ path = require('path'),
11
+ streamBuffers = require('stream-buffers'),
12
+ util = require('util'),
13
+ errHndl = require('./base/error-handler'),
14
+ novacom = require('./base/novacom'),
15
+ spinner = require('./util/spinner');
16
+
17
+ (function() {
18
+ log.heading = 'push';
19
+ log.level = 'warn';
20
+
21
+ const TYPE = {
22
+ "FILE": 'f',
23
+ "DIR": 'd',
24
+ "NEW": 'n'
25
+ };
26
+
27
+ let copyfilesCount = 0,
28
+ totalSize = 0;
29
+
30
+ function Pusher() {}
31
+ module.exports = Pusher;
32
+
33
+ Pusher.prototype.push = function(srcPaths, dstPath, options, next, middleCb) {
34
+ copyfilesCount = 0, totalSize = 0;
35
+ /**
36
+ 1 file : dest => dest is a file or an existing directory.
37
+ N files : dest => dest should be an new or existing directory. (If directory is a file, error occurs.)
38
+ dir : dest => dest should be an new or existing directory. (If directory is a file, error occurs.)
39
+ */
40
+ log.verbose("pusher#push()", "srcPaths:", srcPaths, ", dstPath:", dstPath);
41
+ const startTime = new Date().getTime();
42
+ let curDstType, copyDstType;
43
+
44
+ async.waterfall([
45
+ function(next) {
46
+ if (options.session) {
47
+ return next(null, options.session);
48
+ } else {
49
+ const printTarget = true;
50
+ options.session = new novacom.Session(options.device, printTarget, next);
51
+ }
52
+ },
53
+ function(session, next) {
54
+ getDestType(session, dstPath, function(err, type) {
55
+ curDstType = type;
56
+ if (!err && type === TYPE.FILE && srcPaths.length > 1) {
57
+ err = errHndl.getErrMsg("EXISTING_FILETYPE_PATH");
58
+ }
59
+ next(err);
60
+ });
61
+ },
62
+ function(next) {
63
+ let dst;
64
+
65
+ spinner.start();
66
+ async.eachSeries(srcPaths, function(src, next) {
67
+ async.waterfall([
68
+ fs.lstat.bind(fs, src),
69
+ function(srcStats, next) {
70
+ dst = dstPath;
71
+ if (srcStats.isFile() && srcPaths.length === 1) {
72
+ if (curDstType === TYPE.DIR) {
73
+ dst = path.join(dstPath, path.basename(src));
74
+ }
75
+ copyDstType = TYPE.FILE;
76
+ } else {
77
+ copyDstType = curDstType;
78
+ }
79
+ next();
80
+ },
81
+ function(next) {
82
+ copyFilesToDst(options.session, src, dst, copyDstType, options, middleCb, next);
83
+ }
84
+ ], function(err) {
85
+ next(err);
86
+ });
87
+ }, next);
88
+ }
89
+ ], function(err) {
90
+ const result = {};
91
+ spinner.stop();
92
+ if (!err) {
93
+ const durSecs = (new Date().getTime() - startTime) / 1000;
94
+ spinner.stop();
95
+ middleCb(copyfilesCount + " file(s) pushed");
96
+ middleCb(Math.round((totalSize)/(1024*durSecs)) + " KB/s (" + totalSize + " bytes in " + durSecs + "s)");
97
+
98
+ result.msg = "Success";
99
+ } else if (err.code && err.syscall) {
100
+ err = errHndl.getErrMsg(err);
101
+ }
102
+ next(err, result);
103
+ });
104
+ };
105
+
106
+ function copyFilesToDst(session, src, dst, dstType, options, middleCb, next) {
107
+ log.verbose("pusher#copyFilesToDir()","src:", src, ", dst:", dst);
108
+
109
+ const successMsg = function(_src, _dst, _size, _ignore) {
110
+ if (!_ignore) {
111
+ spinner.stop();
112
+ middleCb("Push:" + _src + " -> " + _dst);
113
+ }
114
+ copyfilesCount++;
115
+ totalSize += _size;
116
+ };
117
+
118
+ async.waterfall([
119
+ fs.lstat.bind(fs, src),
120
+ function(stats, next) {
121
+ if (stats.isDirectory()) {
122
+ log.verbose("pusher#copyFilesToDir()", "src is a directory");
123
+ if (dstType === TYPE.FILE) {
124
+ return next(errHndl.getErrMsg("EXISTING_FILETYPE_PATH"));
125
+ }
126
+
127
+ const files = fs.readdirSync(src);
128
+ dst = path.join(dst, path.basename(src));
129
+
130
+ if (process.platform.indexOf('win') === 0) {
131
+ dst = dst.replace(/\\/g, '/');
132
+ }
133
+
134
+ if (src.length !== 1 && !options.ignore) {
135
+ spinner.stop();
136
+ middleCb("Push:" + src + " -> " + dst);
137
+ }
138
+
139
+ mkDir(session, dst, function(err) {
140
+ if (err) {
141
+ return setImmediate(next, err);
142
+ }
143
+
144
+ async.forEach(files, function(file, next) {
145
+ const nSrc = path.join(src, file);
146
+ copyFilesToDst(session, nSrc, dst, TYPE.NEW, options, middleCb, function(copyError) {
147
+ next(copyError);
148
+ });
149
+ }, function(error) {
150
+ next(error);
151
+ });
152
+ });
153
+ } else {
154
+ let dstFile;
155
+
156
+ if (dstType === TYPE.FILE) {
157
+ dstFile = dst;
158
+ dst = path.join(dst, '..');
159
+ } else {
160
+ dstFile = path.join(dst, path.basename(src));
161
+ }
162
+
163
+ if (process.platform.indexOf('win') === 0) {
164
+ dst = dst.replace(/\\/g, '/');
165
+ dstFile = dstFile.replace(/\\/g, '/');
166
+ }
167
+
168
+ mkDir(session, dst, function(err) {
169
+ log.verbose("pusher#copyFilesToDir()", "mkDir#dst:", dst, ", err:", err);
170
+ session.put(src, dstFile, function(error) {
171
+ if (!error) {
172
+ successMsg(src, dstFile, stats.size, options.ignore);
173
+ }
174
+ next(error);
175
+ });
176
+ });
177
+ }
178
+ }
179
+ ], function(err) {
180
+ next(err);
181
+ });
182
+ }
183
+
184
+ function mkDir(session, dstPath, next) {
185
+ async.series([
186
+ session.run.bind(session, "/bin/mkdir -p " + dstPath, null, null, null)
187
+ ], function(err) {
188
+ if (err && err.code === 1) {
189
+ err = errHndl.getErrMsg("FAILED_CREATE_DIR");
190
+ }
191
+ next(err);
192
+ });
193
+ }
194
+
195
+ function getDestType(session, dstPath, next) {
196
+ const wStream = new streamBuffers.WritableStreamBuffer();
197
+ let cmdDstType = "[ -d %s ] && echo 'd' || ([ -f %s ] && echo 'f' || echo 'n')";
198
+
199
+ if (process.platform.indexOf('win') === 0) {
200
+ dstPath = dstPath.replace(/\\/g, '/');
201
+ }
202
+
203
+ cmdDstType = util.format(cmdDstType, dstPath, dstPath);
204
+ session.run(cmdDstType, null, wStream, null, function(err) {
205
+ const dstType = wStream.getContentsAsString().trim();
206
+ log.verbose("pusher#push()","destionation type:", dstType);
207
+ next(err, dstType);
208
+ });
209
+ }
210
+ }());
package/lib/session.js ADDED
@@ -0,0 +1,74 @@
1
+ /*
2
+ * Copyright (c) 2020-2024 LG Electronics Inc.
3
+ *
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ const npmlog = require('npmlog'),
8
+ errHndl = require('./base/error-handler'),
9
+ luna = require('./base/luna');
10
+
11
+ (function() {
12
+ const log = npmlog;
13
+ log.heading = 'session';
14
+ log.level = 'warn';
15
+
16
+ const session ={
17
+ log: log,
18
+ getSessionList: function(options, next) {
19
+ log.info("session#getSessionList()", "options.display:", options.display);
20
+ const target = options.session.getDevice(),
21
+ addr = target.lunaAddr.getSessionList,
22
+ param = {
23
+ // luna param
24
+ subscribe: false
25
+ };
26
+ let matchedSessionId = false;
27
+
28
+ luna.sendWithoutErrorHandle(options, addr, param, function(lineObj, next) {
29
+ const resultValue = lineObj;
30
+
31
+ // case of exist sessionManager(auto)
32
+ if (resultValue.returnValue) {
33
+ if (!options.display) {
34
+ options.display = 0;
35
+ }
36
+
37
+ // if sessionList is empty
38
+ if (resultValue.sessionList.length === 0) {
39
+ return next(errHndl.getErrMsg("SELECT_PROFILE"));
40
+ }
41
+
42
+ for (let i = 0; i < resultValue.sessionList.length; i++) {
43
+ if (resultValue.sessionList[i].deviceSetInfo.displayId === undefined) {
44
+ return next(errHndl.getErrMsg("NOT_EXIST_DISPLAY"));
45
+ }
46
+ // compare returned displayId with input display
47
+ if (resultValue.sessionList[i].deviceSetInfo.displayId === Number(options.display)) {
48
+ // case the same, is going to call session call
49
+ options.sessionId = resultValue.sessionList[i].sessionId;
50
+ options.sessionInsptPort = resultValue.sessionList[i].deviceSetInfo.port.inspectorWam;
51
+ options.sessionCall = true;
52
+ matchedSessionId = true;
53
+ log.info("session#getSessionList()", "options.sessionId:", options.sessionId, ", options.sessionCall:", options.sessionCall);
54
+ }
55
+ }
56
+
57
+ if (!matchedSessionId) {
58
+ return next(errHndl.getErrMsg("INVALID_VALUE", "DISPLAY_ID", options.display));
59
+ }
60
+ } else {
61
+ log.verbose("session#getSessionList()", "Error:", resultValue.errorText);
62
+ if (options.returnWithError) {
63
+ return next(errHndl.getErrMsg("NOT_SUPPORT_SESSION"));
64
+ }
65
+ }
66
+ next(null, {});
67
+ }, next);
68
+ }
69
+ };
70
+
71
+ if (typeof module !== 'undefined' && module.exports) {
72
+ module.exports = session;
73
+ }
74
+ }());