browser_app_base 0.0.9 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -2
- data/bin/start_sample.rb +25 -0
- data/lib/browser_app_base/version.rb +1 -1
- data/lib/browser_app_base.rb +12 -7
- data/lib/template/config/setting.json +50 -50
- data/lib/template/config.ru +15 -3
- data/lib/template/css/index.css +9 -0
- data/lib/template/{index.html → html/index.html} +4 -4
- data/lib/template/html/test.html +85 -0
- data/lib/template/js/main.js +21 -9
- data/lib/template/server_app_base.rb +3 -2
- data/lib/template/start.rb +25 -8
- data/lib/template/wsserver.rb +5 -3
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c449614e4619060aa9e9f5799bc67822e61c1f603ff099914aff5e60593828dd
|
4
|
+
data.tar.gz: c146b0df93c05a64dceb9d6987895635bef0d733f9421581aa421c51d7077fd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed31b5268858c2ac45a01f20924cfe569c0f360797bfad8650a37cf07eff9452b229dbc30ecd0b3200ac5ebcbddc20fcca8f485d4a49440573ee0c6c6a6b7cd2
|
7
|
+
data.tar.gz: 00fa73805f8d27f12464fea9bee92720c9303960890e23a02d804f060b6e1429f5b9b02c0dc58ff1bd0ae90ffd4f8ed38c918bdc45e843e203f68563dbce9009
|
data/README.md
CHANGED
data/bin/start_sample.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "fileutils"
|
4
|
+
require "facter"
|
5
|
+
require "tmpdir"
|
6
|
+
|
7
|
+
# tmpdirディレクトリにコピー
|
8
|
+
dir = File.dirname(File.expand_path(__FILE__)) + "/../"
|
9
|
+
Dir.mktmpdir { |tmpdir|
|
10
|
+
puts tmpdir
|
11
|
+
Dir.glob("#{dir}/lib/*") do |f|
|
12
|
+
puts "#{f} => #{tmpdir}"
|
13
|
+
FileUtils.cp_r f, "#{tmpdir}"
|
14
|
+
end
|
15
|
+
|
16
|
+
FileUtils.cd "#{tmpdir}"
|
17
|
+
kernel = Facter.value(:kernel)
|
18
|
+
if kernel == "windows"
|
19
|
+
system "rubyw ./start.rb"
|
20
|
+
elsif kernel == "Linux"
|
21
|
+
system "ruby ./start.rb"
|
22
|
+
else
|
23
|
+
system "ruby ./start.rb"
|
24
|
+
end
|
25
|
+
}
|
data/lib/browser_app_base.rb
CHANGED
@@ -37,28 +37,33 @@ module BrowserAppBase
|
|
37
37
|
puts "create application base #{dir}"
|
38
38
|
|
39
39
|
FileUtils.mkdir_p dir
|
40
|
+
FileUtils.mkdir_p dir + "/lib/"
|
41
|
+
FileUtils.mkdir_p dir + "/bin/"
|
40
42
|
|
41
|
-
path = File.dirname(File.expand_path(__FILE__))
|
42
|
-
Dir.glob("#{path}/template/*") do |f|
|
43
|
-
puts "#{f} => #{dir}"
|
44
|
-
FileUtils.cp_r f, "#{dir}/"
|
43
|
+
path = File.dirname(File.expand_path(__FILE__)) + "/../"
|
44
|
+
Dir.glob("#{path}/lib/template/*") do |f|
|
45
|
+
puts "#{f} => #{dir}/lib"
|
46
|
+
FileUtils.cp_r f, "#{dir}/lib"
|
45
47
|
end
|
46
48
|
|
47
49
|
if app
|
48
50
|
app_file = get_app_file(app)
|
49
51
|
|
52
|
+
puts "#{path}/bin/start_sample.rb #{dir}/bin/start_#{app_file}"
|
53
|
+
FileUtils.cp_r "#{path}/bin/start_sample.rb", "#{dir}/bin/start_#{app_file}"
|
54
|
+
|
50
55
|
load_app = <<"EOS"
|
51
56
|
require '#{app_file}'
|
52
57
|
$app = #{get_app_name(app)}.new
|
53
58
|
EOS
|
54
59
|
|
55
|
-
File.open("#{dir}/app_load.rb", "w") do |f|
|
60
|
+
File.open("#{dir}/lib/app_load.rb", "w") do |f|
|
56
61
|
f.write load_app
|
57
62
|
end
|
58
63
|
|
59
64
|
puts "create #{app_file}"
|
60
|
-
new_file = "#{dir}/#{app_file}"
|
61
|
-
FileUtils.cp("#{dir}/my_app_sample.rb", new_file)
|
65
|
+
new_file = "#{dir}/lib/#{app_file}"
|
66
|
+
FileUtils.cp("#{dir}/lib/my_app_sample.rb", new_file)
|
62
67
|
buf = File.binread(new_file)
|
63
68
|
File.binwrite(new_file, buf.gsub(/MyApp/, get_app_name(app)))
|
64
69
|
end
|
@@ -1,50 +1,50 @@
|
|
1
|
-
[
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
]
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"name": "name1",
|
4
|
+
"value": "value1 2 3 4",
|
5
|
+
"type": "input",
|
6
|
+
"select": "",
|
7
|
+
"description": "設定項目1"
|
8
|
+
},
|
9
|
+
{
|
10
|
+
"name": "name2",
|
11
|
+
"value": true,
|
12
|
+
"type": "checkbox",
|
13
|
+
"select": "",
|
14
|
+
"description": "有効にする場合はチェック"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"name": "name3",
|
18
|
+
"value": "2",
|
19
|
+
"type": "select",
|
20
|
+
"select": [
|
21
|
+
"1",
|
22
|
+
"2",
|
23
|
+
"3",
|
24
|
+
"4",
|
25
|
+
"5"
|
26
|
+
],
|
27
|
+
"description": "選択項目"
|
28
|
+
},
|
29
|
+
{
|
30
|
+
"name": "name4",
|
31
|
+
"value": "value4",
|
32
|
+
"type": "input",
|
33
|
+
"select": "",
|
34
|
+
"description": "設定項目4"
|
35
|
+
},
|
36
|
+
{
|
37
|
+
"name": "name5",
|
38
|
+
"value": "value5",
|
39
|
+
"type": "input",
|
40
|
+
"select": "",
|
41
|
+
"description": "設定項目5"
|
42
|
+
},
|
43
|
+
{
|
44
|
+
"name": "name6",
|
45
|
+
"value": "value6",
|
46
|
+
"type": "input",
|
47
|
+
"select": "",
|
48
|
+
"description": "設定項目6"
|
49
|
+
}
|
50
|
+
]
|
data/lib/template/config.ru
CHANGED
@@ -8,8 +8,20 @@ require "json"
|
|
8
8
|
require "./server"
|
9
9
|
require "./wsserver"
|
10
10
|
|
11
|
+
temp_dir = ENV["temp"]
|
12
|
+
temp_dir = "/tmp" if temp_dir == nil
|
13
|
+
puts "temp_dir=#{temp_dir}"
|
14
|
+
access_log = File.new("#{temp_dir}/logs/sinatra.log", "a+")
|
15
|
+
access_log.sync = true
|
16
|
+
use Rack::CommonLogger, access_log
|
17
|
+
|
11
18
|
get "/" do
|
12
|
-
File.read("index.html")
|
19
|
+
File.read("html/index.html")
|
20
|
+
end
|
21
|
+
|
22
|
+
get "*.html" do |file|
|
23
|
+
content_type "text/html", :charset => "utf-8"
|
24
|
+
File.read "./html/#{file}.html"
|
13
25
|
end
|
14
26
|
|
15
27
|
get "/css/:name.css" do
|
@@ -80,7 +92,7 @@ end
|
|
80
92
|
|
81
93
|
configure do
|
82
94
|
set :DoNotReverseLookup, true
|
83
|
-
set :logging,
|
95
|
+
set :logging, true
|
84
96
|
set :default_encoding, "utf-8"
|
85
97
|
set :server, :thin
|
86
98
|
|
@@ -89,6 +101,6 @@ configure do
|
|
89
101
|
|
90
102
|
end
|
91
103
|
|
92
|
-
#\ --port
|
104
|
+
#\ --port 36809
|
93
105
|
|
94
106
|
run Sinatra::Application
|
data/lib/template/css/index.css
CHANGED
@@ -66,6 +66,15 @@ textarea.long {
|
|
66
66
|
color: black;
|
67
67
|
}
|
68
68
|
|
69
|
+
.ui-autocomplete.ui-front {
|
70
|
+
max-height: 250px;
|
71
|
+
overflow-y: auto;
|
72
|
+
/* prevent horizontal scrollbar */
|
73
|
+
overflow-x: hidden;
|
74
|
+
/* add padding to account for vertical scrollbar */
|
75
|
+
z-index: 1000 !important;
|
76
|
+
}
|
77
|
+
|
69
78
|
.ui-dialog {
|
70
79
|
position: absolute;
|
71
80
|
top: 0;
|
@@ -11,8 +11,8 @@
|
|
11
11
|
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
|
12
12
|
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
|
13
13
|
|
14
|
-
<script src="http://localhost:
|
15
|
-
<link rel="stylesheet" href="http://localhost:
|
14
|
+
<script src="http://localhost:36809/js/main.js"></script>
|
15
|
+
<link rel="stylesheet" href="http://localhost:36809/css/index.css" type="text/css">
|
16
16
|
</head>
|
17
17
|
|
18
18
|
<body>
|
@@ -39,7 +39,7 @@
|
|
39
39
|
</table>
|
40
40
|
|
41
41
|
<div id="dialog1" style="display:none;">
|
42
|
-
<input class="inarea" type="
|
42
|
+
<input class="inarea" type="search" name="search_str" id="search_str">
|
43
43
|
</div>
|
44
44
|
<table>
|
45
45
|
<tr>
|
@@ -49,7 +49,7 @@
|
|
49
49
|
</table>
|
50
50
|
|
51
51
|
<div id="dialog2" style="display:none;">
|
52
|
-
<input class="inarea" type="
|
52
|
+
<input class="inarea" type="search" name="search_str2" id="search_str2">
|
53
53
|
</div>
|
54
54
|
<table>
|
55
55
|
<tr>
|
@@ -0,0 +1,85 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="ja">
|
3
|
+
|
4
|
+
<head>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
<title>modalをcomponentで作る</title>
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<style>
|
10
|
+
#content {
|
11
|
+
z-index: 10;
|
12
|
+
width: 50%;
|
13
|
+
padding: 1em;
|
14
|
+
background: #fff;
|
15
|
+
}
|
16
|
+
|
17
|
+
#overlay {
|
18
|
+
/* 要素を重ねた時の順番 */
|
19
|
+
|
20
|
+
z-index: 1;
|
21
|
+
|
22
|
+
/* 画面全体を覆う設定 */
|
23
|
+
position: fixed;
|
24
|
+
top: 0;
|
25
|
+
left: 0;
|
26
|
+
width: 100%;
|
27
|
+
height: 100%;
|
28
|
+
background-color: rgba(0, 0, 0, 0.5);
|
29
|
+
|
30
|
+
/* 画面の中央に要素を表示させる設定 */
|
31
|
+
display: flex;
|
32
|
+
align-items: center;
|
33
|
+
justify-content: center;
|
34
|
+
|
35
|
+
}
|
36
|
+
</style>
|
37
|
+
|
38
|
+
<body>
|
39
|
+
<div id="app">
|
40
|
+
|
41
|
+
<button v-on:click="openModal">Click</button>
|
42
|
+
|
43
|
+
<open-modal v-show="showContent" v-on:from-child="closeModal">slotからモーダルウィンドウへ</open-modal>
|
44
|
+
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
|
48
|
+
<script>
|
49
|
+
Vue.component('open-modal', {
|
50
|
+
template: `
|
51
|
+
<div id="overlay" v-on:click="clickEvent">
|
52
|
+
<div id="content" v-on:click="stopEvent">
|
53
|
+
<p><slot></slot></p>
|
54
|
+
<button v-on:click="clickEvent">close</button>
|
55
|
+
</div>
|
56
|
+
</div>
|
57
|
+
`,
|
58
|
+
methods: {
|
59
|
+
clickEvent: function () {
|
60
|
+
this.$emit('from-child')
|
61
|
+
},
|
62
|
+
stopEvent: function () {
|
63
|
+
event.stopPropagation()
|
64
|
+
}
|
65
|
+
}
|
66
|
+
})
|
67
|
+
|
68
|
+
new Vue({
|
69
|
+
el: '#app',
|
70
|
+
data: {
|
71
|
+
showContent: false
|
72
|
+
},
|
73
|
+
methods: {
|
74
|
+
openModal: function () {
|
75
|
+
this.showContent = true
|
76
|
+
},
|
77
|
+
closeModal: function () {
|
78
|
+
this.showContent = false
|
79
|
+
},
|
80
|
+
}
|
81
|
+
})
|
82
|
+
</script>
|
83
|
+
</body>
|
84
|
+
|
85
|
+
</html>
|
data/lib/template/js/main.js
CHANGED
@@ -3,26 +3,35 @@
|
|
3
3
|
var $ws = null;
|
4
4
|
var $auto_scroll = true;
|
5
5
|
var dialog = null;
|
6
|
+
var dialog_timeout = null;
|
6
7
|
|
7
|
-
function open_dialog(msg) {
|
8
|
+
function open_dialog(msg, timeout = 0) {
|
8
9
|
console.log("msg=" + msg);
|
9
10
|
$("#msg_text").html(msg);
|
10
|
-
$("#msg_dialog").dialog({
|
11
|
+
d = $("#msg_dialog").dialog({
|
11
12
|
modal: true
|
12
13
|
, show: "slide" //表示時のアニメーション
|
13
14
|
, hide: "slide" //閉じた時のアニメーション
|
14
15
|
, title: "Message" //ダイアログのタイトル
|
15
|
-
, width:
|
16
|
-
, height:
|
16
|
+
, width: 500 //ダイアログの横幅
|
17
|
+
, height: 300 //ダイアログの高さ
|
17
18
|
, resizable: true //リサイズ可
|
18
19
|
, closeOnEscape: false //[ESC]キーで閉じられなくする
|
19
20
|
, draggable: true //ダイアログの移動を可に
|
20
21
|
, buttons: {
|
21
22
|
"OK": function () { //Cancelボタン
|
23
|
+
if (dialog_timeout != null) {
|
24
|
+
clearTimeout(dialog_timeout);
|
25
|
+
}
|
22
26
|
$(this).dialog("close");
|
23
27
|
}
|
24
28
|
}
|
25
29
|
});
|
30
|
+
if (timeout != 0) {
|
31
|
+
dialog_timeout = setTimeout(function () {
|
32
|
+
d.dialog("close");
|
33
|
+
}, timeout);
|
34
|
+
}
|
26
35
|
}
|
27
36
|
|
28
37
|
function open_dialog_org(msg) {
|
@@ -62,11 +71,14 @@ function server_connect(url) {
|
|
62
71
|
else if (evt.data.match(/^app_end:normal/)) {
|
63
72
|
open_dialog("終了しました");
|
64
73
|
}
|
74
|
+
else if (evt.data.match(/^app_end:stop/)) {
|
75
|
+
open_dialog("中止しました");
|
76
|
+
}
|
65
77
|
else if (evt.data.match(/^app_end:error/)) {
|
66
78
|
open_dialog("<font color='red'>エラーが発生しました</font>");
|
67
79
|
}
|
68
80
|
else if (evt.data.match(/^popup:/)) {
|
69
|
-
open_dialog(evt.data.replace(/^popup:/, ""));
|
81
|
+
open_dialog(evt.data.replace(/^popup:/, ""), 3000);
|
70
82
|
} else {
|
71
83
|
var log = "<li>" + evt.data + "</li>";
|
72
84
|
$('#log').append(log);
|
@@ -103,7 +115,7 @@ function autocomp(id, file_kind) {
|
|
103
115
|
},
|
104
116
|
source: function (req, resp) {
|
105
117
|
$.ajax({
|
106
|
-
url: "http://localhost:
|
118
|
+
url: "http://localhost:36809/search?path=" + $("#" + id).val() + "&kind=" + file_kind,
|
107
119
|
type: "GET",
|
108
120
|
cache: false,
|
109
121
|
dataType: "json",
|
@@ -136,7 +148,7 @@ function autocomp_history(id, file_name) {
|
|
136
148
|
},
|
137
149
|
source: function (req, resp) {
|
138
150
|
$.ajax({
|
139
|
-
url: "http://localhost:
|
151
|
+
url: "http://localhost:36809/history/" + file_name,
|
140
152
|
type: "POST",
|
141
153
|
cache: false,
|
142
154
|
dataType: "json",
|
@@ -197,7 +209,7 @@ function setting_dialog(open_id, dialog_id, json_file) {
|
|
197
209
|
if (s[i].type == "input") {
|
198
210
|
var h = "<table><tr>"
|
199
211
|
+ "<td class='setting_name'>" + s[i].description + "</td>"
|
200
|
-
+ "<td><input class='setting_value' type='text' " + "id=" + s[i].name + "_value " + "value=" + s[i].value + ">"
|
212
|
+
+ "<td><input class='setting_value' type='text' " + "id=" + s[i].name + "_value " + "value=" + "'" + s[i].value + "'" + ">"
|
201
213
|
+ "</td></tr></table>"
|
202
214
|
$("dl#wrap").append(h);
|
203
215
|
} else if (s[i].type == "checkbox") {
|
@@ -314,7 +326,7 @@ $(document).ready(function () {
|
|
314
326
|
window.onload = function (e) {
|
315
327
|
console.log("onload");
|
316
328
|
// サーバに接続
|
317
|
-
server_connect("ws://localhost:
|
329
|
+
server_connect("ws://localhost:36809/wsserver")
|
318
330
|
}
|
319
331
|
|
320
332
|
// ウインドウサイズ
|
@@ -40,7 +40,7 @@ class AppMainBase
|
|
40
40
|
end
|
41
41
|
|
42
42
|
# 履歴の保存
|
43
|
-
def add_history(file, history_data)
|
43
|
+
def add_history(file, history_data, max = 10)
|
44
44
|
buf = File.read "history/#{file}"
|
45
45
|
data = eval(buf)
|
46
46
|
if data == nil
|
@@ -49,8 +49,9 @@ class AppMainBase
|
|
49
49
|
if history_data.to_s != ""
|
50
50
|
data.prepend history_data
|
51
51
|
end
|
52
|
+
data = data.uniq[0..max - 1]
|
52
53
|
File.open("history/#{file}", "w") do |f|
|
53
|
-
f.write JSON.pretty_generate data
|
54
|
+
f.write JSON.pretty_generate data
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
data/lib/template/start.rb
CHANGED
@@ -12,33 +12,50 @@ require "facter"
|
|
12
12
|
|
13
13
|
# ログ出力
|
14
14
|
module Output
|
15
|
-
def self.console_and_file(output_file)
|
16
|
-
|
15
|
+
def self.console_and_file(output_file, stdout = true)
|
16
|
+
begin
|
17
|
+
defout = File.new(output_file, "a+")
|
18
|
+
rescue
|
19
|
+
puts $!
|
20
|
+
puts $@
|
21
|
+
return nil
|
22
|
+
end
|
17
23
|
class << defout
|
18
24
|
alias_method :write_org, :write
|
19
25
|
|
26
|
+
def initialize(stdout)
|
27
|
+
@stdout = false
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_accessor :stdout
|
31
|
+
|
20
32
|
def puts(str)
|
21
|
-
STDOUT.write(str.to_s + "\n")
|
33
|
+
STDOUT.write(str.to_s + "\n") if @stdout
|
22
34
|
self.write_org(str.to_s + "\n")
|
23
35
|
self.flush
|
24
36
|
end
|
25
37
|
|
26
38
|
def write(str)
|
27
|
-
STDOUT.write(str)
|
39
|
+
STDOUT.write(str) if @stdout
|
28
40
|
self.write_org(str)
|
29
41
|
self.flush
|
30
42
|
end
|
31
43
|
end
|
32
44
|
$stdout = defout
|
45
|
+
$stdout.stdout = stdout
|
33
46
|
end
|
34
47
|
end
|
35
48
|
|
36
|
-
Output.console_and_file("log.txt")
|
37
|
-
|
38
49
|
# ディレクトリ移動
|
39
50
|
dir = File.dirname(File.expand_path(__FILE__))
|
40
51
|
FileUtils.cd dir
|
41
52
|
|
53
|
+
temp_dir = ENV["temp"]
|
54
|
+
temp_dir = "/tmp" if temp_dir == nil
|
55
|
+
puts "temp_dir=#{temp_dir}"
|
56
|
+
FileUtils.mkdir_p("#{temp_dir}/logs")
|
57
|
+
Output.console_and_file("#{temp_dir}/logs/app.log", true)
|
58
|
+
|
42
59
|
# 空きポートを取得
|
43
60
|
def get_unused_port
|
44
61
|
s = TCPServer.open(0)
|
@@ -62,9 +79,9 @@ buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
|
|
62
79
|
File.binwrite("js/main.js", buf)
|
63
80
|
|
64
81
|
# index.htaの編集
|
65
|
-
buf = File.binread("index.html").toutf8
|
82
|
+
buf = File.binread("html/index.html").toutf8
|
66
83
|
buf.gsub!(/localhost:[0-9]+\//, "localhost:#{port}/")
|
67
|
-
File.binwrite("index.html", buf)
|
84
|
+
File.binwrite("html/index.html", buf)
|
68
85
|
|
69
86
|
begin
|
70
87
|
Thread.start {
|
data/lib/template/wsserver.rb
CHANGED
@@ -51,11 +51,11 @@ class WsServer < Sinatra::Base
|
|
51
51
|
end
|
52
52
|
ws.onmessage do |msg|
|
53
53
|
puts msg
|
54
|
+
json = JSON.parse(File.read("config/setting.json"))
|
55
|
+
json_config = config_json_hash(json)
|
56
|
+
$app.set_config(json_config)
|
54
57
|
if msg =~ /^exec:/
|
55
58
|
if exec_thread == nil
|
56
|
-
json = JSON.parse(File.read("config/setting.json"))
|
57
|
-
json_config = config_json_hash(json)
|
58
|
-
$app.set_config(json_config)
|
59
59
|
argv = msg.gsub(/^exec:/, "")
|
60
60
|
exec_thread = Thread.new {
|
61
61
|
begin
|
@@ -80,6 +80,8 @@ class WsServer < Sinatra::Base
|
|
80
80
|
end
|
81
81
|
if msg =~ /^stop/
|
82
82
|
if exec_thread
|
83
|
+
Thread.kill exec_thread
|
84
|
+
ws_send("app_end:stop")
|
83
85
|
$app.stop
|
84
86
|
end
|
85
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browser_app_base
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- masataka kuwayama
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -99,6 +99,7 @@ email:
|
|
99
99
|
- masataka.kuwayama@gmail.com
|
100
100
|
executables:
|
101
101
|
- create_browser_app.rb
|
102
|
+
- start_sample.rb
|
102
103
|
extensions: []
|
103
104
|
extra_rdoc_files: []
|
104
105
|
files:
|
@@ -110,6 +111,7 @@ files:
|
|
110
111
|
- README.md
|
111
112
|
- Rakefile
|
112
113
|
- bin/create_browser_app.rb
|
114
|
+
- bin/start_sample.rb
|
113
115
|
- browser_app_base.gemspec
|
114
116
|
- lib/browser_app_base.rb
|
115
117
|
- lib/browser_app_base/version.rb
|
@@ -119,7 +121,8 @@ files:
|
|
119
121
|
- lib/template/config/setting.json
|
120
122
|
- lib/template/css/index.css
|
121
123
|
- lib/template/history/history.json
|
122
|
-
- lib/template/index.html
|
124
|
+
- lib/template/html/index.html
|
125
|
+
- lib/template/html/test.html
|
123
126
|
- lib/template/js/main.js
|
124
127
|
- lib/template/my_app_sample.rb
|
125
128
|
- lib/template/server.rb
|