erlpack.cc 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <nan.h>
  2. #include "encoder.h"
  3. #include "decoder.h"
  4. NAN_METHOD(Pack) {
  5. Encoder encoder;
  6. const int ret = encoder.pack(info[0]);
  7. if (ret == -1) {
  8. Nan::ThrowError("Out of memory");
  9. info.GetReturnValue().Set(Nan::Null());
  10. return;
  11. }
  12. else if (ret > 0) {
  13. Nan::ThrowError("Unknown error");
  14. info.GetReturnValue().Set(Nan::Null());
  15. return;
  16. }
  17. info.GetReturnValue().Set(encoder.releaseAsBuffer().ToLocalChecked());
  18. }
  19. NAN_METHOD(Unpack) {
  20. if(!info[0]->IsObject()) {
  21. Nan::ThrowError("Attempting to unpack a non-object.");
  22. info.GetReturnValue().Set(Nan::Null());
  23. return;
  24. }
  25. Nan::TypedArrayContents<uint8_t> contents(info[0]);
  26. if (contents.length() == 0) {
  27. Nan::ThrowError("Zero length buffer.");
  28. info.GetReturnValue().Set(Nan::Null());
  29. return;
  30. }
  31. Decoder decoder(contents);
  32. Nan::MaybeLocal<Value> value = decoder.unpack();
  33. info.GetReturnValue().Set(value.ToLocalChecked());
  34. }
  35. void Init(Handle<Object> exports) {
  36. exports->Set(Nan::New("pack").ToLocalChecked(), Nan::New<FunctionTemplate>(Pack)->GetFunction());
  37. exports->Set(Nan::New("unpack").ToLocalChecked(), Nan::New<FunctionTemplate>(Unpack)->GetFunction());
  38. }
  39. NODE_MODULE(erlpack, Init);