electron-screenshots 0.2.0 → 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.
package/lib/preload.js CHANGED
@@ -1,40 +1,4 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
2
  Object.defineProperty(exports, "__esModule", { value: true });
39
3
  var electron_1 = require("electron");
40
4
  var map = new Map();
@@ -43,44 +7,6 @@ electron_1.contextBridge.exposeInMainWorld('screenshots', {
43
7
  console.log('contextBridge ready');
44
8
  electron_1.ipcRenderer.send('SCREENSHOTS:ready');
45
9
  },
46
- capture: function (display) { return __awaiter(void 0, void 0, void 0, function () {
47
- var sources, source;
48
- return __generator(this, function (_a) {
49
- switch (_a.label) {
50
- case 0:
51
- console.log('contextBridge capture', display);
52
- return [4 /*yield*/, electron_1.desktopCapturer.getSources({
53
- types: ['screen'],
54
- thumbnailSize: {
55
- width: display.width,
56
- height: display.height
57
- }
58
- })];
59
- case 1:
60
- sources = _a.sent();
61
- // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
62
- // 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
63
- if (sources.length === 1) {
64
- source = sources[0];
65
- }
66
- else {
67
- source = sources.find(function (source) {
68
- return source.display_id === display.id.toString() || source.id.startsWith("screen:".concat(display.id, ":"));
69
- });
70
- }
71
- if (!source) {
72
- console.error(sources);
73
- console.error(display);
74
- throw new Error('没有获取到截图数据');
75
- }
76
- return [2 /*return*/, source.thumbnail.toDataURL()];
77
- }
78
- });
79
- }); },
80
- captured: function () {
81
- console.log('contextBridge captured');
82
- electron_1.ipcRenderer.send('SCREENSHOTS:captured');
83
- },
84
10
  save: function (arrayBuffer, data) {
85
11
  console.log('contextBridge save', arrayBuffer, data);
86
12
  electron_1.ipcRenderer.send('SCREENSHOTS:save', Buffer.from(arrayBuffer), data);
@@ -27,6 +27,7 @@ export default class Screenshots extends Events {
27
27
  * 初始化窗口
28
28
  */
29
29
  private createWindow;
30
+ private capture;
30
31
  /**
31
32
  * 绑定ipc时间处理
32
33
  */
@@ -14,6 +14,25 @@ var __extends = (this && this.__extends) || (function () {
14
14
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
15
  };
16
16
  })();
17
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
17
36
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
37
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
38
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -98,11 +117,11 @@ var Screenshots = /** @class */ (function (_super) {
98
117
  if (_this.$win && !_this.$win.isDestroyed()) {
99
118
  _this.$win.close();
100
119
  }
101
- _this.createWindow();
120
+ var boundAndDisplay = (0, getBoundAndDisplay_1.default)();
121
+ _this.createWindow(boundAndDisplay);
102
122
  // 捕捉桌面之后显示窗口
103
123
  // 避免截图窗口自己被截图
104
- electron_1.ipcMain.once('SCREENSHOTS:captured', function () {
105
- (0, logger_1.default)('SCREENSHOTS:captured');
124
+ _this.capture(boundAndDisplay).then(function () {
106
125
  if (!_this.$win)
107
126
  return;
108
127
  // linux截图存在黑屏,这里设置为false就不会出现这个问题
@@ -136,8 +155,8 @@ var Screenshots = /** @class */ (function (_super) {
136
155
  /**
137
156
  * 初始化窗口
138
157
  */
139
- Screenshots.prototype.createWindow = function () {
140
- var _a = (0, getBoundAndDisplay_1.default)(), bound = _a.bound, display = _a.display;
158
+ Screenshots.prototype.createWindow = function (_a) {
159
+ var bound = _a.bound;
141
160
  this.$win = new electron_1.BrowserWindow({
142
161
  title: 'screenshots',
143
162
  x: bound.x,
@@ -173,8 +192,66 @@ var Screenshots = /** @class */ (function (_super) {
173
192
  });
174
193
  this.$win.setBrowserView(this.$view);
175
194
  this.$view.setBounds(bound);
176
- (0, logger_1.default)('SCREENSHOTS:capture');
177
- this.$view.webContents.send('SCREENSHOTS:capture', display);
195
+ };
196
+ Screenshots.prototype.capture = function (_a) {
197
+ var display = _a.display;
198
+ return __awaiter(this, void 0, void 0, function () {
199
+ var NodeScreenshots, capturer, image, err_1, sources, source;
200
+ return __generator(this, function (_b) {
201
+ switch (_b.label) {
202
+ case 0:
203
+ (0, logger_1.default)('SCREENSHOTS:capture');
204
+ _b.label = 1;
205
+ case 1:
206
+ _b.trys.push([1, 4, , 6]);
207
+ return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('node-screenshots')); })];
208
+ case 2:
209
+ NodeScreenshots = (_b.sent()).Screenshots;
210
+ capturer = NodeScreenshots.fromDisplay(display.id);
211
+ (0, logger_1.default)('SCREENSHOTS:NodeScreenshots.fromDisplay(%d) %o', display.id, capturer);
212
+ if (!capturer) {
213
+ throw new Error("NodeScreenshots.fromDisplay(".concat(display.id, ") get null"));
214
+ }
215
+ return [4 /*yield*/, capturer.capture()];
216
+ case 3:
217
+ image = _b.sent();
218
+ this.$view.webContents.send('SCREENSHOTS:capture', display, "data:image/png;base64,".concat(image.toString('base64')));
219
+ return [3 /*break*/, 6];
220
+ case 4:
221
+ err_1 = _b.sent();
222
+ (0, logger_1.default)('SCREENSHOTS:capturer.capture() error %o', err_1);
223
+ return [4 /*yield*/, electron_1.desktopCapturer.getSources({
224
+ types: ['screen'],
225
+ thumbnailSize: {
226
+ width: display.width,
227
+ height: display.height
228
+ }
229
+ })];
230
+ case 5:
231
+ sources = _b.sent();
232
+ source = void 0;
233
+ // Linux系统上,screen.getDisplayNearestPoint 返回的 Display 对象的 id 和 这儿 source 对象上的 display_id(Linux上,这个值是空字符串) 或 id 的中间部分,都不一致
234
+ // 但是,如果只有一个显示器的话,其实不用判断,直接返回就行
235
+ if (sources.length === 1) {
236
+ source = sources[0];
237
+ }
238
+ else {
239
+ source = sources.find(function (source) {
240
+ return source.display_id === display.id.toString() || source.id.startsWith("screen:".concat(display.id, ":"));
241
+ });
242
+ }
243
+ if (!source) {
244
+ console.error(sources);
245
+ console.error(display);
246
+ console.error("Can't find screen source");
247
+ return [2 /*return*/];
248
+ }
249
+ this.$view.webContents.send('SCREENSHOTS:capture', display, source.thumbnail.toDataURL());
250
+ return [3 /*break*/, 6];
251
+ case 6: return [2 /*return*/];
252
+ }
253
+ });
254
+ });
178
255
  };
179
256
  /**
180
257
  * 绑定ipc时间处理
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "electron-screenshots",
3
- "version": "0.2.0",
3
+ "version": "0.3.2",
4
4
  "description": "electron 截图插件",
5
5
  "types": "lib/screenshots.d.ts",
6
6
  "main": "lib/screenshots.js",
@@ -9,7 +9,7 @@
9
9
  ],
10
10
  "scripts": {
11
11
  "prepublishOnly": "npm run build",
12
- "start": "DEBUG=screenshots electron lib/index.js",
12
+ "start": "cross-env DEBUG=screenshots electron lib/index.js",
13
13
  "dev": "tsc --sourceMap --watch",
14
14
  "build": "npm run lint && npm run clean && tsc",
15
15
  "lint": "eslint . --ext .js,.ts --fix",
@@ -36,7 +36,8 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "debug": "^4.3.3",
39
- "react-screenshots": "^0.2.0"
39
+ "node-screenshots": "^0.0.2",
40
+ "react-screenshots": "^0.3.1"
40
41
  },
41
42
  "peerDependencies": {
42
43
  "electron": ">=11"
@@ -45,6 +46,7 @@
45
46
  "@types/debug": "^4.1.7",
46
47
  "@typescript-eslint/eslint-plugin": "^5.10.0",
47
48
  "@typescript-eslint/parser": "^5.10.0",
49
+ "cross-env": "^7.0.3",
48
50
  "electron": "^16.0.7",
49
51
  "electron-debug": "^3.2.0",
50
52
  "eslint": "^8.7.0",
@@ -55,5 +57,5 @@
55
57
  "rimraf": "^3.0.2",
56
58
  "typescript": "^4.5.5"
57
59
  },
58
- "gitHead": "fd9f7978424724e99ebc89250f45360ca48926c1"
60
+ "gitHead": "600c72efd111a7077640611c32f01c06443c7b8c"
59
61
  }