Skip to content

Commit

Permalink
NAPI: use a C-like API for our File class.
Browse files Browse the repository at this point in the history
Not as nice as wrapping our File class, but at least it works...
  • Loading branch information
agarny committed Feb 27, 2025
1 parent dc0101f commit 5f76020
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 35 deletions.
19 changes: 13 additions & 6 deletions src/libopencor/locAPI.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,20 @@ export function version(): string {

// File API.

interface IFile {
contents(): Uint8Array
setContents(ptr: number, length: number): void
}

export class File {
private _file: {
contents(): Uint8Array
setContents(ptr: number, length: number): void
}
private _path?: string
private _file: IFile = {} as IFile

constructor(path: string, contents?: Uint8Array) {
if (cppVersion()) {
this._file = new _locAPI.File(path)
this._path = path

_locAPI.fileCreate(path)
} else {
if (contents === undefined) {
throw new Error('The contents of the file must be provided.')
Expand All @@ -47,6 +52,8 @@ export class File {
}

contents(): Uint8Array {
return this._file.contents()
return cppVersion()
? _locAPI.fileContents(this._path)
: this._file.contents()
}
}
24 changes: 13 additions & 11 deletions src/libopencor/src/file.cpp
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
#include "file.h"

void File::init(Napi::Env pEnv, Napi::Object pExports)
{
auto func = DefineClass(pEnv, "File", {InstanceMethod("contents", &File::contents)});
#include <libopencor>

pExports.Set("File", func);
}
static std::vector<libOpenCOR::FilePtr> files;

File::File(const Napi::CallbackInfo &pInfo)
: Napi::ObjectWrap<File>(pInfo)
napi_value fileContents(const Napi::CallbackInfo &pInfo)
{
mFile = libOpenCOR::File::create(pInfo[0].ToString().Utf8Value());
auto fileManager = libOpenCOR::FileManager::instance();
auto file = fileManager.file(pInfo[0].ToString().Utf8Value());
auto res = file->contents();

return Napi::Buffer<unsigned char>::Copy(pInfo.Env(), res.data(), res.size());
}

Napi::Value File::contents(const Napi::CallbackInfo &pInfo)
void fileCreate(const Napi::CallbackInfo &pInfo)
{
auto res = mFile->contents();
auto file = libOpenCOR::File::create(pInfo[0].ToString().Utf8Value());

return Napi::Buffer<unsigned char>::Copy(pInfo.Env(), res.data(), res.size());
// Keep track of the file so that it doesn't get garbage collected.

files.push_back(file);
}
16 changes: 2 additions & 14 deletions src/libopencor/src/file.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,5 @@

#include <napi.h>

#include <libopencor>

class File: public Napi::ObjectWrap<File>
{
public:
static void init(Napi::Env pEnv, Napi::Object pExports);

explicit File(const Napi::CallbackInfo &pInfo);

private:
libOpenCOR::FilePtr mFile;

Napi::Value contents(const Napi::CallbackInfo &pInfo);
};
napi_value fileContents(const Napi::CallbackInfo &pInfo);
void fileCreate(const Napi::CallbackInfo &pInfo);
5 changes: 3 additions & 2 deletions src/libopencor/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ Napi::Object init(Napi::Env pEnv, Napi::Object pExports)

pExports.Set(Napi::String::New(pEnv, "version"), Napi::Function::New(pEnv, version));

// File class.
// File API.

File::init(pEnv, pExports);
pExports.Set(Napi::String::New(pEnv, "fileContents"), Napi::Function::New(pEnv, fileContents));
pExports.Set(Napi::String::New(pEnv, "fileCreate"), Napi::Function::New(pEnv, fileCreate));

return pExports;
}
Expand Down
5 changes: 3 additions & 2 deletions src/preload/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ electron.contextBridge.exposeInMainWorld('locAPI', {

version: () => loc.version(),

// File class.
// File API.

File: loc.File
fileContents: (path: string) => loc.fileContents(path),
fileCreate: (path: string) => loc.fileCreate(path)
})

0 comments on commit 5f76020

Please sign in to comment.