@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 +34 -14
- package/dist/demo.js.map +1 -1
- package/dist/demo.mjs +33 -14
- package/dist/demo.mjs.map +1 -1
- package/dist/index.js +33 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +32 -13
- package/dist/index.mjs.map +1 -1
- package/go-clipboard/binaries/go-clipboard-darwin-arm64 +0 -0
- package/go-clipboard/binaries/go-clipboard-darwin-x64 +0 -0
- package/go-clipboard/binaries/go-clipboard-linux-x64 +0 -0
- package/go-clipboard/binaries/go-clipboard-win32-x64.exe +0 -0
- package/package.json +1 -1
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
|
-
|
|
92
|
-
|
|
93
|
-
"WRITE_TEXT" /* WRITE_TEXT */
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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 = "/
|
|
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":";;;;;;;;;AAAA,IAEa,oBAMA;AARb;AAAA;AAAA;AAEO,IAAM,qBAAqB,CAAC,cAAsB;AACvD,YAAM,YAAY,OAAO,KAAK,WAAW,QAAQ;AACjD,YAAM,OAAO,UAAU,SAAS,MAAM;AACtC,aAAO;AAAA,IACT;AAEO,IAAM,kBAAkB,CAAC,QAAwB;AACtD,YAAM,aAAa,IAAI,SAAS;AAChC,aAAO,mBAAmB,UAAU;AAAA,IACtC;AAAA;AAAA;;;ACXA;AAAA;AAAA;AAAA;AAAA;;;ACAA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,oBAAoB;AAC7B,OAAO,SAAS;AAChB,SAAS,UAAwB,oBAAoB;AACrD,OAAO,UAAU;AANjB,IAUM,eAEO,WAuNN;AAnOP;AAAA;AAAA;AAOA;AACA;AAEA,IAAM,gBAAgB,KAAK,UAAU,QAAQ;AAEtC,IAAM,YAAN,MAAgB;AAAA,MAKrB,cAAc;AACZ,aAAK,QAAQ;AACb,aAAK,UAAU,IAAI,aAAa;AAAA,MAClC;AAAA,MAEA,IAAI,cAAsB;AACxB,cAAM,EAAE,UAAU,KAAK,IAAI;AAC3B,YAAI,cAAc,gBAAgB,YAAY;AAC9C,YAAI,aAAa,SAAS;AACxB,yBAAe;AAAA,QACjB;AACA,eAAO;AAAA,MACT;AAAA,MAEA,IAAI,kBAA0B;AAC5B,cAAM,UAAU,CAAC,SAAS;AAE1B,YAAI,KAAK,SAAS,SAAS,MAAM,QAAQ;AACvC,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAEA,gBAAQ,KAAK,GAAG,CAAC,gBAAgB,YAAY,KAAK,WAAW,CAAC;AAC9D,cAAM,UAAU,KAAK,KAAK,GAAG,OAAO;AACpC,eAAO;AAAA,MACT;AAAA,MAEA,WAA4B;AAC1B,eAAO,cAAc,KAAK,iBAAiB;AAAA;AAAA,QAE3C,CAAC,EAAE,KAAK,CAAC,WAAW;AAClB,iBAAO,mBAAmB,OAAO,MAAM;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,MAEA,eAAuB;AACrB,cAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,QAE/C,CAAC;AACD,eAAO,gBAAgB,GAAG;AAAA,MAC5B;AAAA,MAEA,UAAU,SAAgC;AACxC,eAAO,QAAQ,QAAQ,KAAK,cAAc,OAAO,CAAC;AAAA,MACpD;AAAA,MAEA,cAAc,SAAuB;AACnC,cAAM,mBAAmB;AAAA,UACvB,KAAK;AAAA,UACL,8BAA8B;AAAA,UAC9B;AAAA,YACE,OAAO,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AAAA,UAM/C;AAAA,QACF;AAAA,MACF;AAAA,MAIA,eAAe,MAA6B;AAC1C,YAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,cAAI,QAAQ,aAAa,SAAS;AAChC,kBAAM,SAAS,GAAG,OAAO;AACzB,kBAAM,UAAU,KAAK,KAAK,QAAQ,SAAS;AAC3C,kBAAM,SAAS,OAAO,KAAK,MAAM,QAAQ;AACzC,eAAG,cAAc,SAAS,MAAM;AAChC,kBAAM,aAAa,KAAK;AAAA,cACtB,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,oBAAQ,IAAI,UAAU;AACtB,yBAAa,cAAc,CAAC,YAAY,cAAc,OAAO,CAAC;AAAA,UAChE,OAAO;AACL,kBAAM,oBAAoB;AAAA,cACxB,KAAK;AAAA,cACL,gCAA+B;AAAA,cAC/B;AAAA,gBACE,OAAO;AAAA,cAIT;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,gBAAgB,QAAQ;AACjC,eAAK,eAAe,KAAK,SAAS,QAAQ,CAAC;AAAA,QAC7C,OAAO;AACL,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAAA,MACF;AAAA,MAGA,WAAW,MAAsC;AAC/C,YAAI,gBAAgB,UAAU,OAAO,SAAS,UAAU;AACtD,iBAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,QAC5D,WAAW,gBAAgB,QAAQ;AACjC,iBAAO,QAAQ,QAAQ,KAAK,eAAe,IAAc,CAAC;AAAA,QAC5D,OAAO;AACL,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAAA,MACF;AAAA,MAEA,YAA6B;AAC3B,eAAO,QAAQ,QAAQ,KAAK,cAAc,CAAC;AAAA,MAC7C;AAAA,MAEA,kBAAmC;AACjC,eAAO,QAAQ,QAAQ,KAAK,oBAAoB,CAAC;AAAA,MACnD;AAAA,MAEA,gBAAwB;AAYtB,cAAM,MAAM,aAAa,KAAK,iBAAiB;AAAA;AAAA,QAE/C,CAAC;AACD,cAAM,YAAY,IAAI,SAAS;AAC/B,cAAM,SAAS,OAAO,KAAK,WAAW,QAAQ;AAE9C,eAAO;AAAA,MACT;AAAA,MAEA,sBAA8B;AAC5B,eAAO,KAAK,cAAc,EAAE,SAAS,QAAQ;AAAA,MAC/C;AAAA,MAEA,SAAS;AACP,aAAK,SAAS,IAAI,aAAa,CAAC,QAAQ;AAEtC,cAAI,OAAO;AAQX,cAAI,GAAG,QAAQ,CAAC,WAAW;AACzB,oBAAQ,OAAO,SAAS;AAAA,UAC1B,CAAC;AAKD,cAAI,GAAG,SAAS,MAAM;AACpB,kBAAM,UAAU,KAAK,SAAS;AAC9B,kBAAM,SAAS,QAAQ,UAAU,GAAG,EAAE;AACtC,gBAAI,OAAO,SAAS,uCAA6B,GAAG;AAClD,oBAAM,OAAO,OAAO,KAAK,QAAQ,UAAU,EAAE,GAAG,QAAQ,EAAE,SAAS;AACnE,mBAAK,QAAQ,KAAK,QAAQ,IAAI;AAAA,YAChC,WAAW,OAAO,SAAS,yCAA8B,GAAG;AAC1D,oBAAMA,QAAO,QAAQ,UAAU,EAAE;AACjC,mBAAK,QAAQ,KAAK,SAAS,OAAO,KAAKA,OAAM,QAAQ,CAAC;AAAA,YAIxD;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,aAAK,OAAO,OAAO,OAAO,MAAM;AAjMpC;AAkMM,gBAAM,QAAO,UAAK,WAAL,mBAAa;AAC1B,cAAI,CAAC;AACH,kBAAM,IAAI,MAAM,iDAAiD;AACnE,gBAAM,OAAQ,KAAyB;AACvC,eAAK,QAAQ,SAAS,KAAK,iBAAiB,CAAC,KAAK,SAAS,CAAC,CAAC;AAAA,QAI/D,CAAC;AAAA,MACH;AAAA,MAEA,QAAQ;AA7MV;AA8MI,aAAK,QAAQ,KAAK,OAAO;AACzB,aAAK,QAAQ,mBAAmB;AAChC,mBAAK,WAAL,mBAAa;AACb,cAAM,OAAM,UAAK,UAAL,mBAAY;AACxB,eAAO;AAAA,MACT;AAAA,MAKA,GACE,OACA,IACM;AACN,aAAK,QAAQ,GAAG,OAAO,EAAE;AAAA,MAC3B;AAAA,IACF;AAKA,IAAO,oBAAQ,IAAI,UAAU;AAAA;AAAA;;;ACnO7B,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,YACX;AAAA;AAAA;;;ACAF,OAAOC,SAAQ;AADf;AAAA;AAAA;AAEA;AAEA,KAAC,iBAAkB;AACjB,cAAQ,IAAI,kBAAU,aAAa,CAAC;AACpC,cAAQ,IAAI,MAAM,kBAAU,SAAS,CAAC;AACtC,YAAM,SAAS,kBAAU,cAAc;AAIvC,wBAAU,eAAe,SAAS;AAClC,cAAQ,IAAI,EAAE;AACd,cAAQ,OAAO,kBAAU,oBAAoB,MAAM,SAAS;AAG5D,wBAAU,eAAe,SAAS;AAClC,cAAQ,IAAI;AACZ,cAAQ;AAAA,SACL,MAAM,kBAAU,UAAU,GAAG,SAAS,QAAQ,MAAM;AAAA,MACvD;AAEA,YAAM,kBAAU,WAAW,SAAS;AACpC,cAAQ,IAAI;AACZ,cAAQ,OAAQ,MAAM,kBAAU,gBAAgB,MAAO,SAAS;AAChE,wBAAU,GAAG,QAAQ,CAAC,SAAS;AAC7B,gBAAQ,IAAI,IAAI;AAAA,MAClB,CAAC;AACD,wBAAU,GAAG,SAAS,CAAC,SAAS;AAC9B,QAAAA,IAAG,cAAc,YAAY,IAAI;AAAA,MACnC,CAAC;AACD,wBAAU,OAAO;AACjB,iBAAW,MAAM;AACf,0BAAU,MAAM;AAAA,MAClB,GAAG,GAAK;AAAA,IACV,GAAG;AAAA;AAAA","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
|
-
|
|
83
|
-
|
|
84
|
-
"WRITE_TEXT" /* WRITE_TEXT */
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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 = "/
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
"WRITE_TEXT" /* WRITE_TEXT */
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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":";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":"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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
|
-
|
|
63
|
-
|
|
64
|
-
"WRITE_TEXT" /* WRITE_TEXT */
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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() {
|
package/dist/index.mjs.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};"]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED