diff --git a/src/libopencor/locAPI.ts b/src/libopencor/locAPI.ts index fe2913d..8bb6c1b 100644 --- a/src/libopencor/locAPI.ts +++ b/src/libopencor/locAPI.ts @@ -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.') @@ -47,6 +52,8 @@ export class File { } contents(): Uint8Array { - return this._file.contents() + return cppVersion() + ? _locAPI.fileContents(this._path) + : this._file.contents() } } diff --git a/src/libopencor/src/file.cpp b/src/libopencor/src/file.cpp index cceb63b..8e96ddf 100644 --- a/src/libopencor/src/file.cpp +++ b/src/libopencor/src/file.cpp @@ -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 - pExports.Set("File", func); -} +static std::vector files; -File::File(const Napi::CallbackInfo &pInfo) - : Napi::ObjectWrap(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::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::Copy(pInfo.Env(), res.data(), res.size()); + // Keep track of the file so that it doesn't get garbage collected. + + files.push_back(file); } diff --git a/src/libopencor/src/file.h b/src/libopencor/src/file.h index b7efc42..3518356 100644 --- a/src/libopencor/src/file.h +++ b/src/libopencor/src/file.h @@ -2,17 +2,5 @@ #include -#include - -class File: public Napi::ObjectWrap -{ -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); diff --git a/src/libopencor/src/main.cpp b/src/libopencor/src/main.cpp index 52c98c7..6fac2d7 100644 --- a/src/libopencor/src/main.cpp +++ b/src/libopencor/src/main.cpp @@ -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; } diff --git a/src/preload/index.ts b/src/preload/index.ts index 85ef1d4..fb6bb06 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -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) })