음악, 삶, 개발

NodeJS 에서 macOS API 호출하기 (클립보드에 붙여넣기) 본문

개발 Web/NPM 라이브러리

NodeJS 에서 macOS API 호출하기 (클립보드에 붙여넣기)

Lee_____ 2021. 10. 31. 04:18

https://www.npmjs.com/package/objc

 

objc

NodeJS ↔ Objective-C bridge

www.npmjs.com

 

 

 

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`)

)