@crosscopy/clipboard 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/demo.js CHANGED
@@ -154,7 +154,7 @@ var init_clipboard = __esm({
154
154
  }
155
155
  });
156
156
  });
157
- this.server.listen(8090, () => {
157
+ this.server.listen(19559, () => {
158
158
  var _a;
159
159
  const addr = (_a = this.server) == null ? void 0 : _a.address();
160
160
  if (!addr)
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(8090, () => {\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: (text: string) => void): void;\n on(event: \"image\", cb: (text: string) => void): void;\n on(event: \"close\", cb: (text: string) => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: (text: string) => void): void {\n this.emitter.on(event, cb);\n }\n}\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 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"]}
package/dist/demo.mjs CHANGED
@@ -145,7 +145,7 @@ var init_clipboard = __esm({
145
145
  }
146
146
  });
147
147
  });
148
- this.server.listen(8090, () => {
148
+ this.server.listen(19559, () => {
149
149
  var _a;
150
150
  const addr = (_a = this.server) == null ? void 0 : _a.address();
151
151
  if (!addr)
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(8090, () => {\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: (text: string) => void): void;\n on(event: \"image\", cb: (text: string) => void): void;\n on(event: \"close\", cb: (text: string) => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: (text: string) => void): void {\n this.emitter.on(event, cb);\n }\n}\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 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"]}
package/dist/index.d.ts CHANGED
@@ -23,10 +23,12 @@ declare class Clipboard {
23
23
  readImageBase64Sync(): string;
24
24
  listen(): void;
25
25
  close(): boolean | undefined;
26
- on(event: "text", cb: (text: string) => void): void;
27
- on(event: "image", cb: (text: string) => void): void;
28
- on(event: "close", cb: (text: string) => void): void;
26
+ on(event: "text", cb: TextCallback): void;
27
+ on(event: "image", cb: ImageCallback): void;
28
+ on(event: "close", cb: () => void): void;
29
29
  }
30
+ declare type TextCallback = (data: string) => void;
31
+ declare type ImageCallback = (data: Buffer) => void;
30
32
  declare const _default: Clipboard;
31
33
 
32
34
  export { Clipboard, _default as default };
package/dist/index.js CHANGED
@@ -136,7 +136,7 @@ var Clipboard = class {
136
136
  }
137
137
  });
138
138
  });
139
- this.server.listen(8090, () => {
139
+ this.server.listen(19559, () => {
140
140
  var _a;
141
141
  const addr = (_a = this.server) == null ? void 0 : _a.address();
142
142
  if (!addr)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../src/util.ts"],"names":["data"],"mappings":"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","sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { EventEmitter } from \"node:events\";\nimport net from \"net\";\nimport { execFile, ChildProcess, execFileSync } from \"node:child_process\";\nimport util from \"util\";\nimport { base64BufToUTF8, base64StringToUTF8 } from \"./src/util\";\nimport { ClipboardOperation, WatchEvent } from \"./src/constants\";\n\nconst execFileAsync = util.promisify(execFile);\n\nexport class Clipboard {\n child: ChildProcess | undefined;\n server: net.Server | undefined;\n emitter: EventEmitter;\n\n constructor() {\n this.child = undefined;\n this.emitter = new EventEmitter();\n }\n\n get exeFilename(): string {\n const { platform, arch } = process;\n let exeFilename = `go-clipboard-${platform}-${arch}`;\n if (platform === \"win32\") {\n exeFilename += \".exe\";\n }\n return exeFilename;\n }\n\n get goClipboardPath(): string {\n const pathArr = [__dirname];\n\n if (path.basename(__dirname) === \"dist\") {\n pathArr.push(\"..\");\n }\n\n pathArr.push(...[\"go-clipboard\", \"binaries\", this.exeFilename]);\n const exePath = path.join(...pathArr);\n return exePath;\n }\n\n readText(): Promise<string> {\n return execFileAsync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]).then((result) => {\n return base64StringToUTF8(result.stdout);\n });\n }\n\n readTextSync(): string {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_TEXT,\n ]);\n return base64BufToUTF8(buf);\n }\n\n writeText(content: string): Promise<void> {\n return Promise.resolve(this.writeTextSync(content));\n }\n\n writeTextSync(content: string): void {\n const writeTextProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_TEXT,\n ]);\n writeTextProcess.stdin?.write(content);\n writeTextProcess.stdin?.end();\n }\n\n writeImageSync(base64ImgStr: string): void;\n writeImageSync(imgBuf: Buffer): void;\n writeImageSync(data: string | Buffer): void {\n if (data instanceof String || typeof data === \"string\") {\n const writeImageProcess = execFile(this.goClipboardPath, [\n ClipboardOperation.WRITE_IMAGE,\n ]);\n writeImageProcess.stdin?.write(data);\n writeImageProcess.stdin?.end();\n } else if (data instanceof Buffer) {\n this.writeImageSync(data.toString(\"base64\"));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n writeImage(data: string): Promise<void>;\n writeImage(data: Buffer): Promise<void>;\n writeImage(data: string | Buffer): Promise<void> {\n if (data instanceof String || typeof data === \"string\") {\n return Promise.resolve(this.writeImageSync(data as string));\n } else if (data instanceof Buffer) {\n return Promise.resolve(this.writeImageSync(data as Buffer));\n } else {\n throw new Error(\"Invalid Data Type. Has to be string or Buffer\");\n }\n }\n\n readImage(): Promise<Buffer> {\n return Promise.resolve(this.readImageSync());\n }\n\n readImageBase64(): Promise<string> {\n return Promise.resolve(this.readImageBase64Sync());\n }\n\n readImageSync(): Buffer {\n const buf = execFileSync(this.goClipboardPath, [\n ClipboardOperation.READ_IMAGE,\n ]);\n const stdoutStr = buf.toString();\n const imgBuf = Buffer.from(stdoutStr, \"base64\");\n fs.writeFileSync(\"test.png\", imgBuf);\n return imgBuf;\n }\n\n readImageBase64Sync(): string {\n return this.readImageSync().toString(\"base64\");\n }\n\n listen() {\n this.server = net.createServer((con) => {\n // client connected\n let data = \"\";\n\n // * demo of sending message to client,\n // con.write(\"close\");\n\n /**\n * Accumulate data by concatenating chunks of received data\n */\n con.on(\"data\", (packet) => {\n data += packet.toString();\n });\n\n /**\n * When socket connection closes, wrap up received data\n */\n con.on(\"close\", () => {\n const strData = data.toString();\n const subStr = strData.substring(0, 14);\n if (subStr.includes(`${WatchEvent.TEXT_CHANGED}:`)) {\n const text = Buffer.from(strData.substring(13), \"base64\").toString();\n this.emitter.emit(\"text\", text);\n } else if (subStr.includes(`${WatchEvent.IMAGE_CHANGED}:`)) {\n const data = strData.substring(14) as string;\n this.emitter.emit(\"image\", Buffer.from(data, \"base64\"));\n // const imageBase64 = data.toString(\"base64\");\n // console.log(`Image Changed`);\n // fs.writeFileSync(\"test.png\", Buffer.from(data, \"base64\"));\n }\n });\n });\n\n this.server.listen(8090, () => {\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: (text: string) => void): void;\n on(event: \"image\", cb: (text: string) => void): void;\n on(event: \"close\", cb: (text: string) => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: (text: string) => void): void {\n this.emitter.on(event, cb);\n }\n}\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 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};"]}
package/dist/index.mjs CHANGED
@@ -125,7 +125,7 @@ var Clipboard = class {
125
125
  }
126
126
  });
127
127
  });
128
- this.server.listen(8090, () => {
128
+ this.server.listen(19559, () => {
129
129
  var _a;
130
130
  const addr = (_a = this.server) == null ? void 0 : _a.address();
131
131
  if (!addr)
@@ -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(8090, () => {\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: (text: string) => void): void;\n on(event: \"image\", cb: (text: string) => void): void;\n on(event: \"close\", cb: (text: string) => void): void;\n on(event: \"text\" | \"image\" | \"close\", cb: (text: string) => void): void {\n this.emitter.on(event, cb);\n }\n}\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 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};"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crosscopy/clipboard",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Cross Platform Clipboard listener that detects both text and image update in clipboard",
5
5
  "source": "index.ts",
6
6
  "types": "./dist/index.d.ts",