event_emitter_caller.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. // Copyright (c) 2015 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
  5. #define ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_
  6. #include <vector>
  7. #include "native_mate/converter.h"
  8. namespace mate {
  9. namespace internal {
  10. using ValueVector = std::vector<v8::Local<v8::Value>>;
  11. v8::Local<v8::Value> CallMethodWithArgs(v8::Isolate* isolate,
  12. v8::Local<v8::Object> obj,
  13. const char* method,
  14. ValueVector* args);
  15. } // namespace internal
  16. // obj.emit.apply(obj, name, args...);
  17. // The caller is responsible of allocating a HandleScope.
  18. template <typename StringType>
  19. v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
  20. v8::Local<v8::Object> obj,
  21. const StringType& name,
  22. const internal::ValueVector& args) {
  23. internal::ValueVector concatenated_args = {StringToV8(isolate, name)};
  24. concatenated_args.reserve(1 + args.size());
  25. concatenated_args.insert(concatenated_args.end(), args.begin(), args.end());
  26. return internal::CallMethodWithArgs(isolate, obj, "emit", &concatenated_args);
  27. }
  28. // obj.emit(name, args...);
  29. // The caller is responsible of allocating a HandleScope.
  30. template <typename StringType, typename... Args>
  31. v8::Local<v8::Value> EmitEvent(v8::Isolate* isolate,
  32. v8::Local<v8::Object> obj,
  33. const StringType& name,
  34. const Args&... args) {
  35. internal::ValueVector converted_args = {
  36. StringToV8(isolate, name), ConvertToV8(isolate, args)...,
  37. };
  38. return internal::CallMethodWithArgs(isolate, obj, "emit", &converted_args);
  39. }
  40. // obj.custom_emit(args...)
  41. template <typename... Args>
  42. v8::Local<v8::Value> CustomEmit(v8::Isolate* isolate,
  43. v8::Local<v8::Object> object,
  44. const char* custom_emit,
  45. const Args&... args) {
  46. internal::ValueVector converted_args = {
  47. ConvertToV8(isolate, args)...,
  48. };
  49. return internal::CallMethodWithArgs(isolate, object, custom_emit,
  50. &converted_args);
  51. }
  52. } // namespace mate
  53. #endif // ATOM_COMMON_API_EVENT_EMITTER_CALLER_H_