Class: Bluenode::NativeModule

Inherits:
Object
  • Object
show all
Defined in:
lib/bluenode/native_module.rb

Constant Summary collapse

FILES =
Dir[File.expand_path(File.join('..', 'shims', '*.js'), __FILE__)].freeze
SOURCES =
FILES.inject({}) do |memo, filename|
  id = File.basename(filename, '.js')
  fn = lambda { File.read(filename )}

  memo.merge! id => fn
end.freeze
NAMES =
SOURCES.keys.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(context, id) ⇒ NativeModule

Returns a new instance of NativeModule.



49
50
51
52
53
54
55
# File 'lib/bluenode/native_module.rb', line 49

def initialize(context, id)
  @context  = context
  @filename = id + '.js'
  @id       = id
  @exports  = context.new_object
  @loaded   = false
end

Instance Attribute Details

#exportsObject

Returns the value of attribute exports.



47
48
49
# File 'lib/bluenode/native_module.rb', line 47

def exports
  @exports
end

#filenameObject

Returns the value of attribute filename.



47
48
49
# File 'lib/bluenode/native_module.rb', line 47

def filename
  @filename
end

#idObject

Returns the value of attribute id.



47
48
49
# File 'lib/bluenode/native_module.rb', line 47

def id
  @id
end

#loadedObject

Returns the value of attribute loaded.



47
48
49
# File 'lib/bluenode/native_module.rb', line 47

def loaded
  @loaded
end

Class Method Details

.cacheObject



36
37
38
# File 'lib/bluenode/native_module.rb', line 36

def cache
  @cache ||= {}
end

.exist?(id) ⇒ Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/bluenode/native_module.rb', line 32

def exist?(id)
  SOURCES.key?(id)
end

.require(context, id) ⇒ Object

Raises:

  • (LoadError)


15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/bluenode/native_module.rb', line 15

def require(context, id)
  return self if id == 'native_module'

  cached = cache[id]

  return cached.exports if cached

  raise LoadError, "no such native module #{id}" unless exist?(id)

  # process.moduleLoadList.push('NativeModule ' + id)

  native_module = new(context, id)
  native_module.compile
  native_module.cache
  native_module.exports
end

.sourcesObject



40
41
42
43
44
# File 'lib/bluenode/native_module.rb', line 40

def sources
  @sources ||= Hash.new do |hash, id|
    hash[id] = SOURCES[id].call
  end
end

Instance Method Details

#cacheObject



66
67
68
# File 'lib/bluenode/native_module.rb', line 66

def cache
  self.class.cache[id] = self
end

#compileObject



57
58
59
60
61
62
63
64
# File 'lib/bluenode/native_module.rb', line 57

def compile
  wrapped   = Module.wrap(self.class.sources[id])
  function  = @context.runtime.eval(wrapped, filename)

  function.call exports, @context.new_function(require_proc), self, filename

  @loaded = true
end