음악, 삶, 개발
NodeJS 에서 macOS API 호출하기 (클립보드에 붙여넣기) 본문
https://www.npmjs.com/package/objc
OS 의 clipboard 에 텍스트 복사는 라이브러리도 있고 Node.js 에도 가능하지만, 파일 복사는 불가능하다.
이를 구현하기위해서 하루종일 구글링을하다가 결국 JUCE 의 가장 밑단 코드들까지 뒤져보게되었고,
결국 macOS 의 native api 를 node.js 에서 호출할수없을까라는 고민까지 하게되었다.
JUCE 의 DragAndDropContainer 에서 결국 object-c 로 작성된 코드가 가장 밑바닥에 자리하고있었기때문이다.
지금 나는 JUCE 로 개발하고있지않기때문에 Node.js 에서 os 의 native 함수를 호출할수없나 찾아보게되었다.
다행히 objc 라는 18명밖에 다운 안받은 npm 라이브러리를 통해 꽤나 큰일을 해낼수있다.
이 라이브러리 또한 결국 다른 이가 만든 3개의 c++ addon 모듈에 의존하고있다.
어쨋든 Node.js 를 통해 native 함수들을 호출할수있는데, 직접 구현하는것은 굉장히 거대한 작업일듯하여
일단 objc 를 사용하여, macOS 의 클립보드 (실제로는 NSPasteboard 라고 부르더라) 에
프로그래밍적으로 "클립보드에 복사하기" 를 구현해보았다.
최종 목표는 Drag And Drop 를 하는것있는데, 잘 되지가않아, 그나마 쉬운 클립보드에 복사하기를 했다.
// #1 import npm library 'objc' - https://www.npmjs.com/package/objc
const objc = require('objc')
// #2 import Appkit
objc.import('AppKit')
// #3 destruct NSURL, NSArray, NSPasteboard from objc
const {
NSURL,
NSArray,
NSPasteboard,
} = objc
// #4 - create function to implement it.
const copyFilesToMacOSClipBoard = (filePaths) => {
// #5 - get global NSPasteboard.
const nsPasteBoard = NSPasteboard.generalPasteboard()
// #6 - clear global NSPasteboard.
nsPasteBoard.clearContents()
// #7 - create JS array to store NSURL objects.
const jsArray = []
for (let i = filePaths.length; i--;) {
// #8 - create NSURL object by filePath string.
const nsURL = NSURL.fileURLWithPath(filePaths[i])
// #9 - store NSURL to JS array.
jsArray.push(nsURL)
}
// #10 - convert JS array to NSArray (vanilla JS array will not work...)
const nsArray = NSArray.arrayWithArray(jsArray)
// #11 - pass NSArray to NSPasteboard.
nsPasteBoard.writeObjects (nsArray)
// #12 - wait NSPasteBoard complete to load nsArray (if 128, it can take 5~6 sec...)
console.log(nsArray)
}
// #12 - use finally...
copyFilesToMacOSClipBoard (
Array.from ({length : 20}, (_, i) => `/Users/leestrument/Desktop/paste/drum1.mid`)
)