@crosscopy/clipboard 0.1.10 → 0.2.5
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/.yarnrc.yml +1 -0
- package/Cargo.toml +24 -0
- package/README.md +46 -94
- package/build.rs +5 -0
- package/exp.ts +12 -0
- package/index.d.ts +23 -0
- package/index.js +317 -0
- package/package.json +44 -37
- package/src/lib.rs +192 -0
- package/dist/demo.d.ts +0 -1
- package/dist/demo.js +0 -244
- package/dist/demo.js.map +0 -1
- package/dist/demo.mjs +0 -234
- package/dist/demo.mjs.map +0 -1
- package/dist/index.d.ts +0 -34
- package/dist/index.js +0 -184
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -171
- package/dist/index.mjs.map +0 -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-arm +0 -0
- package/go-clipboard/binaries/go-clipboard-linux-x64 +0 -0
- package/go-clipboard/binaries/go-clipboard-win32-x64.exe +0 -0
- package/go-clipboard/scripts/win/read_image.ps1 +0 -23
- package/go-clipboard/scripts/win/read_text.ps1 +0 -1
- package/go-clipboard/scripts/win/write_image.ps1 +0 -15
- package/go-clipboard/scripts/win/write_text.ps1 +0 -7
package/dist/demo.mjs
DELETED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
import os from 'os';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { EventEmitter } from 'events';
|
|
5
|
-
import net from 'net';
|
|
6
|
-
import { execFile, execFileSync } from 'child_process';
|
|
7
|
-
import util from 'util';
|
|
8
|
-
|
|
9
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
10
|
-
var __esm = (fn, res) => function __init() {
|
|
11
|
-
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
12
|
-
};
|
|
13
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
14
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
// src/util.ts
|
|
18
|
-
var base64StringToUTF8, base64BufToUTF8;
|
|
19
|
-
var init_util = __esm({
|
|
20
|
-
"src/util.ts"() {
|
|
21
|
-
base64StringToUTF8 = (base64Str) => {
|
|
22
|
-
const base64buf = Buffer.from(base64Str, "base64");
|
|
23
|
-
const text = base64buf.toString("utf8");
|
|
24
|
-
return text;
|
|
25
|
-
};
|
|
26
|
-
base64BufToUTF8 = (buf) => {
|
|
27
|
-
const base64Text = buf.toString();
|
|
28
|
-
return base64StringToUTF8(base64Text);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
// src/constants.ts
|
|
34
|
-
var init_constants = __esm({
|
|
35
|
-
"src/constants.ts"() {
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
var execFileAsync, Clipboard, clipboard_default;
|
|
39
|
-
var init_clipboard = __esm({
|
|
40
|
-
"index.ts"() {
|
|
41
|
-
init_util();
|
|
42
|
-
init_constants();
|
|
43
|
-
execFileAsync = util.promisify(execFile);
|
|
44
|
-
Clipboard = class {
|
|
45
|
-
constructor() {
|
|
46
|
-
this.child = void 0;
|
|
47
|
-
this.emitter = new EventEmitter();
|
|
48
|
-
}
|
|
49
|
-
get exeFilename() {
|
|
50
|
-
const { platform, arch } = process;
|
|
51
|
-
let exeFilename = `go-clipboard-${platform}-${arch}`;
|
|
52
|
-
if (platform === "win32") {
|
|
53
|
-
exeFilename += ".exe";
|
|
54
|
-
}
|
|
55
|
-
return exeFilename;
|
|
56
|
-
}
|
|
57
|
-
get goClipboardPath() {
|
|
58
|
-
const pathArr = [__dirname];
|
|
59
|
-
if (path.basename(__dirname) === "dist") {
|
|
60
|
-
pathArr.push("..");
|
|
61
|
-
}
|
|
62
|
-
pathArr.push(...["go-clipboard", "binaries", this.exeFilename]);
|
|
63
|
-
const exePath = path.join(...pathArr);
|
|
64
|
-
return exePath;
|
|
65
|
-
}
|
|
66
|
-
readText() {
|
|
67
|
-
return execFileAsync(this.goClipboardPath, [
|
|
68
|
-
"READ_TEXT" /* READ_TEXT */
|
|
69
|
-
]).then((result) => {
|
|
70
|
-
return base64StringToUTF8(result.stdout);
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
readTextSync() {
|
|
74
|
-
const buf = execFileSync(this.goClipboardPath, [
|
|
75
|
-
"READ_TEXT" /* READ_TEXT */
|
|
76
|
-
]);
|
|
77
|
-
return base64BufToUTF8(buf);
|
|
78
|
-
}
|
|
79
|
-
writeText(content) {
|
|
80
|
-
return Promise.resolve(this.writeTextSync(content));
|
|
81
|
-
}
|
|
82
|
-
writeTextSync(content) {
|
|
83
|
-
execFileSync(
|
|
84
|
-
this.goClipboardPath,
|
|
85
|
-
["WRITE_TEXT" /* WRITE_TEXT */],
|
|
86
|
-
{
|
|
87
|
-
input: Buffer.from(content).toString("base64")
|
|
88
|
-
}
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
writeImageSync(data) {
|
|
92
|
-
if (data instanceof String || typeof data === "string") {
|
|
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
|
-
}
|
|
117
|
-
} else if (data instanceof Buffer) {
|
|
118
|
-
this.writeImageSync(data.toString("base64"));
|
|
119
|
-
} else {
|
|
120
|
-
throw new Error("Invalid Data Type. Has to be string or Buffer");
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
writeImage(data) {
|
|
124
|
-
if (data instanceof String || typeof data === "string") {
|
|
125
|
-
return Promise.resolve(this.writeImageSync(data));
|
|
126
|
-
} else if (data instanceof Buffer) {
|
|
127
|
-
return Promise.resolve(this.writeImageSync(data));
|
|
128
|
-
} else {
|
|
129
|
-
throw new Error("Invalid Data Type. Has to be string or Buffer");
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
readImage() {
|
|
133
|
-
return Promise.resolve(this.readImageSync());
|
|
134
|
-
}
|
|
135
|
-
readImageBase64() {
|
|
136
|
-
return Promise.resolve(this.readImageBase64Sync());
|
|
137
|
-
}
|
|
138
|
-
readImageSync() {
|
|
139
|
-
const buf = execFileSync(this.goClipboardPath, [
|
|
140
|
-
"READ_IMAGE" /* READ_IMAGE */
|
|
141
|
-
]);
|
|
142
|
-
const stdoutStr = buf.toString();
|
|
143
|
-
const imgBuf = Buffer.from(stdoutStr, "base64");
|
|
144
|
-
return imgBuf;
|
|
145
|
-
}
|
|
146
|
-
readImageBase64Sync() {
|
|
147
|
-
return this.readImageSync().toString("base64");
|
|
148
|
-
}
|
|
149
|
-
listen() {
|
|
150
|
-
this.server = net.createServer((con) => {
|
|
151
|
-
let data = "";
|
|
152
|
-
con.on("data", (packet) => {
|
|
153
|
-
data += packet.toString();
|
|
154
|
-
});
|
|
155
|
-
con.on("close", () => {
|
|
156
|
-
const strData = data.toString();
|
|
157
|
-
const subStr = strData.substring(0, 14);
|
|
158
|
-
if (subStr.includes(`${"TEXT_CHANGED" /* TEXT_CHANGED */}:`)) {
|
|
159
|
-
const text = Buffer.from(strData.substring(13), "base64").toString();
|
|
160
|
-
this.emitter.emit("text", text);
|
|
161
|
-
} else if (subStr.includes(`${"IMAGE_CHANGED" /* IMAGE_CHANGED */}:`)) {
|
|
162
|
-
const data2 = strData.substring(14);
|
|
163
|
-
this.emitter.emit("image", Buffer.from(data2, "base64"));
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
});
|
|
167
|
-
this.server.listen(19559, () => {
|
|
168
|
-
var _a;
|
|
169
|
-
const addr = (_a = this.server) == null ? void 0 : _a.address();
|
|
170
|
-
if (!addr)
|
|
171
|
-
throw new Error("Unexpected Error: TCP Socket Server not Started");
|
|
172
|
-
const port = addr.port;
|
|
173
|
-
this.child = execFile(this.goClipboardPath, [port.toString()]);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
close() {
|
|
177
|
-
var _a, _b;
|
|
178
|
-
this.emitter.emit("close");
|
|
179
|
-
this.emitter.removeAllListeners();
|
|
180
|
-
(_a = this.server) == null ? void 0 : _a.close();
|
|
181
|
-
const res = (_b = this.child) == null ? void 0 : _b.kill();
|
|
182
|
-
return res;
|
|
183
|
-
}
|
|
184
|
-
on(event, cb) {
|
|
185
|
-
this.emitter.on(event, cb);
|
|
186
|
-
}
|
|
187
|
-
};
|
|
188
|
-
clipboard_default = new Clipboard();
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
// __tests__/data.ts
|
|
193
|
-
var base64img;
|
|
194
|
-
var init_data = __esm({
|
|
195
|
-
"__tests__/data.ts"() {
|
|
196
|
-
base64img = "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";
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
var require_demo = __commonJS({
|
|
200
|
-
"demo.ts"() {
|
|
201
|
-
init_clipboard();
|
|
202
|
-
init_data();
|
|
203
|
-
(async function() {
|
|
204
|
-
console.log(clipboard_default.readTextSync());
|
|
205
|
-
console.log(await clipboard_default.readText());
|
|
206
|
-
clipboard_default.readImageSync();
|
|
207
|
-
clipboard_default.writeImageSync(base64img);
|
|
208
|
-
console.log("");
|
|
209
|
-
console.assert(clipboard_default.readImageBase64Sync() === base64img);
|
|
210
|
-
clipboard_default.writeImageSync(base64img);
|
|
211
|
-
console.log();
|
|
212
|
-
console.assert(
|
|
213
|
-
(await clipboard_default.readImage()).toString("base64") === base64img
|
|
214
|
-
);
|
|
215
|
-
await clipboard_default.writeImage(base64img);
|
|
216
|
-
console.log();
|
|
217
|
-
console.assert(await clipboard_default.readImageBase64() === base64img);
|
|
218
|
-
clipboard_default.on("text", (text) => {
|
|
219
|
-
console.log(text);
|
|
220
|
-
});
|
|
221
|
-
clipboard_default.on("image", (data) => {
|
|
222
|
-
fs.writeFileSync("test.png", data);
|
|
223
|
-
});
|
|
224
|
-
clipboard_default.listen();
|
|
225
|
-
setTimeout(() => {
|
|
226
|
-
clipboard_default.close();
|
|
227
|
-
}, 1e4);
|
|
228
|
-
})();
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
var demo = require_demo();
|
|
232
|
-
|
|
233
|
-
export { demo as default };
|
|
234
|
-
//# sourceMappingURL=demo.mjs.map
|
package/dist/demo.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from 'node:events';
|
|
2
|
-
import net from 'net';
|
|
3
|
-
import { ChildProcess } from 'node:child_process';
|
|
4
|
-
|
|
5
|
-
declare class Clipboard {
|
|
6
|
-
child: ChildProcess | undefined;
|
|
7
|
-
server: net.Server | undefined;
|
|
8
|
-
emitter: EventEmitter;
|
|
9
|
-
constructor();
|
|
10
|
-
get exeFilename(): string;
|
|
11
|
-
get goClipboardPath(): string;
|
|
12
|
-
readText(): Promise<string>;
|
|
13
|
-
readTextSync(): string;
|
|
14
|
-
writeText(content: string): Promise<void>;
|
|
15
|
-
writeTextSync(content: string): void;
|
|
16
|
-
writeImageSync(base64ImgStr: string): void;
|
|
17
|
-
writeImageSync(imgBuf: Buffer): void;
|
|
18
|
-
writeImage(data: string): Promise<void>;
|
|
19
|
-
writeImage(data: Buffer): Promise<void>;
|
|
20
|
-
readImage(): Promise<Buffer>;
|
|
21
|
-
readImageBase64(): Promise<string>;
|
|
22
|
-
readImageSync(): Buffer;
|
|
23
|
-
readImageBase64Sync(): string;
|
|
24
|
-
listen(): void;
|
|
25
|
-
close(): boolean | undefined;
|
|
26
|
-
on(event: "text", cb: TextCallback): void;
|
|
27
|
-
on(event: "image", cb: ImageCallback): void;
|
|
28
|
-
on(event: "close", cb: () => void): void;
|
|
29
|
-
}
|
|
30
|
-
declare type TextCallback = (data: string) => void;
|
|
31
|
-
declare type ImageCallback = (data: Buffer) => void;
|
|
32
|
-
declare const _default: Clipboard;
|
|
33
|
-
|
|
34
|
-
export { Clipboard, _default as default };
|
package/dist/index.js
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var os = require('os');
|
|
6
|
-
var fs = require('fs');
|
|
7
|
-
var path = require('path');
|
|
8
|
-
var events = require('events');
|
|
9
|
-
var net = require('net');
|
|
10
|
-
var child_process = require('child_process');
|
|
11
|
-
var util = require('util');
|
|
12
|
-
|
|
13
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
14
|
-
|
|
15
|
-
var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
|
|
16
|
-
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
17
|
-
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
18
|
-
var net__default = /*#__PURE__*/_interopDefaultLegacy(net);
|
|
19
|
-
var util__default = /*#__PURE__*/_interopDefaultLegacy(util);
|
|
20
|
-
|
|
21
|
-
// index.ts
|
|
22
|
-
|
|
23
|
-
// src/util.ts
|
|
24
|
-
var base64StringToUTF8 = (base64Str) => {
|
|
25
|
-
const base64buf = Buffer.from(base64Str, "base64");
|
|
26
|
-
const text = base64buf.toString("utf8");
|
|
27
|
-
return text;
|
|
28
|
-
};
|
|
29
|
-
var base64BufToUTF8 = (buf) => {
|
|
30
|
-
const base64Text = buf.toString();
|
|
31
|
-
return base64StringToUTF8(base64Text);
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
// index.ts
|
|
35
|
-
var execFileAsync = util__default["default"].promisify(child_process.execFile);
|
|
36
|
-
var Clipboard = class {
|
|
37
|
-
constructor() {
|
|
38
|
-
this.child = void 0;
|
|
39
|
-
this.emitter = new events.EventEmitter();
|
|
40
|
-
}
|
|
41
|
-
get exeFilename() {
|
|
42
|
-
const { platform, arch } = process;
|
|
43
|
-
let exeFilename = `go-clipboard-${platform}-${arch}`;
|
|
44
|
-
if (platform === "win32") {
|
|
45
|
-
exeFilename += ".exe";
|
|
46
|
-
}
|
|
47
|
-
return exeFilename;
|
|
48
|
-
}
|
|
49
|
-
get goClipboardPath() {
|
|
50
|
-
const pathArr = [__dirname];
|
|
51
|
-
if (path__default["default"].basename(__dirname) === "dist") {
|
|
52
|
-
pathArr.push("..");
|
|
53
|
-
}
|
|
54
|
-
pathArr.push(...["go-clipboard", "binaries", this.exeFilename]);
|
|
55
|
-
const exePath = path__default["default"].join(...pathArr);
|
|
56
|
-
return exePath;
|
|
57
|
-
}
|
|
58
|
-
readText() {
|
|
59
|
-
return execFileAsync(this.goClipboardPath, [
|
|
60
|
-
"READ_TEXT" /* READ_TEXT */
|
|
61
|
-
]).then((result) => {
|
|
62
|
-
return base64StringToUTF8(result.stdout);
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
readTextSync() {
|
|
66
|
-
const buf = child_process.execFileSync(this.goClipboardPath, [
|
|
67
|
-
"READ_TEXT" /* READ_TEXT */
|
|
68
|
-
]);
|
|
69
|
-
return base64BufToUTF8(buf);
|
|
70
|
-
}
|
|
71
|
-
writeText(content) {
|
|
72
|
-
return Promise.resolve(this.writeTextSync(content));
|
|
73
|
-
}
|
|
74
|
-
writeTextSync(content) {
|
|
75
|
-
child_process.execFileSync(
|
|
76
|
-
this.goClipboardPath,
|
|
77
|
-
["WRITE_TEXT" /* WRITE_TEXT */],
|
|
78
|
-
{
|
|
79
|
-
input: Buffer.from(content).toString("base64")
|
|
80
|
-
}
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
writeImageSync(data) {
|
|
84
|
-
if (data instanceof String || typeof data === "string") {
|
|
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
|
-
}
|
|
109
|
-
} else if (data instanceof Buffer) {
|
|
110
|
-
this.writeImageSync(data.toString("base64"));
|
|
111
|
-
} else {
|
|
112
|
-
throw new Error("Invalid Data Type. Has to be string or Buffer");
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
writeImage(data) {
|
|
116
|
-
if (data instanceof String || typeof data === "string") {
|
|
117
|
-
return Promise.resolve(this.writeImageSync(data));
|
|
118
|
-
} else if (data instanceof Buffer) {
|
|
119
|
-
return Promise.resolve(this.writeImageSync(data));
|
|
120
|
-
} else {
|
|
121
|
-
throw new Error("Invalid Data Type. Has to be string or Buffer");
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
readImage() {
|
|
125
|
-
return Promise.resolve(this.readImageSync());
|
|
126
|
-
}
|
|
127
|
-
readImageBase64() {
|
|
128
|
-
return Promise.resolve(this.readImageBase64Sync());
|
|
129
|
-
}
|
|
130
|
-
readImageSync() {
|
|
131
|
-
const buf = child_process.execFileSync(this.goClipboardPath, [
|
|
132
|
-
"READ_IMAGE" /* READ_IMAGE */
|
|
133
|
-
]);
|
|
134
|
-
const stdoutStr = buf.toString();
|
|
135
|
-
const imgBuf = Buffer.from(stdoutStr, "base64");
|
|
136
|
-
return imgBuf;
|
|
137
|
-
}
|
|
138
|
-
readImageBase64Sync() {
|
|
139
|
-
return this.readImageSync().toString("base64");
|
|
140
|
-
}
|
|
141
|
-
listen() {
|
|
142
|
-
this.server = net__default["default"].createServer((con) => {
|
|
143
|
-
let data = "";
|
|
144
|
-
con.on("data", (packet) => {
|
|
145
|
-
data += packet.toString();
|
|
146
|
-
});
|
|
147
|
-
con.on("close", () => {
|
|
148
|
-
const strData = data.toString();
|
|
149
|
-
const subStr = strData.substring(0, 14);
|
|
150
|
-
if (subStr.includes(`${"TEXT_CHANGED" /* TEXT_CHANGED */}:`)) {
|
|
151
|
-
const text = Buffer.from(strData.substring(13), "base64").toString();
|
|
152
|
-
this.emitter.emit("text", text);
|
|
153
|
-
} else if (subStr.includes(`${"IMAGE_CHANGED" /* IMAGE_CHANGED */}:`)) {
|
|
154
|
-
const data2 = strData.substring(14);
|
|
155
|
-
this.emitter.emit("image", Buffer.from(data2, "base64"));
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
});
|
|
159
|
-
this.server.listen(19559, () => {
|
|
160
|
-
var _a;
|
|
161
|
-
const addr = (_a = this.server) == null ? void 0 : _a.address();
|
|
162
|
-
if (!addr)
|
|
163
|
-
throw new Error("Unexpected Error: TCP Socket Server not Started");
|
|
164
|
-
const port = addr.port;
|
|
165
|
-
this.child = child_process.execFile(this.goClipboardPath, [port.toString()]);
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
close() {
|
|
169
|
-
var _a, _b;
|
|
170
|
-
this.emitter.emit("close");
|
|
171
|
-
this.emitter.removeAllListeners();
|
|
172
|
-
(_a = this.server) == null ? void 0 : _a.close();
|
|
173
|
-
const res = (_b = this.child) == null ? void 0 : _b.kill();
|
|
174
|
-
return res;
|
|
175
|
-
}
|
|
176
|
-
on(event, cb) {
|
|
177
|
-
this.emitter.on(event, cb);
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
var clipboard_default = new Clipboard();
|
|
181
|
-
|
|
182
|
-
exports.Clipboard = Clipboard;
|
|
183
|
-
exports["default"] = clipboard_default;
|
|
184
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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};"]}
|