lively-electron 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/bin/lively-electron +12 -0
- data/bin/lively-electron-server +17 -0
- data/context/getting-started.md +222 -0
- data/context/index.yaml +13 -0
- data/lib/lively/electron/environment.rb +43 -0
- data/lib/lively/electron/version.rb +13 -0
- data/lib/lively/electron.rb +8 -0
- data/license.md +21 -0
- data/readme.md +37 -0
- data/releases.md +5 -0
- data/src/main.js +155 -0
- data.tar.gz.sig +2 -0
- metadata +138 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bffd92014d38c79bc289629c4dfe8df220c0c3b6ded3686c9f866dac7e4f8693
|
4
|
+
data.tar.gz: c1e426dc11315953d167497056c40a95c553212c526866db81c2a9cacfa76d5e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ce6a4525127b609bc2b7e00b971ad2e321b0f739ef115453dfae0ad8347f52ae3e50692be948b933067bb981a10b0c8d8212d3d66fd1358dd35923c15f4aa70c
|
7
|
+
data.tar.gz: a416d1d5636928c0817b6b9211b357a81501c664378aa5c795bcb4405ae9ece0a6ba7d91ab08a808c01824ae548581b64ac6935cd2a07b717672607442aa0d5c
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data/bin/lively-electron
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
development_mode = ARGV.delete("--development")
|
5
|
+
|
6
|
+
if development_mode
|
7
|
+
ENV["LIVELY_VARIANT"] = "development"
|
8
|
+
ENV["CONSOLE_LEVEL"] = "debug"
|
9
|
+
end
|
10
|
+
|
11
|
+
main_js = File.join(__dir__, "..", "src", "main.js")
|
12
|
+
Process.exec("npx", "electron", main_js, *ARGV)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "async/service"
|
5
|
+
require_relative "../lib/lively/electron"
|
6
|
+
|
7
|
+
ARGV.each do |path|
|
8
|
+
require(path)
|
9
|
+
end
|
10
|
+
|
11
|
+
configuration = Async::Service::Configuration.build do
|
12
|
+
service "lively-electron" do
|
13
|
+
include Lively::Electron::Environment::Application
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
Async::Service::Controller.run(configuration)
|
@@ -0,0 +1,222 @@
|
|
1
|
+
# Getting Started
|
2
|
+
|
3
|
+
This guide explains how to get started with `lively-electron` to create desktop applications from Lively Ruby applications.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add the gem to your project:
|
8
|
+
|
9
|
+
~~~ bash
|
10
|
+
$ bundle add lively-electron
|
11
|
+
~~~
|
12
|
+
|
13
|
+
Also install the npm package for the Electron wrapper:
|
14
|
+
|
15
|
+
~~~ bash
|
16
|
+
$ npm install lively-electron
|
17
|
+
~~~
|
18
|
+
|
19
|
+
## Core Concepts
|
20
|
+
|
21
|
+
`lively-electron` has several core components:
|
22
|
+
|
23
|
+
- A {ruby Lively::Electron::Environment::Application} which provides the server configuration for Electron apps using file descriptor inheritance.
|
24
|
+
- Standard {ruby Lively::Application} classes work without modification in desktop applications.
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
Create a new directory for your desktop app:
|
29
|
+
|
30
|
+
~~~ bash
|
31
|
+
$ mkdir my_desktop_app
|
32
|
+
$ cd my_desktop_app
|
33
|
+
~~~
|
34
|
+
|
35
|
+
Create a `gems.rb` file:
|
36
|
+
|
37
|
+
~~~ ruby
|
38
|
+
source "https://rubygems.org"
|
39
|
+
|
40
|
+
gem "lively-electron"
|
41
|
+
~~~
|
42
|
+
|
43
|
+
Install the dependencies:
|
44
|
+
|
45
|
+
~~~ bash
|
46
|
+
$ bundle install
|
47
|
+
~~~
|
48
|
+
|
49
|
+
### Creating Your Application
|
50
|
+
|
51
|
+
Create an `application.rb` file:
|
52
|
+
|
53
|
+
~~~ ruby
|
54
|
+
#!/usr/bin/env ruby
|
55
|
+
# frozen_string_literal: true
|
56
|
+
|
57
|
+
require "lively"
|
58
|
+
|
59
|
+
class HelloWorldView < Live::View
|
60
|
+
def initialize(...)
|
61
|
+
super
|
62
|
+
|
63
|
+
@data[:message] ||= "Hello from Lively Electron!"
|
64
|
+
end
|
65
|
+
|
66
|
+
def count
|
67
|
+
@data[:count].to_i
|
68
|
+
end
|
69
|
+
|
70
|
+
def count=(value)
|
71
|
+
@data[:count] = value.to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def handle(event)
|
75
|
+
action = event[:detail][:action]
|
76
|
+
case action
|
77
|
+
when "click"
|
78
|
+
self.count += 1
|
79
|
+
@data[:message] = "Clicked #{@data[:count]} times!"
|
80
|
+
update!
|
81
|
+
when "reset"
|
82
|
+
self.count = 0
|
83
|
+
@data[:message] = "Click the button below."
|
84
|
+
update!
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def render(builder)
|
89
|
+
builder.tag(:div, class: "hello-app") do
|
90
|
+
builder.tag(:h1) { builder.text(@data[:message]) }
|
91
|
+
|
92
|
+
builder.tag(:div, class: "buttons") do
|
93
|
+
builder.tag(:button, onClick: forward_event(action: "click")) do
|
94
|
+
builder.text("Click me!")
|
95
|
+
end
|
96
|
+
|
97
|
+
if self.count > 0
|
98
|
+
builder.tag(:button, onClick: forward_event(action: "reset"), class: "reset") do
|
99
|
+
builder.text("Reset")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
builder.tag(:p, class: "info") do
|
105
|
+
builder.text("This Lively app is running in Electron via file descriptor inheritance")
|
106
|
+
end
|
107
|
+
|
108
|
+
builder.tag(:p, class: "tech") do
|
109
|
+
builder.text("Node.js (bind port) → FD inheritance → Ruby (Lively) ↔ HTTP ↔ Electron (Chromium)")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
Application = Lively::Application[HelloWorldView]
|
116
|
+
~~~
|
117
|
+
|
118
|
+
### Styling Your Application
|
119
|
+
|
120
|
+
Create a `public/_static/index.css` file:
|
121
|
+
|
122
|
+
~~~ css
|
123
|
+
body {
|
124
|
+
margin: 0;
|
125
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
126
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
127
|
+
min-height: 100vh;
|
128
|
+
display: flex;
|
129
|
+
align-items: center;
|
130
|
+
justify-content: center;
|
131
|
+
}
|
132
|
+
|
133
|
+
.hello-app {
|
134
|
+
background: white;
|
135
|
+
border-radius: 12px;
|
136
|
+
padding: 40px;
|
137
|
+
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
|
138
|
+
text-align: center;
|
139
|
+
max-width: 500px;
|
140
|
+
margin: 20px;
|
141
|
+
}
|
142
|
+
|
143
|
+
.hello-app h1 {
|
144
|
+
color: #333;
|
145
|
+
margin-bottom: 30px;
|
146
|
+
font-size: 2.2em;
|
147
|
+
font-weight: 300;
|
148
|
+
}
|
149
|
+
|
150
|
+
.buttons {
|
151
|
+
margin: 30px 0;
|
152
|
+
}
|
153
|
+
|
154
|
+
.buttons button {
|
155
|
+
background: #007acc;
|
156
|
+
color: white;
|
157
|
+
border: none;
|
158
|
+
padding: 14px 28px;
|
159
|
+
border-radius: 8px;
|
160
|
+
font-size: 16px;
|
161
|
+
cursor: pointer;
|
162
|
+
margin: 0 10px;
|
163
|
+
transition: all 0.2s ease;
|
164
|
+
}
|
165
|
+
|
166
|
+
.buttons button:hover {
|
167
|
+
background: #005a9e;
|
168
|
+
transform: translateY(-1px);
|
169
|
+
}
|
170
|
+
|
171
|
+
.buttons button.reset {
|
172
|
+
background: #dc3545;
|
173
|
+
}
|
174
|
+
|
175
|
+
.buttons button.reset:hover {
|
176
|
+
background: #c82333;
|
177
|
+
}
|
178
|
+
|
179
|
+
.info {
|
180
|
+
color: #666;
|
181
|
+
margin: 30px 0 10px;
|
182
|
+
font-size: 1.1em;
|
183
|
+
}
|
184
|
+
|
185
|
+
.tech {
|
186
|
+
color: #999;
|
187
|
+
font-size: 0.9em;
|
188
|
+
font-family: Monaco, 'Courier New', monospace;
|
189
|
+
background: #f8f9fa;
|
190
|
+
padding: 10px;
|
191
|
+
border-radius: 4px;
|
192
|
+
margin-top: 20px;
|
193
|
+
}
|
194
|
+
~~~
|
195
|
+
|
196
|
+
### Running Your Desktop App
|
197
|
+
|
198
|
+
Launch your Lively application in Electron:
|
199
|
+
|
200
|
+
~~~ bash
|
201
|
+
$ lively-electron application.rb
|
202
|
+
~~~
|
203
|
+
|
204
|
+
You should see a desktop window with your interactive Lively application running natively.
|
205
|
+
|
206
|
+
### Development Mode
|
207
|
+
|
208
|
+
For development with DevTools enabled:
|
209
|
+
|
210
|
+
~~~ bash
|
211
|
+
$ lively-electron --development application.rb
|
212
|
+
~~~
|
213
|
+
|
214
|
+
### Testing Server Only
|
215
|
+
|
216
|
+
You can test just the Ruby server component:
|
217
|
+
|
218
|
+
~~~ bash
|
219
|
+
$ lively-electron-server application.rb
|
220
|
+
~~~
|
221
|
+
|
222
|
+
This starts the server without opening the Electron window, useful for debugging the Ruby application logic.
|
data/context/index.yaml
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Automatically generated context index for Utopia::Project guides.
|
2
|
+
# Do not edit then files in this directory directly, instead edit the guides and then run `bake utopia:project:agent:context:update`.
|
3
|
+
---
|
4
|
+
description: Electron wrapper for Lively Ruby applications
|
5
|
+
metadata:
|
6
|
+
documentation_uri: https://github.com/socketry/lively-electron/
|
7
|
+
funding_uri: https://github.com/sponsors/ioquatix
|
8
|
+
source_code_uri: https://github.com/socketry/lively-electron.git
|
9
|
+
files:
|
10
|
+
- path: getting-started.md
|
11
|
+
title: Getting Started
|
12
|
+
description: This guide explains how to get started with `lively-electron` to create
|
13
|
+
desktop applications from Lively Ruby applications.
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Released under the MIT License.
|
4
|
+
# Copyright, 2025, by Samuel Williams.
|
5
|
+
|
6
|
+
require "lively/environment/application"
|
7
|
+
require "io/endpoint/bound_endpoint"
|
8
|
+
require "console"
|
9
|
+
|
10
|
+
# @namespace
|
11
|
+
module Lively
|
12
|
+
# @namespace
|
13
|
+
module Electron
|
14
|
+
# @namespace
|
15
|
+
module Environment
|
16
|
+
# Represents the environment configuration for a Lively Electron application server.
|
17
|
+
#
|
18
|
+
# This module provides server configuration for Electron apps, using TCP
|
19
|
+
# localhost binding for direct connection from Electron/Chromium.
|
20
|
+
module Application
|
21
|
+
include Lively::Environment::Application
|
22
|
+
|
23
|
+
def url
|
24
|
+
"http://localhost:0/"
|
25
|
+
end
|
26
|
+
|
27
|
+
def endpoint
|
28
|
+
if descriptor = ENV["LIVELY_SERVER_DESCRIPTOR"]
|
29
|
+
Console.info(self, "Using inherited file descriptor.", descriptor: descriptor)
|
30
|
+
bound_socket = Socket.for_fd(descriptor.to_i)
|
31
|
+
|
32
|
+
# Ensure that the socket is non-blocking:
|
33
|
+
bound_socket.nonblock = true
|
34
|
+
|
35
|
+
endpoint = IO::Endpoint::BoundEndpoint.new(nil, [bound_socket])
|
36
|
+
end
|
37
|
+
|
38
|
+
Async::HTTP::Endpoint.parse(self.url, endpoint)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/license.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# MIT License
|
2
|
+
|
3
|
+
Copyright, 2025, by Samuel Williams.
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/readme.md
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# Lively Electron
|
2
|
+
|
3
|
+
Electron wrapper for running [Lively](https://github.com/socketry/lively) Ruby applications as desktop apps.
|
4
|
+
|
5
|
+
[](https://github.com/socketry/lively-electron/actions?workflow=Test)
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
Please see the [project documentation](https://github.com/socketry/lively-electron/) for more details.
|
10
|
+
|
11
|
+
- [Getting Started](https://github.com/socketry/lively-electron/guides/getting-started/index) - This guide explains how to get started with `lively-electron` to create desktop applications from Lively Ruby applications.
|
12
|
+
|
13
|
+
## Releases
|
14
|
+
|
15
|
+
Please see the [project releases](https://github.com/socketry/lively-electron/releases/index) for all releases.
|
16
|
+
|
17
|
+
### v0.1.0
|
18
|
+
|
19
|
+
- Initial implementation.
|
20
|
+
|
21
|
+
## Contributing
|
22
|
+
|
23
|
+
We welcome contributions to this project.
|
24
|
+
|
25
|
+
1. Fork it.
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`).
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`).
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`).
|
29
|
+
5. Create new Pull Request.
|
30
|
+
|
31
|
+
### Developer Certificate of Origin
|
32
|
+
|
33
|
+
In order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.
|
34
|
+
|
35
|
+
### Community Guidelines
|
36
|
+
|
37
|
+
This project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.
|
data/releases.md
ADDED
data/src/main.js
ADDED
@@ -0,0 +1,155 @@
|
|
1
|
+
const {app, BrowserWindow, ipcMain} = require('electron');
|
2
|
+
const {spawn} = require('child_process');
|
3
|
+
const http = require('http');
|
4
|
+
const net = require('net');
|
5
|
+
const path = require('path');
|
6
|
+
const fs = require('fs');
|
7
|
+
|
8
|
+
class LivelyElectronApp {
|
9
|
+
constructor() {
|
10
|
+
this.rubyProcess = null;
|
11
|
+
this.mainWindow = null;
|
12
|
+
this.serverUrl = null;
|
13
|
+
|
14
|
+
// Store the working directory (should be preserved by direct CLI)
|
15
|
+
this.originalCwd = process.cwd();
|
16
|
+
console.log('💾 Working directory:', this.originalCwd);
|
17
|
+
}
|
18
|
+
|
19
|
+
isDevelopment() {
|
20
|
+
const variant = process.env.LIVELY_VARIANT || process.env.VARIANT;
|
21
|
+
return variant === "development";
|
22
|
+
}
|
23
|
+
|
24
|
+
async start() {
|
25
|
+
try {
|
26
|
+
// 1. Start Ruby Lively server on TCP localhost
|
27
|
+
await this.startLivelyServer();
|
28
|
+
|
29
|
+
// 2. Create Electron window (connects directly to Ruby server)
|
30
|
+
await this.createWindow();
|
31
|
+
|
32
|
+
console.log(`Lively Electron started - Ruby server: ${this.serverUrl}`);
|
33
|
+
} catch (error) {
|
34
|
+
console.error('Failed to start Lively Electron:', error);
|
35
|
+
app.quit();
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
async startLivelyServer() {
|
40
|
+
return new Promise((resolve, reject) => {
|
41
|
+
// Forward all CLI args to the Ruby server; let the Ruby script decide the application file
|
42
|
+
const args = process.argv.slice(2);
|
43
|
+
|
44
|
+
// Create server and let it bind+listen, then pass handle to child
|
45
|
+
const server = net.createServer();
|
46
|
+
server.listen(0, '127.0.0.1', () => {
|
47
|
+
const port = server.address().port;
|
48
|
+
this.serverUrl = `http://localhost:${port}`;
|
49
|
+
|
50
|
+
const fd = server._handle.fd;
|
51
|
+
|
52
|
+
// Start Ruby process with FD passed via stdio and forward all CLI args
|
53
|
+
const livelyElectronScript = path.join(__dirname, '..', 'bin', 'lively-electron-server');
|
54
|
+
const childArgs = args.slice();
|
55
|
+
|
56
|
+
const child = spawn('bundle', ['exec', livelyElectronScript, ...childArgs], {
|
57
|
+
stdio: [
|
58
|
+
'inherit', // stdin
|
59
|
+
'inherit', // stdout
|
60
|
+
'inherit', // stderr
|
61
|
+
fd // Pass socket FD as stdio[3]
|
62
|
+
],
|
63
|
+
env: {
|
64
|
+
...process.env,
|
65
|
+
LIVELY_SERVER_DESCRIPTOR: '3' // Tell child it's on FD 3
|
66
|
+
}
|
67
|
+
});
|
68
|
+
|
69
|
+
child.on('spawn', () => {
|
70
|
+
this.rubyProcess = child;
|
71
|
+
server.close((error) => {
|
72
|
+
if (error) {
|
73
|
+
reject(error);
|
74
|
+
} else {
|
75
|
+
console.log(`✅ Ruby server should be ready: ${this.serverUrl}`);
|
76
|
+
resolve();
|
77
|
+
}
|
78
|
+
});
|
79
|
+
});
|
80
|
+
|
81
|
+
child.on('error', (error) => {
|
82
|
+
server.close();
|
83
|
+
console.error('Failed to spawn Ruby process:', error);
|
84
|
+
reject(error);
|
85
|
+
});
|
86
|
+
|
87
|
+
child.on('close', (code) => {
|
88
|
+
this.rubyProcess = null;
|
89
|
+
console.log(`Ruby process exited with code ${code}`);
|
90
|
+
if (code !== 0) {
|
91
|
+
reject(new Error(`Ruby process failed with code ${code}`));
|
92
|
+
}
|
93
|
+
});
|
94
|
+
});
|
95
|
+
});
|
96
|
+
}
|
97
|
+
|
98
|
+
async createWindow() {
|
99
|
+
this.mainWindow = new BrowserWindow({
|
100
|
+
width: 1200,
|
101
|
+
height: 800,
|
102
|
+
webPreferences: {
|
103
|
+
nodeIntegration: false,
|
104
|
+
contextIsolation: true,
|
105
|
+
enableRemoteModule: false
|
106
|
+
},
|
107
|
+
titleBarStyle: 'hiddenInset'
|
108
|
+
});
|
109
|
+
|
110
|
+
// Load the Lively app directly
|
111
|
+
await this.mainWindow.loadURL(this.serverUrl);
|
112
|
+
|
113
|
+
// Open DevTools in development mode
|
114
|
+
if (this.isDevelopment()) {
|
115
|
+
this.mainWindow.webContents.openDevTools();
|
116
|
+
}
|
117
|
+
|
118
|
+
this.mainWindow.on('closed', () => {
|
119
|
+
this.cleanup();
|
120
|
+
});
|
121
|
+
}
|
122
|
+
|
123
|
+
cleanup() {
|
124
|
+
if (this.rubyProcess) {
|
125
|
+
this.rubyProcess.kill();
|
126
|
+
}
|
127
|
+
}
|
128
|
+
}
|
129
|
+
|
130
|
+
// Electron app lifecycle
|
131
|
+
app.whenReady().then(() => {
|
132
|
+
console.log('Electron ready, starting Lively app...');
|
133
|
+
const livelyApp = new LivelyElectronApp();
|
134
|
+
livelyApp.start().catch(error => {
|
135
|
+
console.error('Failed to start Lively app:', error);
|
136
|
+
app.quit();
|
137
|
+
});
|
138
|
+
});
|
139
|
+
|
140
|
+
app.on('window-all-closed', () => {
|
141
|
+
if (process.platform !== 'darwin') {
|
142
|
+
app.quit();
|
143
|
+
}
|
144
|
+
});
|
145
|
+
|
146
|
+
app.on('activate', () => {
|
147
|
+
if (BrowserWindow.getAllWindows().length === 0) {
|
148
|
+
const livelyApp = new LivelyElectronApp();
|
149
|
+
livelyApp.start();
|
150
|
+
}
|
151
|
+
});
|
152
|
+
|
153
|
+
app.on('before-quit', () => {
|
154
|
+
// Cleanup will be handled by window close event
|
155
|
+
});
|
data.tar.gz.sig
ADDED
@@ -0,0 +1,2 @@
|
|
1
|
+
c�T��F����;�l�%A&��F�{Fҵ���!��ū����c]6kU*�;dv�A�o��G�P�'-ڃnΦ��Q�u|�`0����X��ƺ
|
2
|
+
��_�OzY���X̅=m�x'��]�];,�%��i��� U���6�3$��l�vx�7f��qV� G �q+�����l�Ӏo� ��Kk@ ��Z"�o�!=��Wj[��������x�t�)tE̵N�tĬCUER���u��=V㸾�-��v��n+2\���:���ЯL��ʜ{�̫WC;~���Q�(����u]��^"�u��4}����#k����#P����8����T��b�Xj����Oz�-h}sn_f�5����z���@�P��,�0�Hf�3˜�8Oދ|i
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: lively-electron
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Samuel Williams
|
8
|
+
bindir: bin
|
9
|
+
cert_chain:
|
10
|
+
- |
|
11
|
+
-----BEGIN CERTIFICATE-----
|
12
|
+
MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
|
13
|
+
ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
|
14
|
+
CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
|
15
|
+
MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
|
16
|
+
MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
|
17
|
+
bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
|
18
|
+
igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
|
19
|
+
9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
|
20
|
+
sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
|
21
|
+
e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
|
22
|
+
XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
|
23
|
+
RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
|
24
|
+
tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
|
25
|
+
zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
|
26
|
+
xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
|
27
|
+
BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
|
28
|
+
aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
|
29
|
+
aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
|
30
|
+
cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
|
31
|
+
xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
|
32
|
+
c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
|
33
|
+
8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
|
34
|
+
JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
|
35
|
+
eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
|
36
|
+
Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
|
37
|
+
voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
|
38
|
+
-----END CERTIFICATE-----
|
39
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
40
|
+
dependencies:
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: lively
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.14'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: sus
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: covered
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: bake-test
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
executables:
|
98
|
+
- lively-electron
|
99
|
+
- lively-electron-server
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files: []
|
102
|
+
files:
|
103
|
+
- bin/lively-electron
|
104
|
+
- bin/lively-electron-server
|
105
|
+
- context/getting-started.md
|
106
|
+
- context/index.yaml
|
107
|
+
- lib/lively/electron.rb
|
108
|
+
- lib/lively/electron/environment.rb
|
109
|
+
- lib/lively/electron/version.rb
|
110
|
+
- license.md
|
111
|
+
- readme.md
|
112
|
+
- releases.md
|
113
|
+
- src/main.js
|
114
|
+
homepage: https://github.com/socketry/lively-electron
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata:
|
118
|
+
documentation_uri: https://github.com/socketry/lively-electron/
|
119
|
+
funding_uri: https://github.com/sponsors/ioquatix
|
120
|
+
source_code_uri: https://github.com/socketry/lively-electron.git
|
121
|
+
rdoc_options: []
|
122
|
+
require_paths:
|
123
|
+
- lib
|
124
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '3.2'
|
129
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
requirements: []
|
135
|
+
rubygems_version: 3.6.9
|
136
|
+
specification_version: 4
|
137
|
+
summary: Electron wrapper for Lively Ruby applications
|
138
|
+
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|