@crosscopy/clipboard 0.1.2 → 0.1.4

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/dist/demo.js CHANGED
@@ -1,5 +1,6 @@
1
1
  'use strict';
2
2
 
3
+ var os = require('os');
3
4
  var fs = require('fs');
4
5
  var path = require('path');
5
6
  var events = require('events');
@@ -9,6 +10,7 @@ var util = require('util');
9
10
 
10
11
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
12
 
13
+ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
12
14
  var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
13
15
  var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
14
16
  var net__default = /*#__PURE__*/_interopDefaultLegacy(net);
@@ -88,21 +90,40 @@ var init_clipboard = __esm({
88
90
  return Promise.resolve(this.writeTextSync(content));
89
91
  }
90
92
  writeTextSync(content) {
91
- var _a, _b;
92
- const writeTextProcess = child_process.execFile(this.goClipboardPath, [
93
- "WRITE_TEXT" /* WRITE_TEXT */
94
- ]);
95
- (_a = writeTextProcess.stdin) == null ? void 0 : _a.write(content);
96
- (_b = writeTextProcess.stdin) == null ? void 0 : _b.end();
93
+ child_process.execFileSync(
94
+ this.goClipboardPath,
95
+ ["WRITE_TEXT" /* WRITE_TEXT */],
96
+ {
97
+ input: Buffer.from(content).toString("base64")
98
+ }
99
+ );
97
100
  }
98
101
  writeImageSync(data) {
99
- var _a, _b;
100
102
  if (data instanceof String || typeof data === "string") {
101
- const writeImageProcess = child_process.execFile(this.goClipboardPath, [
102
- "WRITE_IMAGE" /* WRITE_IMAGE */
103
- ]);
104
- (_a = writeImageProcess.stdin) == null ? void 0 : _a.write(data);
105
- (_b = writeImageProcess.stdin) == null ? void 0 : _b.end();
103
+ if (process.platform === "win32") {
104
+ const tmpDir = os__default["default"].tmpdir();
105
+ const imgPath = path__default["default"].join(tmpDir, "tmp.png");
106
+ const imgBuf = Buffer.from(data, "base64");
107
+ fs__default["default"].writeFileSync(imgPath, imgBuf);
108
+ const scriptPath = path__default["default"].join(
109
+ this.goClipboardPath,
110
+ "..",
111
+ "..",
112
+ "scripts",
113
+ "win",
114
+ "write_image.ps1"
115
+ );
116
+ console.log(scriptPath);
117
+ child_process.execFileSync("powershell", [scriptPath, "-imagePath", imgPath]);
118
+ } else {
119
+ child_process.execFileSync(
120
+ this.goClipboardPath,
121
+ ["WRITE_IMAGE" /* WRITE_IMAGE */],
122
+ {
123
+ input: data
124
+ }
125
+ );
126
+ }
106
127
  } else if (data instanceof Buffer) {
107
128
  this.writeImageSync(data.toString("base64"));
108
129
  } else {
@@ -130,7 +151,6 @@ var init_clipboard = __esm({
130
151
  ]);
131
152
  const stdoutStr = buf.toString();
132
153
  const imgBuf = Buffer.from(stdoutStr, "base64");
133
- fs__default["default"].writeFileSync("test.png", imgBuf);
134
154
  return imgBuf;
135
155
  }
136
156
  readImageBase64Sync() {
@@ -183,7 +203,7 @@ var init_clipboard = __esm({
183
203
  var base64img;
184
204
  var init_data = __esm({
185
205
  "__tests__/data.ts"() {
186
- base64img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDumIVSx6AZrD0LxPba9d3sFujD7K+xie5rVvpPJsJ5P7qE/pXn3woXdY6rfdWluWNcEYpxbOlvVI9JormvDPioa/eahbGHy3tJNh966WpaadmUnfYy/ESzP4fvVgUtK0TBQOpOK8s8Kaj4q8P6MbC38PPJlifMbjOa9npMD0FXGdlaxLjd3ueFeDr/AMTReJtRjsrSPzpJd1yr/wAHPavc4S5hQyDD4G761mWXh6xsNWudSgQrPcffPY1rUVJqT0CEWkf/2Q==";
206
+ base64img = "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";
187
207
  }
188
208
  });
189
209
  var require_demo = __commonJS({
package/dist/demo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util.ts","../src/constants.ts","../index.ts","../__tests__/data.ts","../demo.ts"],"names":["data","fs"],"mappings":"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","sourcesContent":["export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};","export enum ClipboardOperation {\n READ_TEXT = \"READ_TEXT\",\n WRITE_TEXT = \"WRITE_TEXT\",\n READ_IMAGE = \"READ_IMAGE\",\n WRITE_IMAGE = \"WRITE_IMAGE\",\n}\n\nexport enum WatchEvent {\n TEXT_CHANGED = \"TEXT_CHANGED\",\n IMAGE_CHANGED = \"IMAGE_CHANGED\",\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_TEXT,\n ]);\n writeTextProcess.stdin?.write(content);\n writeTextProcess.stdin?.end();\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n const writeImageProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_IMAGE,\n ]);\n writeImageProcess.stdin?.write(data);\n writeImageProcess.stdin?.end();\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n fs.writeFileSync(\"test.png\", imgBuf);\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: ImageCallback | TextCallback): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void\ntype ImageCallback = (data: Buffer) => void\n\nexport default new Clipboard();\n","export const base64img =\n \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDumIVSx6AZrD0LxPba9d3sFujD7K+xie5rVvpPJsJ5P7qE/pXn3woXdY6rfdWluWNcEYpxbOlvVI9JormvDPioa/eahbGHy3tJNh966WpaadmUnfYy/ESzP4fvVgUtK0TBQOpOK8s8Kaj4q8P6MbC38PPJlifMbjOa9npMD0FXGdlaxLjd3ueFeDr/AMTReJtRjsrSPzpJd1yr/wAHPavc4S5hQyDD4G761mWXh6xsNWudSgQrPcffPY1rUVJqT0CEWkf/2Q==\";","import clipboard from \"./index\";\nimport fs from \"node:fs\";\nimport { base64img } from \"./__tests__/data\";\n\n(async function () {\n console.log(clipboard.readTextSync());\n console.log(await clipboard.readText());\n const imgBuf = clipboard.readImageSync();\n // console.log(imgBuf.toString(\"base64\"));\n // console.log(clipboard.readImageBase64Sync());\n // await clipboard.writeImage(base64img); // add fake image to clipboard\n clipboard.writeImageSync(base64img); // add fake image to clipboard\n console.log(\"\"); // give some time\n console.assert(clipboard.readImageBase64Sync() === base64img);\n\n // * test readimage\n clipboard.writeImageSync(base64img);\n console.log();\n console.assert(\n (await clipboard.readImage()).toString(\"base64\") === base64img\n );\n\n await clipboard.writeImage(base64img);\n console.log();\n console.assert((await clipboard.readImageBase64()) === base64img);\n clipboard.on(\"text\", (text) => {\n console.log(text);\n });\n clipboard.on(\"image\", (data) => {\n fs.writeFileSync(\"test.png\", data);\n });\n clipboard.listen();\n setTimeout(() => {\n clipboard.close();\n }, 10000);\n})();\n"]}
1
+ {"version":3,"sources":["../src/util.ts","../src/constants.ts","../index.ts","../__tests__/data.ts","../demo.ts"],"names":["data","fs"],"mappings":"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","sourcesContent":["export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};","export enum ClipboardOperation {\n READ_TEXT = \"READ_TEXT\",\n WRITE_TEXT = \"WRITE_TEXT\",\n READ_IMAGE = \"READ_IMAGE\",\n WRITE_IMAGE = \"WRITE_IMAGE\",\n}\n\nexport enum WatchEvent {\n TEXT_CHANGED = \"TEXT_CHANGED\",\n IMAGE_CHANGED = \"IMAGE_CHANGED\",\n}\n","import os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_TEXT],\n {\n input: Buffer.from(content).toString('base64'),\n // stdio: \"inherit\",\n // TODO: consider using stdio to get stderr using pipe and handle error\n // stderr should be auto piped to parent process\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio: ['pipe']\n }\n );\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n if (process.platform === \"win32\") {\n const tmpDir = os.tmpdir();\n const imgPath = path.join(tmpDir, \"tmp.png\");\n const imgBuf = Buffer.from(data, \"base64\");\n fs.writeFileSync(imgPath, imgBuf);\n const scriptPath = path.join(\n this.goClipboardPath,\n \"..\",\n \"..\",\n \"scripts\",\n \"win\",\n \"write_image.ps1\"\n );\n console.log(scriptPath);\n execFileSync(\"powershell\", [scriptPath, \"-imagePath\", imgPath]);\n } else {\n const writeImageProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_IMAGE],\n {\n input: data,\n // TODO: consider using stdio to get stderr using pipe and handle error\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio:\n }\n );\n }\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n // * The following commented out code is for reading image on windows using powershell script\n // * I wrote the script when I was working on writing image to clipboard on windows with powershell\n // * The go clipboard also works.\n // * After testing, the powershell version is around 31 times slower than the go-clipboard version\n // * powershell takes around 0.5 second to read, while go clipboard takes ~20ms.\n // * I will keep the script here for now as an alternative, in case we need it in the future.\n // if (process.platform === \"win32\") {\n // const scriptPath = path.join(this.goClipboardPath, \"..\", \"..\", \"scripts\", \"win\", \"read_image.ps1\")\n // const buf = execFileSync('powershell', [scriptPath])\n // return Buffer.from(buf.toString(), 'base64')\n // }\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n // fs.writeFileSync(\"test.png\", imgBuf); // for debugging only\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(\n event: \"text\" | \"image\" | \"close\",\n cb: ImageCallback | TextCallback\n ): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void;\ntype ImageCallback = (data: Buffer) => void;\n\nexport default new Clipboard();\n","export const base64img =\n \"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\";","import clipboard from \"./index\";\nimport fs from \"node:fs\";\nimport { base64img } from \"./__tests__/data\";\n\n(async function () {\n console.log(clipboard.readTextSync());\n console.log(await clipboard.readText());\n const imgBuf = clipboard.readImageSync();\n // console.log(imgBuf.toString(\"base64\"));\n // console.log(clipboard.readImageBase64Sync());\n // await clipboard.writeImage(base64img); // add fake image to clipboard\n clipboard.writeImageSync(base64img); // add fake image to clipboard\n console.log(\"\"); // give some time\n console.assert(clipboard.readImageBase64Sync() === base64img);\n\n // * test readimage\n clipboard.writeImageSync(base64img);\n console.log();\n console.assert(\n (await clipboard.readImage()).toString(\"base64\") === base64img\n );\n\n await clipboard.writeImage(base64img);\n console.log();\n console.assert((await clipboard.readImageBase64()) === base64img);\n clipboard.on(\"text\", (text) => {\n console.log(text);\n });\n clipboard.on(\"image\", (data) => {\n fs.writeFileSync(\"test.png\", data);\n });\n clipboard.listen();\n setTimeout(() => {\n clipboard.close();\n }, 10000);\n})();\n"]}
package/dist/demo.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import os from 'os';
1
2
  import fs from 'fs';
2
3
  import path from 'path';
3
4
  import { EventEmitter } from 'events';
@@ -79,21 +80,40 @@ var init_clipboard = __esm({
79
80
  return Promise.resolve(this.writeTextSync(content));
80
81
  }
81
82
  writeTextSync(content) {
82
- var _a, _b;
83
- const writeTextProcess = execFile(this.goClipboardPath, [
84
- "WRITE_TEXT" /* WRITE_TEXT */
85
- ]);
86
- (_a = writeTextProcess.stdin) == null ? void 0 : _a.write(content);
87
- (_b = writeTextProcess.stdin) == null ? void 0 : _b.end();
83
+ execFileSync(
84
+ this.goClipboardPath,
85
+ ["WRITE_TEXT" /* WRITE_TEXT */],
86
+ {
87
+ input: Buffer.from(content).toString("base64")
88
+ }
89
+ );
88
90
  }
89
91
  writeImageSync(data) {
90
- var _a, _b;
91
92
  if (data instanceof String || typeof data === "string") {
92
- const writeImageProcess = execFile(this.goClipboardPath, [
93
- "WRITE_IMAGE" /* WRITE_IMAGE */
94
- ]);
95
- (_a = writeImageProcess.stdin) == null ? void 0 : _a.write(data);
96
- (_b = writeImageProcess.stdin) == null ? void 0 : _b.end();
93
+ if (process.platform === "win32") {
94
+ const tmpDir = os.tmpdir();
95
+ const imgPath = path.join(tmpDir, "tmp.png");
96
+ const imgBuf = Buffer.from(data, "base64");
97
+ fs.writeFileSync(imgPath, imgBuf);
98
+ const scriptPath = path.join(
99
+ this.goClipboardPath,
100
+ "..",
101
+ "..",
102
+ "scripts",
103
+ "win",
104
+ "write_image.ps1"
105
+ );
106
+ console.log(scriptPath);
107
+ execFileSync("powershell", [scriptPath, "-imagePath", imgPath]);
108
+ } else {
109
+ execFileSync(
110
+ this.goClipboardPath,
111
+ ["WRITE_IMAGE" /* WRITE_IMAGE */],
112
+ {
113
+ input: data
114
+ }
115
+ );
116
+ }
97
117
  } else if (data instanceof Buffer) {
98
118
  this.writeImageSync(data.toString("base64"));
99
119
  } else {
@@ -121,7 +141,6 @@ var init_clipboard = __esm({
121
141
  ]);
122
142
  const stdoutStr = buf.toString();
123
143
  const imgBuf = Buffer.from(stdoutStr, "base64");
124
- fs.writeFileSync("test.png", imgBuf);
125
144
  return imgBuf;
126
145
  }
127
146
  readImageBase64Sync() {
@@ -174,7 +193,7 @@ var init_clipboard = __esm({
174
193
  var base64img;
175
194
  var init_data = __esm({
176
195
  "__tests__/data.ts"() {
177
- base64img = "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDumIVSx6AZrD0LxPba9d3sFujD7K+xie5rVvpPJsJ5P7qE/pXn3woXdY6rfdWluWNcEYpxbOlvVI9JormvDPioa/eahbGHy3tJNh966WpaadmUnfYy/ESzP4fvVgUtK0TBQOpOK8s8Kaj4q8P6MbC38PPJlifMbjOa9npMD0FXGdlaxLjd3ueFeDr/AMTReJtRjsrSPzpJd1yr/wAHPavc4S5hQyDD4G761mWXh6xsNWudSgQrPcffPY1rUVJqT0CEWkf/2Q==";
196
+ base64img = "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";
178
197
  }
179
198
  });
180
199
  var require_demo = __commonJS({
package/dist/demo.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/util.ts","../src/constants.ts","../index.ts","../__tests__/data.ts","../demo.ts"],"names":["data","fs"],"mappings":"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","sourcesContent":["export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};","export enum ClipboardOperation {\n READ_TEXT = \"READ_TEXT\",\n WRITE_TEXT = \"WRITE_TEXT\",\n READ_IMAGE = \"READ_IMAGE\",\n WRITE_IMAGE = \"WRITE_IMAGE\",\n}\n\nexport enum WatchEvent {\n TEXT_CHANGED = \"TEXT_CHANGED\",\n IMAGE_CHANGED = \"IMAGE_CHANGED\",\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_TEXT,\n ]);\n writeTextProcess.stdin?.write(content);\n writeTextProcess.stdin?.end();\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n const writeImageProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_IMAGE,\n ]);\n writeImageProcess.stdin?.write(data);\n writeImageProcess.stdin?.end();\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n fs.writeFileSync(\"test.png\", imgBuf);\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: ImageCallback | TextCallback): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void\ntype ImageCallback = (data: Buffer) => void\n\nexport default new Clipboard();\n","export const base64img =\n \"/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAgACADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDumIVSx6AZrD0LxPba9d3sFujD7K+xie5rVvpPJsJ5P7qE/pXn3woXdY6rfdWluWNcEYpxbOlvVI9JormvDPioa/eahbGHy3tJNh966WpaadmUnfYy/ESzP4fvVgUtK0TBQOpOK8s8Kaj4q8P6MbC38PPJlifMbjOa9npMD0FXGdlaxLjd3ueFeDr/AMTReJtRjsrSPzpJd1yr/wAHPavc4S5hQyDD4G761mWXh6xsNWudSgQrPcffPY1rUVJqT0CEWkf/2Q==\";","import clipboard from \"./index\";\nimport fs from \"node:fs\";\nimport { base64img } from \"./__tests__/data\";\n\n(async function () {\n console.log(clipboard.readTextSync());\n console.log(await clipboard.readText());\n const imgBuf = clipboard.readImageSync();\n // console.log(imgBuf.toString(\"base64\"));\n // console.log(clipboard.readImageBase64Sync());\n // await clipboard.writeImage(base64img); // add fake image to clipboard\n clipboard.writeImageSync(base64img); // add fake image to clipboard\n console.log(\"\"); // give some time\n console.assert(clipboard.readImageBase64Sync() === base64img);\n\n // * test readimage\n clipboard.writeImageSync(base64img);\n console.log();\n console.assert(\n (await clipboard.readImage()).toString(\"base64\") === base64img\n );\n\n await clipboard.writeImage(base64img);\n console.log();\n console.assert((await clipboard.readImageBase64()) === base64img);\n clipboard.on(\"text\", (text) => {\n console.log(text);\n });\n clipboard.on(\"image\", (data) => {\n fs.writeFileSync(\"test.png\", data);\n });\n clipboard.listen();\n setTimeout(() => {\n clipboard.close();\n }, 10000);\n})();\n"]}
1
+ {"version":3,"sources":["../src/util.ts","../src/constants.ts","../index.ts","../__tests__/data.ts","../demo.ts"],"names":["data","fs"],"mappings":"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","sourcesContent":["export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};","export enum ClipboardOperation {\n READ_TEXT = \"READ_TEXT\",\n WRITE_TEXT = \"WRITE_TEXT\",\n READ_IMAGE = \"READ_IMAGE\",\n WRITE_IMAGE = \"WRITE_IMAGE\",\n}\n\nexport enum WatchEvent {\n TEXT_CHANGED = \"TEXT_CHANGED\",\n IMAGE_CHANGED = \"IMAGE_CHANGED\",\n}\n","import os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_TEXT],\n {\n input: Buffer.from(content).toString('base64'),\n // stdio: \"inherit\",\n // TODO: consider using stdio to get stderr using pipe and handle error\n // stderr should be auto piped to parent process\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio: ['pipe']\n }\n );\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n if (process.platform === \"win32\") {\n const tmpDir = os.tmpdir();\n const imgPath = path.join(tmpDir, \"tmp.png\");\n const imgBuf = Buffer.from(data, \"base64\");\n fs.writeFileSync(imgPath, imgBuf);\n const scriptPath = path.join(\n this.goClipboardPath,\n \"..\",\n \"..\",\n \"scripts\",\n \"win\",\n \"write_image.ps1\"\n );\n console.log(scriptPath);\n execFileSync(\"powershell\", [scriptPath, \"-imagePath\", imgPath]);\n } else {\n const writeImageProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_IMAGE],\n {\n input: data,\n // TODO: consider using stdio to get stderr using pipe and handle error\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio:\n }\n );\n }\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n // * The following commented out code is for reading image on windows using powershell script\n // * I wrote the script when I was working on writing image to clipboard on windows with powershell\n // * The go clipboard also works.\n // * After testing, the powershell version is around 31 times slower than the go-clipboard version\n // * powershell takes around 0.5 second to read, while go clipboard takes ~20ms.\n // * I will keep the script here for now as an alternative, in case we need it in the future.\n // if (process.platform === \"win32\") {\n // const scriptPath = path.join(this.goClipboardPath, \"..\", \"..\", \"scripts\", \"win\", \"read_image.ps1\")\n // const buf = execFileSync('powershell', [scriptPath])\n // return Buffer.from(buf.toString(), 'base64')\n // }\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n // fs.writeFileSync(\"test.png\", imgBuf); // for debugging only\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(\n event: \"text\" | \"image\" | \"close\",\n cb: ImageCallback | TextCallback\n ): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void;\ntype ImageCallback = (data: Buffer) => void;\n\nexport default new Clipboard();\n","export const base64img =\n \"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\";","import clipboard from \"./index\";\nimport fs from \"node:fs\";\nimport { base64img } from \"./__tests__/data\";\n\n(async function () {\n console.log(clipboard.readTextSync());\n console.log(await clipboard.readText());\n const imgBuf = clipboard.readImageSync();\n // console.log(imgBuf.toString(\"base64\"));\n // console.log(clipboard.readImageBase64Sync());\n // await clipboard.writeImage(base64img); // add fake image to clipboard\n clipboard.writeImageSync(base64img); // add fake image to clipboard\n console.log(\"\"); // give some time\n console.assert(clipboard.readImageBase64Sync() === base64img);\n\n // * test readimage\n clipboard.writeImageSync(base64img);\n console.log();\n console.assert(\n (await clipboard.readImage()).toString(\"base64\") === base64img\n );\n\n await clipboard.writeImage(base64img);\n console.log();\n console.assert((await clipboard.readImageBase64()) === base64img);\n clipboard.on(\"text\", (text) => {\n console.log(text);\n });\n clipboard.on(\"image\", (data) => {\n fs.writeFileSync(\"test.png\", data);\n });\n clipboard.listen();\n setTimeout(() => {\n clipboard.close();\n }, 10000);\n})();\n"]}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var os = require('os');
5
6
  var fs = require('fs');
6
7
  var path = require('path');
7
8
  var events = require('events');
@@ -11,6 +12,7 @@ var util = require('util');
11
12
 
12
13
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
14
 
15
+ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
14
16
  var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
15
17
  var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
16
18
  var net__default = /*#__PURE__*/_interopDefaultLegacy(net);
@@ -70,21 +72,40 @@ var Clipboard = class {
70
72
  return Promise.resolve(this.writeTextSync(content));
71
73
  }
72
74
  writeTextSync(content) {
73
- var _a, _b;
74
- const writeTextProcess = child_process.execFile(this.goClipboardPath, [
75
- "WRITE_TEXT" /* WRITE_TEXT */
76
- ]);
77
- (_a = writeTextProcess.stdin) == null ? void 0 : _a.write(content);
78
- (_b = writeTextProcess.stdin) == null ? void 0 : _b.end();
75
+ child_process.execFileSync(
76
+ this.goClipboardPath,
77
+ ["WRITE_TEXT" /* WRITE_TEXT */],
78
+ {
79
+ input: Buffer.from(content).toString("base64")
80
+ }
81
+ );
79
82
  }
80
83
  writeImageSync(data) {
81
- var _a, _b;
82
84
  if (data instanceof String || typeof data === "string") {
83
- const writeImageProcess = child_process.execFile(this.goClipboardPath, [
84
- "WRITE_IMAGE" /* WRITE_IMAGE */
85
- ]);
86
- (_a = writeImageProcess.stdin) == null ? void 0 : _a.write(data);
87
- (_b = writeImageProcess.stdin) == null ? void 0 : _b.end();
85
+ if (process.platform === "win32") {
86
+ const tmpDir = os__default["default"].tmpdir();
87
+ const imgPath = path__default["default"].join(tmpDir, "tmp.png");
88
+ const imgBuf = Buffer.from(data, "base64");
89
+ fs__default["default"].writeFileSync(imgPath, imgBuf);
90
+ const scriptPath = path__default["default"].join(
91
+ this.goClipboardPath,
92
+ "..",
93
+ "..",
94
+ "scripts",
95
+ "win",
96
+ "write_image.ps1"
97
+ );
98
+ console.log(scriptPath);
99
+ child_process.execFileSync("powershell", [scriptPath, "-imagePath", imgPath]);
100
+ } else {
101
+ child_process.execFileSync(
102
+ this.goClipboardPath,
103
+ ["WRITE_IMAGE" /* WRITE_IMAGE */],
104
+ {
105
+ input: data
106
+ }
107
+ );
108
+ }
88
109
  } else if (data instanceof Buffer) {
89
110
  this.writeImageSync(data.toString("base64"));
90
111
  } else {
@@ -112,7 +133,6 @@ var Clipboard = class {
112
133
  ]);
113
134
  const stdoutStr = buf.toString();
114
135
  const imgBuf = Buffer.from(stdoutStr, "base64");
115
- fs__default["default"].writeFileSync("test.png", imgBuf);
116
136
  return imgBuf;
117
137
  }
118
138
  readImageBase64Sync() {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/util.ts"],"names":["data"],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_TEXT,\n ]);\n writeTextProcess.stdin?.write(content);\n writeTextProcess.stdin?.end();\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n const writeImageProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_IMAGE,\n ]);\n writeImageProcess.stdin?.write(data);\n writeImageProcess.stdin?.end();\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n fs.writeFileSync(\"test.png\", imgBuf);\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: ImageCallback | TextCallback): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void\ntype ImageCallback = (data: Buffer) => void\n\nexport default new Clipboard();\n","export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};"]}
1
+ {"version":3,"sources":["../index.ts","../src/util.ts"],"names":["data"],"mappings":"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","sourcesContent":["import os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_TEXT],\n {\n input: Buffer.from(content).toString('base64'),\n // stdio: \"inherit\",\n // TODO: consider using stdio to get stderr using pipe and handle error\n // stderr should be auto piped to parent process\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio: ['pipe']\n }\n );\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n if (process.platform === \"win32\") {\n const tmpDir = os.tmpdir();\n const imgPath = path.join(tmpDir, \"tmp.png\");\n const imgBuf = Buffer.from(data, \"base64\");\n fs.writeFileSync(imgPath, imgBuf);\n const scriptPath = path.join(\n this.goClipboardPath,\n \"..\",\n \"..\",\n \"scripts\",\n \"win\",\n \"write_image.ps1\"\n );\n console.log(scriptPath);\n execFileSync(\"powershell\", [scriptPath, \"-imagePath\", imgPath]);\n } else {\n const writeImageProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_IMAGE],\n {\n input: data,\n // TODO: consider using stdio to get stderr using pipe and handle error\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio:\n }\n );\n }\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n // * The following commented out code is for reading image on windows using powershell script\n // * I wrote the script when I was working on writing image to clipboard on windows with powershell\n // * The go clipboard also works.\n // * After testing, the powershell version is around 31 times slower than the go-clipboard version\n // * powershell takes around 0.5 second to read, while go clipboard takes ~20ms.\n // * I will keep the script here for now as an alternative, in case we need it in the future.\n // if (process.platform === \"win32\") {\n // const scriptPath = path.join(this.goClipboardPath, \"..\", \"..\", \"scripts\", \"win\", \"read_image.ps1\")\n // const buf = execFileSync('powershell', [scriptPath])\n // return Buffer.from(buf.toString(), 'base64')\n // }\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n // fs.writeFileSync(\"test.png\", imgBuf); // for debugging only\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(\n event: \"text\" | \"image\" | \"close\",\n cb: ImageCallback | TextCallback\n ): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void;\ntype ImageCallback = (data: Buffer) => void;\n\nexport default new Clipboard();\n","export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};"]}
package/dist/index.mjs CHANGED
@@ -1,3 +1,4 @@
1
+ import os from 'os';
1
2
  import fs from 'fs';
2
3
  import path from 'path';
3
4
  import { EventEmitter } from 'events';
@@ -59,21 +60,40 @@ var Clipboard = class {
59
60
  return Promise.resolve(this.writeTextSync(content));
60
61
  }
61
62
  writeTextSync(content) {
62
- var _a, _b;
63
- const writeTextProcess = execFile(this.goClipboardPath, [
64
- "WRITE_TEXT" /* WRITE_TEXT */
65
- ]);
66
- (_a = writeTextProcess.stdin) == null ? void 0 : _a.write(content);
67
- (_b = writeTextProcess.stdin) == null ? void 0 : _b.end();
63
+ execFileSync(
64
+ this.goClipboardPath,
65
+ ["WRITE_TEXT" /* WRITE_TEXT */],
66
+ {
67
+ input: Buffer.from(content).toString("base64")
68
+ }
69
+ );
68
70
  }
69
71
  writeImageSync(data) {
70
- var _a, _b;
71
72
  if (data instanceof String || typeof data === "string") {
72
- const writeImageProcess = execFile(this.goClipboardPath, [
73
- "WRITE_IMAGE" /* WRITE_IMAGE */
74
- ]);
75
- (_a = writeImageProcess.stdin) == null ? void 0 : _a.write(data);
76
- (_b = writeImageProcess.stdin) == null ? void 0 : _b.end();
73
+ if (process.platform === "win32") {
74
+ const tmpDir = os.tmpdir();
75
+ const imgPath = path.join(tmpDir, "tmp.png");
76
+ const imgBuf = Buffer.from(data, "base64");
77
+ fs.writeFileSync(imgPath, imgBuf);
78
+ const scriptPath = path.join(
79
+ this.goClipboardPath,
80
+ "..",
81
+ "..",
82
+ "scripts",
83
+ "win",
84
+ "write_image.ps1"
85
+ );
86
+ console.log(scriptPath);
87
+ execFileSync("powershell", [scriptPath, "-imagePath", imgPath]);
88
+ } else {
89
+ execFileSync(
90
+ this.goClipboardPath,
91
+ ["WRITE_IMAGE" /* WRITE_IMAGE */],
92
+ {
93
+ input: data
94
+ }
95
+ );
96
+ }
77
97
  } else if (data instanceof Buffer) {
78
98
  this.writeImageSync(data.toString("base64"));
79
99
  } else {
@@ -101,7 +121,6 @@ var Clipboard = class {
101
121
  ]);
102
122
  const stdoutStr = buf.toString();
103
123
  const imgBuf = Buffer.from(stdoutStr, "base64");
104
- fs.writeFileSync("test.png", imgBuf);
105
124
  return imgBuf;
106
125
  }
107
126
  readImageBase64Sync() {
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/util.ts"],"names":["data"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,OAAO,SAAS;AAChB,SAAS,UAAwB,oBAAoB;AACrD,OAAO,UAAU;;;ACHV,IAAM,qBAAqB,CAAC,cAAsB;AACvD,QAAM,YAAY,OAAO,KAAK,WAAW,QAAQ;AACjD,QAAM,OAAO,UAAU,SAAS,MAAM;AACtC,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,QAAwB;AACtD,QAAM,aAAa,IAAI,SAAS;AAChC,SAAO,mBAAmB,UAAU;AACtC;;;ADFA,IAAM,gBAAgB,KAAK,UAAU,QAAQ;AAEtC,IAAM,YAAN,MAAgB;AAAA,EAKrB,cAAc;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU,IAAI,aAAa;AAAA,EAClC;AAAA,EAEA,IAAI,cAAsB;AACxB,UAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,QAAI,cAAc,gBAAgB,YAAY;AAC9C,QAAI,aAAa,SAAS;AACxB,qBAAe;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,kBAA0B;AAC5B,UAAM,UAAU,CAAC,SAAS;AAE1B,QAAI,KAAK,SAAS,SAAS,MAAM,QAAQ;AACvC,cAAQ,KAAK,IAAI;AAAA,IACnB;AAEA,YAAQ,KAAK,GAAG,CAAC,gBAAgB,YAAY,KAAK,WAAW,CAAC;AAC9D,UAAM,UAAU,KAAK,KAAK,GAAG,OAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,WAA4B;AAC1B,WAAO,cAAc,KAAK,iBAAiB;AAAA;AAAA,IAE3C,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,aAAO,mBAAmB,OAAO,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,eAAuB;AACrB,UAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,IAE/C,CAAC;AACD,WAAO,gBAAgB,GAAG;AAAA,EAC5B;AAAA,EAEA,UAAU,SAAgC;AACxC,WAAO,QAAQ,QAAQ,KAAK,cAAc,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,cAAc,SAAuB;AA7DvC;AA8DI,UAAM,mBAAmB,SAAS,KAAK,iBAAiB;AAAA;AAAA,IAExD,CAAC;AACD,2BAAiB,UAAjB,mBAAwB,MAAM;AAC9B,2BAAiB,UAAjB,mBAAwB;AAAA,EAC1B;AAAA,EAIA,eAAe,MAA6B;AAvE9C;AAwEI,QAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,YAAM,oBAAoB,SAAS,KAAK,iBAAiB;AAAA;AAAA,MAEzD,CAAC;AACD,8BAAkB,UAAlB,mBAAyB,MAAM;AAC/B,8BAAkB,UAAlB,mBAAyB;AAAA,IAC3B,WAAW,gBAAgB,QAAQ;AACjC,WAAK,eAAe,KAAK,SAAS,QAAQ,CAAC;AAAA,IAC7C,OAAO;AACL,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA,EAGA,WAAW,MAAsC;AAC/C,QAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,aAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,IAC5D,WAAW,gBAAgB,QAAQ;AACjC,aAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,IAC5D,OAAO;AACL,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,YAA6B;AAC3B,WAAO,QAAQ,QAAQ,KAAK,cAAc,CAAC;AAAA,EAC7C;AAAA,EAEA,kBAAmC;AACjC,WAAO,QAAQ,QAAQ,KAAK,oBAAoB,CAAC;AAAA,EACnD;AAAA,EAEA,gBAAwB;AACtB,UAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,IAE/C,CAAC;AACD,UAAM,YAAY,IAAI,SAAS;AAC/B,UAAM,SAAS,OAAO,KAAK,WAAW,QAAQ;AAC9C,OAAG,cAAc,YAAY,MAAM;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,sBAA8B;AAC5B,WAAO,KAAK,cAAc,EAAE,SAAS,QAAQ;AAAA,EAC/C;AAAA,EAEA,SAAS;AACP,SAAK,SAAS,IAAI,aAAa,CAAC,QAAQ;AAEtC,UAAI,OAAO;AAQX,UAAI,GAAG,QAAQ,CAAC,WAAW;AACzB,gBAAQ,OAAO,SAAS;AAAA,MAC1B,CAAC;AAKD,UAAI,GAAG,SAAS,MAAM;AACpB,cAAM,UAAU,KAAK,SAAS;AAC9B,cAAM,SAAS,QAAQ,UAAU,GAAG,EAAE;AACtC,YAAI,OAAO,SAAS,uCAA6B,GAAG;AAClD,gBAAM,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAE,GAAG,QAAQ,EAAE,SAAS;AACnE,eAAK,QAAQ,KAAK,QAAQ,IAAI;AAAA,QAChC,WAAW,OAAO,SAAS,yCAA8B,GAAG;AAC1D,gBAAMA,QAAO,QAAQ,UAAU,EAAE;AACjC,eAAK,QAAQ,KAAK,SAAS,OAAO,KAAKA,OAAM,QAAQ,CAAC;AAAA,QAIxD;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,SAAK,OAAO,OAAO,OAAO,MAAM;AAxJpC;AAyJM,YAAM,QAAO,UAAK,WAAL,mBAAa;AAC1B,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,iDAAiD;AACnE,YAAM,OAAQ,KAAyB;AACvC,WAAK,QAAQ,SAAS,KAAK,iBAAiB,CAAC,KAAK,SAAS,CAAC,CAAC;AAAA,IAI/D,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AApKV;AAqKI,SAAK,QAAQ,KAAK,OAAO;AACzB,SAAK,QAAQ,mBAAmB;AAChC,eAAK,WAAL,mBAAa;AACb,UAAM,OAAM,UAAK,UAAL,mBAAY;AACxB,WAAO;AAAA,EACT;AAAA,EAKA,GAAG,OAAmC,IAAwC;AAC5E,SAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAC3B;AACF;AAKA,IAAO,oBAAQ,IAAI,UAAU","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_TEXT,\n ]);\n writeTextProcess.stdin?.write(content);\n writeTextProcess.stdin?.end();\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n const writeImageProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_IMAGE,\n ]);\n writeImageProcess.stdin?.write(data);\n writeImageProcess.stdin?.end();\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n fs.writeFileSync(\"test.png\", imgBuf);\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: ImageCallback | TextCallback): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void\ntype ImageCallback = (data: Buffer) => void\n\nexport default new Clipboard();\n","export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};"]}
1
+ {"version":3,"sources":["../index.ts","../src/util.ts"],"names":["data"],"mappings":";AAAA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,OAAO,SAAS;AAChB,SAAS,UAAwB,oBAAoB;AACrD,OAAO,UAAU;;;ACJV,IAAM,qBAAqB,CAAC,cAAsB;AACvD,QAAM,YAAY,OAAO,KAAK,WAAW,QAAQ;AACjD,QAAM,OAAO,UAAU,SAAS,MAAM;AACtC,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,QAAwB;AACtD,QAAM,aAAa,IAAI,SAAS;AAChC,SAAO,mBAAmB,UAAU;AACtC;;;ADDA,IAAM,gBAAgB,KAAK,UAAU,QAAQ;AAEtC,IAAM,YAAN,MAAgB;AAAA,EAKrB,cAAc;AACZ,SAAK,QAAQ;AACb,SAAK,UAAU,IAAI,aAAa;AAAA,EAClC;AAAA,EAEA,IAAI,cAAsB;AACxB,UAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,QAAI,cAAc,gBAAgB,YAAY;AAC9C,QAAI,aAAa,SAAS;AACxB,qBAAe;AAAA,IACjB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,kBAA0B;AAC5B,UAAM,UAAU,CAAC,SAAS;AAE1B,QAAI,KAAK,SAAS,SAAS,MAAM,QAAQ;AACvC,cAAQ,KAAK,IAAI;AAAA,IACnB;AAEA,YAAQ,KAAK,GAAG,CAAC,gBAAgB,YAAY,KAAK,WAAW,CAAC;AAC9D,UAAM,UAAU,KAAK,KAAK,GAAG,OAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,WAA4B;AAC1B,WAAO,cAAc,KAAK,iBAAiB;AAAA;AAAA,IAE3C,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,aAAO,mBAAmB,OAAO,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EAEA,eAAuB;AACrB,UAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,IAE/C,CAAC;AACD,WAAO,gBAAgB,GAAG;AAAA,EAC5B;AAAA,EAEA,UAAU,SAAgC;AACxC,WAAO,QAAQ,QAAQ,KAAK,cAAc,OAAO,CAAC;AAAA,EACpD;AAAA,EAEA,cAAc,SAAuB;AACnC,UAAM,mBAAmB;AAAA,MACvB,KAAK;AAAA,MACL,8BAA8B;AAAA,MAC9B;AAAA,QACE,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AAAA,MAM/C;AAAA,IACF;AAAA,EACF;AAAA,EAIA,eAAe,MAA6B;AAC1C,QAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,UAAI,QAAQ,aAAa,SAAS;AAChC,cAAM,SAAS,GAAG,OAAO;AACzB,cAAM,UAAU,KAAK,KAAK,QAAQ,SAAS;AAC3C,cAAM,SAAS,OAAO,KAAK,MAAM,QAAQ;AACzC,WAAG,cAAc,SAAS,MAAM;AAChC,cAAM,aAAa,KAAK;AAAA,UACtB,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,IAAI,UAAU;AACtB,qBAAa,cAAc,CAAC,YAAY,cAAc,OAAO,CAAC;AAAA,MAChE,OAAO;AACL,cAAM,oBAAoB;AAAA,UACxB,KAAK;AAAA,UACL,gCAA+B;AAAA,UAC/B;AAAA,YACE,OAAO;AAAA,UAIT;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,gBAAgB,QAAQ;AACjC,WAAK,eAAe,KAAK,SAAS,QAAQ,CAAC;AAAA,IAC7C,OAAO;AACL,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA,EAGA,WAAW,MAAsC;AAC/C,QAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,aAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,IAC5D,WAAW,gBAAgB,QAAQ;AACjC,aAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,IAC5D,OAAO;AACL,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AAAA,EACF;AAAA,EAEA,YAA6B;AAC3B,WAAO,QAAQ,QAAQ,KAAK,cAAc,CAAC;AAAA,EAC7C;AAAA,EAEA,kBAAmC;AACjC,WAAO,QAAQ,QAAQ,KAAK,oBAAoB,CAAC;AAAA,EACnD;AAAA,EAEA,gBAAwB;AAYtB,UAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,IAE/C,CAAC;AACD,UAAM,YAAY,IAAI,SAAS;AAC/B,UAAM,SAAS,OAAO,KAAK,WAAW,QAAQ;AAE9C,WAAO;AAAA,EACT;AAAA,EAEA,sBAA8B;AAC5B,WAAO,KAAK,cAAc,EAAE,SAAS,QAAQ;AAAA,EAC/C;AAAA,EAEA,SAAS;AACP,SAAK,SAAS,IAAI,aAAa,CAAC,QAAQ;AAEtC,UAAI,OAAO;AAQX,UAAI,GAAG,QAAQ,CAAC,WAAW;AACzB,gBAAQ,OAAO,SAAS;AAAA,MAC1B,CAAC;AAKD,UAAI,GAAG,SAAS,MAAM;AACpB,cAAM,UAAU,KAAK,SAAS;AAC9B,cAAM,SAAS,QAAQ,UAAU,GAAG,EAAE;AACtC,YAAI,OAAO,SAAS,uCAA6B,GAAG;AAClD,gBAAM,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAE,GAAG,QAAQ,EAAE,SAAS;AACnE,eAAK,QAAQ,KAAK,QAAQ,IAAI;AAAA,QAChC,WAAW,OAAO,SAAS,yCAA8B,GAAG;AAC1D,gBAAMA,QAAO,QAAQ,UAAU,EAAE;AACjC,eAAK,QAAQ,KAAK,SAAS,OAAO,KAAKA,OAAM,QAAQ,CAAC;AAAA,QAIxD;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,SAAK,OAAO,OAAO,OAAO,MAAM;AAjMpC;AAkMM,YAAM,QAAO,UAAK,WAAL,mBAAa;AAC1B,UAAI,CAAC;AACH,cAAM,IAAI,MAAM,iDAAiD;AACnE,YAAM,OAAQ,KAAyB;AACvC,WAAK,QAAQ,SAAS,KAAK,iBAAiB,CAAC,KAAK,SAAS,CAAC,CAAC;AAAA,IAI/D,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ;AA7MV;AA8MI,SAAK,QAAQ,KAAK,OAAO;AACzB,SAAK,QAAQ,mBAAmB;AAChC,eAAK,WAAL,mBAAa;AACb,UAAM,OAAM,UAAK,UAAL,mBAAY;AACxB,WAAO;AAAA,EACT;AAAA,EAKA,GACE,OACA,IACM;AACN,SAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,EAC3B;AACF;AAKA,IAAO,oBAAQ,IAAI,UAAU","sourcesContent":["import os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_TEXT],\n {\n input: Buffer.from(content).toString('base64'),\n // stdio: \"inherit\",\n // TODO: consider using stdio to get stderr using pipe and handle error\n // stderr should be auto piped to parent process\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio: ['pipe']\n }\n );\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n if (process.platform === \"win32\") {\n const tmpDir = os.tmpdir();\n const imgPath = path.join(tmpDir, \"tmp.png\");\n const imgBuf = Buffer.from(data, \"base64\");\n fs.writeFileSync(imgPath, imgBuf);\n const scriptPath = path.join(\n this.goClipboardPath,\n \"..\",\n \"..\",\n \"scripts\",\n \"win\",\n \"write_image.ps1\"\n );\n console.log(scriptPath);\n execFileSync(\"powershell\", [scriptPath, \"-imagePath\", imgPath]);\n } else {\n const writeImageProcess = execFileSync(\n this.goClipboardPath,\n [ClipboardOperation.WRITE_IMAGE],\n {\n input: data,\n // TODO: consider using stdio to get stderr using pipe and handle error\n // https://nodejs.org/api/child_process.html#child_processexecfilesyncfile-args-options\n // stdio:\n }\n );\n }\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n // * The following commented out code is for reading image on windows using powershell script\n // * I wrote the script when I was working on writing image to clipboard on windows with powershell\n // * The go clipboard also works.\n // * After testing, the powershell version is around 31 times slower than the go-clipboard version\n // * powershell takes around 0.5 second to read, while go clipboard takes ~20ms.\n // * I will keep the script here for now as an alternative, in case we need it in the future.\n // if (process.platform === \"win32\") {\n // const scriptPath = path.join(this.goClipboardPath, \"..\", \"..\", \"scripts\", \"win\", \"read_image.ps1\")\n // const buf = execFileSync('powershell', [scriptPath])\n // return Buffer.from(buf.toString(), 'base64')\n // }\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n // fs.writeFileSync(\"test.png\", imgBuf); // for debugging only\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(19559, () => {\n const addr = this.server?.address();\n if (!addr)\n throw new Error(\"Unexpected Error: TCP Socket Server not Started\");\n const port = (addr as net.AddressInfo).port;\n this.child = execFile(this.goClipboardPath, [port.toString()]);\n // this.child.stdout?.on(\"data\", (data) => {\n // console.log(\"Received data from client socket stdout:\\n\" + data);\n // });\n });\n }\n\n close() {\n this.emitter.emit(\"close\");\n this.emitter.removeAllListeners();\n this.server?.close();\n const res = this.child?.kill();\n return res;\n }\n\n on(event: \"text\", cb: TextCallback): void;\n on(event: \"image\", cb: ImageCallback): void;\n on(event: \"close\", cb: () => void): void;\n on(\n event: \"text\" | \"image\" | \"close\",\n cb: ImageCallback | TextCallback\n ): void {\n this.emitter.on(event, cb);\n }\n}\n\ntype TextCallback = (data: string) => void;\ntype ImageCallback = (data: Buffer) => void;\n\nexport default new Clipboard();\n","export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\nexport const base64StringToUTF8 = (base64Str: string) => {\n const base64buf = Buffer.from(base64Str, \"base64\"); // parse base64 string to buffer\n const text = base64buf.toString(\"utf8\"); // base64 buffer to utf-8 string\n return text;\n};\n\nexport const base64BufToUTF8 = (buf: Buffer): string => {\n const base64Text = buf.toString();\n return base64StringToUTF8(base64Text);\n};"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crosscopy/clipboard",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Cross Platform Clipboard listener that detects both text and image update in clipboard",
5
5
  "source": "index.ts",
6
6
  "types": "./dist/index.d.ts",