Class: Canopus::Plugins::Host

Inherits:
Object
  • Object
show all
Defined in:
lib/canopus/plugins/host.rb,
sig/canopus.rbs

Overview

Canopus vocabulary on top of the generic out-of-process host.

Constant Summary collapse

API_VERSION =
2

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(workspace, sandbox: true, limits: {}) ⇒ Host

Returns a new instance of Host.

Parameters:

  • workspace (Workspace)
  • sandbox: (Boolean) (defaults to: true)
  • limits: (Hash[Symbol, Numeric]) (defaults to: {})


20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/canopus/plugins/host.rb', line 20

def initialize(workspace, sandbox: true, limits: {})
  require_gienah
  @workspace = workspace
  @sandbox = sandbox
  @runtime = Gienah::Host.new(api_version: API_VERSION, sandbox: sandbox, limits: limits)
  @surfaces = {}
  @subscriptions = {}
  @decorations = {}
  @completion_sources = {}
  @status_items = {}
  @storage_lock = Mutex.new
  @activation_threads = {}
  @subscribed_instances = {}
  @selection_subscriptions = {}
  @selection_threads = {}
  @event_lock = Mutex.new
  register_buffer_api
  register_workspace_api
  register_ui_api
  @runtime.on_contribution { |id, contributes| register_contributions(id, contributes) }
  @workspace_event_subscription = @workspace.on_plugin_event { |method, payload| handle_workspace_event(method, payload) }
  @runtime.on_error do |error, instance|
    cleanup_instance(instance.id) if instance&.state == :failed
    @workspace.message = error.message
  end
end

Instance Attribute Details

#runtime ⇒ Object (readonly)

Returns the value of attribute runtime.

Returns:

  • (Object)


18
19
20
# File 'lib/canopus/plugins/host.rb', line 18

def runtime
  @runtime
end

Instance Method Details

#activate(id, reason:) ⇒ Object?

Parameters:

  • id (String)
  • reason: (String)

Returns:

  • (Object, nil)

Raises:



50
51
52
53
54
# File 'lib/canopus/plugins/host.rb', line 50

def activate(id, reason:)
  raise PermissionDenied, "workspace is not trusted" unless @workspace.trust.trusted?

  @runtime.activate(id, reason: reason)
end

#add(manifest) ⇒ Object

Parameters:

  • manifest (Object)

Returns:

  • (Object)


48
# File 'lib/canopus/plugins/host.rb', line 48

def add(manifest) = @runtime.add(manifest)

#deactivate(id) ⇒ Object

Parameters:

  • id (String)

Returns:

  • (Object)


56
57
58
59
# File 'lib/canopus/plugins/host.rb', line 56

def deactivate(id)
  cleanup_instance(id)
  @runtime.deactivate(id)
end

#discover(directories) ⇒ Array[untyped]

Parameters:

  • directories (Array[String])

Returns:

  • (Array[untyped])


47
# File 'lib/canopus/plugins/host.rb', line 47

def discover(directories) = @runtime.discover(directories)

#instances ⇒ Array[untyped]

Returns:

  • (Array[untyped])


60
# File 'lib/canopus/plugins/host.rb', line 60

def instances = @runtime.instances

#shutdown ⇒ Object

Returns:

  • (Object)


61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/canopus/plugins/host.rb', line 61

def shutdown
  @activation_threads.values.each { |thread| thread.kill unless thread.equal?(Thread.current) }
  @activation_threads.clear
  @workspace_event_subscription&.detach
  @selection_threads.each_value { |thread| thread.kill unless thread.equal?(Thread.current) }
  @selection_threads.clear
  @selection_subscriptions.each_value { |_editor, subscription| subscription.detach }
  @selection_subscriptions.clear
  @subscriptions.each_value(&:detach)
  @subscriptions.clear
  @subscribed_instances.clear
  @runtime.shutdown
end

#status_items ⇒ Hash[untyped, untyped]

Returns:

  • (Hash[untyped, untyped])


75
76
77
# File 'lib/canopus/plugins/host.rb', line 75

def status_items
  @status_items.dup
end