From 5a9c31f119485689fcfb80422390d5f1d8d98d0e Mon Sep 17 00:00:00 2001 From: criyle Date: Sat, 16 May 2020 00:11:18 -0400 Subject: [PATCH] Add file operations to ffi --- README.md | 44 ++++++++++++++++++- cmd/executorserver/cinterface.go | 75 ++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f07dd94..b7a7768 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,11 @@ var ffi = require('ffi-napi'); var executor_server = ffi.Library('./executor_server', { 'Init': ['int', ['string']], - 'Exec': ['string', ['string']] + 'Exec': ['string', ['string']], + 'FileList': ['string', []], + 'FileAdd': ['string', ['string']], + 'FileGet': ['string', ['string']], + 'FileDelete': ['string', ['string']] }); if (executor_server.Init(JSON.stringify({ @@ -92,7 +96,7 @@ const result = JSON.parse(executor_server.Exec(JSON.stringify({ }))); console.log(result); -// Async +// Async executor_server.Exec.async(JSON.stringify({ "cmd": [{ "args": ["/bin/cat", "test.txt"], @@ -119,6 +123,42 @@ executor_server.Exec.async(JSON.stringify({ if (err) throw err; console.log(JSON.parse(res)); }); + +const fileAdd = (param) => new Promise((resolve, reject) => { + executor_server.FileAdd.async(JSON.stringify(param), (err, res) => { + if (err != null) { reject(err); } else { resolve(res); } + }); +}); +const fileList = () => new Promise((resolve, reject) => { + executor_server.FileList.async((err, res) => { + if (err != null && res == null) { reject(err); } else { resolve(JSON.parse(res)); } + }); +}); +const fileGet = (param) => new Promise((resolve, reject) => { + executor_server.FileGet.async(JSON.stringify(param), (err, res) => { + if (err != null && res == null) { reject(err); } else { resolve(res); } + }); +}); +const fileDelete = (param) => new Promise((resolve, reject) => { + executor_server.FileDelete.async(JSON.stringify(param), (err, res) => { + if (err != null && res == null) { reject(err); } else { resolve(res); } + }); +}); + +const fileOps = async () => { + const fileId = await fileAdd({ name: 'Name', content: 'Content' }); + console.log(fileId); + const list = await fileList(); + console.log(list); + const file = await fileGet({ id: fileId }); + console.log(file); + const d = await fileDelete({ id: fileId }); + console.log(d); + const e = await fileList(); + console.log(e); +}; + +fileOps(); ``` Output: diff --git a/cmd/executorserver/cinterface.go b/cmd/executorserver/cinterface.go index 976932c..584df52 100644 --- a/cmd/executorserver/cinterface.go +++ b/cmd/executorserver/cinterface.go @@ -73,3 +73,78 @@ func Exec(e *C.char) *C.char { } return C.CString(buf.String()) } + +// FileList get the list of files in the file store +//export FileList +func FileList() *C.char { + ids := fs.List() + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(ids); err != nil { + return nil + } + return C.CString(buf.String()) +} + +// FileAdd adds file to the file store +//export FileAdd +func FileAdd(e *C.char) *C.char { + type fileAdd struct { + Name string `json:"name"` + Content string `json:"content"` + } + es := C.GoString(e) + + var f fileAdd + if err := json.NewDecoder(bytes.NewBufferString(es)).Decode(&f); err != nil { + return nil + } + + id, err := fs.Add(f.Name, []byte(f.Content)) + if err != nil { + return nil + } + return C.CString(id) +} + +// FileGet gets file from file store by id +//export FileGet +func FileGet(e *C.char) *C.char { + type fileGet struct { + ID string `json:"id"` + } + es := C.GoString(e) + + var f fileGet + if err := json.NewDecoder(bytes.NewBufferString(es)).Decode(&f); err != nil { + return nil + } + file := fs.Get(f.ID) + if file == nil { + return nil + } + c, err := file.Content() + if err != nil { + return nil + } + return C.CString(string(c)) +} + +// FileDelete deletes file from file store by id +//export FileDelete +func FileDelete(e *C.char) *C.char { + type fileDelete struct { + ID string `json:"id"` + } + es := C.GoString(e) + + var f fileDelete + if err := json.NewDecoder(bytes.NewBufferString(es)).Decode(&f); err != nil { + return nil + } + ok := fs.Remove(f.ID) + if !ok { + return nil + } + return C.CString("") +}