flok 0.0.36 → 0.0.38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -0
  3. data/app/drivers/chrome/build_context.rb +1 -1
  4. data/app/drivers/chrome/config.yml +10 -0
  5. data/app/drivers/chrome/pipe.rb +24 -1
  6. data/app/drivers/chrome/src/persist.js +29 -0
  7. data/app/drivers/chrome/src/sockio.js +3 -1
  8. data/app/drivers/chrome/src/vendor/store2.js +3 -0
  9. data/app/kern/callout.js +55 -0
  10. data/app/kern/controller.js +3 -0
  11. data/app/kern/crc32.js +22 -0
  12. data/app/kern/dispatch.js +16 -0
  13. data/app/kern/mod/event.js +3 -0
  14. data/app/kern/mod/persist.js +1 -0
  15. data/app/kern/mod/timer.js +5 -0
  16. data/app/kern/pagers/mem_pager.js +2 -0
  17. data/app/kern/pagers/sockio_pager.js +66 -0
  18. data/app/kern/pagers/spec0.js +35 -0
  19. data/app/kern/pagers/spec1.js +24 -0
  20. data/app/kern/pagers/spec2.js +31 -0
  21. data/app/kern/services/test.rb +7 -0
  22. data/app/kern/services/vm.rb +141 -0
  23. data/app/kern/spec_helper.js +5 -0
  24. data/bin/flok +27 -5
  25. data/docs/callout.md +8 -0
  26. data/docs/client_api.md +1 -1
  27. data/docs/compilation.md +14 -8
  28. data/docs/controllers.md +2 -1
  29. data/docs/datatypes.md +3 -1
  30. data/docs/environmentals.md +6 -0
  31. data/docs/interactive.md +6 -1
  32. data/docs/kernel_api.md +3 -0
  33. data/docs/mod/event.md +5 -1
  34. data/docs/mod/persist.md +14 -31
  35. data/docs/mod/timer.md +4 -2
  36. data/docs/project.md +16 -5
  37. data/docs/scheduling.md +1 -0
  38. data/docs/services.md +141 -56
  39. data/docs/services/vm.md +128 -0
  40. data/docs/services/vm/pagers.md +46 -0
  41. data/lib/flok/build.rb +11 -16
  42. data/lib/flok/platform.rb +29 -6
  43. data/lib/flok/project_template/app/scripts/script.js +3 -0
  44. data/lib/flok/project_template/app/services/service.rb +1 -0
  45. data/lib/flok/project_template/config/config.yml +1 -0
  46. data/lib/flok/project_template/config/platforms/chrome/config.yml +1 -0
  47. data/lib/flok/project_template/config/services.rb +1 -0
  48. data/lib/flok/service_compiler_templates/services.js.erb +78 -9
  49. data/lib/flok/services_compiler.rb +117 -20
  50. data/lib/flok/user_compiler.rb +14 -6
  51. data/lib/flok/user_compiler_templates/ctable.js.erb +10 -0
  52. data/lib/flok/version.rb +1 -1
  53. data/spec/env/etc.rb +1 -1
  54. data/spec/env/global.rb +2 -0
  55. data/spec/env/iface.rb +20 -4
  56. data/spec/env/kern.rb +8 -3
  57. data/spec/etc/cli_spec.rb +319 -165
  58. data/spec/etc/lib/assets/config.yml +3 -0
  59. data/spec/etc/lib/platform_spec.rb +14 -10
  60. data/spec/etc/lib/project_spec.rb +22 -0
  61. data/spec/etc/service_compiler/config0.rb +1 -0
  62. data/spec/etc/service_compiler/config1.rb +1 -0
  63. data/spec/etc/service_compiler/config2.rb +3 -0
  64. data/spec/etc/service_compiler/service0.rb +22 -6
  65. data/spec/etc/service_compiler/service1.rb +26 -0
  66. data/spec/etc/service_compiler/service_bad_type.rb +20 -0
  67. data/spec/etc/services_compiler_spec.rb +35 -16
  68. data/spec/etc/user_compiler/data.js +2 -0
  69. data/spec/etc/user_compiler_spec.rb +7 -1
  70. data/spec/iface/driver/persist_spec.rb +106 -0
  71. data/spec/iface/driver/pipe_spec.rb +5 -0
  72. data/spec/iface/kern/ping_spec.rb +4 -3
  73. data/spec/kern/assets/blank.rb +0 -0
  74. data/spec/kern/assets/service0.rb +24 -0
  75. data/spec/kern/assets/service1.rb +22 -0
  76. data/spec/kern/assets/service2.rb +27 -0
  77. data/spec/kern/assets/service_config0.rb +2 -0
  78. data/spec/kern/assets/service_config1.rb +2 -0
  79. data/spec/kern/assets/service_controller0.rb +13 -0
  80. data/spec/kern/assets/service_controller1.rb +32 -0
  81. data/spec/kern/assets/service_controller2.rb +38 -0
  82. data/spec/kern/assets/service_controller3.rb +38 -0
  83. data/spec/kern/assets/vm/config0.rb +2 -0
  84. data/spec/kern/assets/vm/config1.rb +12 -0
  85. data/spec/kern/assets/vm/config2.rb +12 -0
  86. data/spec/kern/assets/vm/config3.rb +12 -0
  87. data/spec/kern/assets/vm/controller0.rb +8 -0
  88. data/spec/kern/assets/vm/controller1.rb +18 -0
  89. data/spec/kern/assets/vm/controller2.rb +18 -0
  90. data/spec/kern/assets/vm/controller3.rb +20 -0
  91. data/spec/kern/assets/vm/controller4.rb +22 -0
  92. data/spec/kern/assets/vm/controller5.rb +22 -0
  93. data/spec/kern/assets/vm/controller6.rb +21 -0
  94. data/spec/kern/assets/vm/service0.rb +24 -0
  95. data/spec/kern/assets/vm/service_controller0.rb +7 -0
  96. data/spec/kern/callout_spec.rb +153 -0
  97. data/spec/kern/functions_spec.rb +29 -0
  98. data/spec/kern/service_controller_spec.rb +213 -0
  99. data/spec/kern/vm_service_spec.rb +195 -0
  100. metadata +98 -12
  101. data/app/kern/services/rest.rb +0 -310
  102. data/app/kern/services/timer.rb +0 -30
  103. data/docs/services/timer.md +0 -21
  104. data/spec/kern/assets/rest_service.rb +0 -20
  105. data/spec/kern/assets/timer_service.rb +0 -19
  106. data/spec/kern/timer_service_spec.rb +0 -40
@@ -0,0 +1,22 @@
1
+ service :my_service do
2
+ on_wakeup %{
3
+ every_ticks = 0;
4
+ on_wakeup_called = true;
5
+ }
6
+
7
+ on_sleep %{
8
+ on_sleep_called = true;
9
+ }
10
+
11
+ on_connect %{
12
+ on_connect_called = true;
13
+ }
14
+
15
+ on_disconnect %{
16
+ on_disconnect_called = true;
17
+ }
18
+
19
+ every 1.seconds, %{
20
+ every_ticks += 1;
21
+ }
22
+ end
@@ -0,0 +1,27 @@
1
+ service :my_service do
2
+ on_wakeup %{
3
+ }
4
+
5
+ on_sleep %{
6
+ }
7
+
8
+ on_connect %{
9
+ connect_bp = bp;
10
+ connect_sessions = Object.keys(sessions);
11
+ }
12
+
13
+ on_disconnect %{
14
+ disconnect_bp = bp;
15
+ disconnect_sessions = Object.keys(sessions);
16
+ }
17
+
18
+ every 1.seconds, %{
19
+ every_ticks_sessions = Object.keys(sessions);
20
+ }
21
+
22
+ on "ping", %{
23
+ ping_bp = bp;
24
+ ping_params = params;
25
+ ping_sessions = Object.keys(sessions);
26
+ }
27
+ end
@@ -0,0 +1,2 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :spec, :test
@@ -0,0 +1,2 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :spec, :my_service
@@ -0,0 +1,13 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+ services :spec
4
+
5
+ action :my_action do
6
+ on_entry %{
7
+ }
8
+
9
+ on "ping", %{
10
+ ping_called = true;
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,32 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ Embed("my_other_controller", "hello", {});
7
+ }
8
+
9
+ on "next", %{
10
+ Goto("my_other_action");
11
+ }
12
+ end
13
+
14
+ action :my_other_action do
15
+ on_entry %{
16
+ }
17
+
18
+ on "next", %{
19
+ Goto("my_action");
20
+ }
21
+ end
22
+
23
+ end
24
+
25
+ controller :my_other_controller do
26
+ services :spec
27
+
28
+ action :my_action do
29
+ on_entry %{
30
+ }
31
+ end
32
+ end
@@ -0,0 +1,38 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ Embed("my_other_controller", "hello", {});
7
+ }
8
+
9
+ on "next", %{
10
+ Goto("my_other_action");
11
+ }
12
+ end
13
+
14
+ action :my_other_action do
15
+ on_entry %{
16
+ }
17
+
18
+ on "next", %{
19
+ Goto("my_action");
20
+ }
21
+ end
22
+
23
+ end
24
+
25
+ controller :my_other_controller do
26
+ services :spec
27
+
28
+ action :my_action do
29
+ on_entry %{
30
+ my_base = __base__;
31
+ var info = {
32
+ hello: "world"
33
+ }
34
+ Request("spec", "ping", info);
35
+ }
36
+ end
37
+ end
38
+
@@ -0,0 +1,38 @@
1
+ controller :my_controller do
2
+ spots "hello", "world"
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ Embed("my_other_controller", "hello", {});
7
+ }
8
+
9
+ on "next", %{
10
+ Goto("my_other_action");
11
+ }
12
+ end
13
+
14
+ action :my_other_action do
15
+ on_entry %{
16
+ }
17
+
18
+ on "next", %{
19
+ Goto("my_action");
20
+ }
21
+ end
22
+
23
+ end
24
+
25
+ controller :my_other_controller do
26
+ services :spec
27
+
28
+ action :my_action do
29
+ on_entry %{
30
+ my_base = __base__;
31
+ var info = {
32
+ hello: "world"
33
+ }
34
+ Request("no_such_service", "ping", info);
35
+ }
36
+ end
37
+ end
38
+
@@ -0,0 +1,2 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :vm, :vm
@@ -0,0 +1,12 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :vm, :vm, {
3
+ :pagers => [
4
+ {
5
+ :name => "spec0",
6
+ :namespace => "user",
7
+ :options => {
8
+ "hello" => "world"
9
+ }
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,12 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :vm, :vm, {
3
+ :pagers => [
4
+ {
5
+ :name => "spec1",
6
+ :namespace => "user",
7
+ :options => {
8
+ "hello" => "world"
9
+ }
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,12 @@
1
+ #Simple service config that uses built-in spec service to create a instance called 'spec'
2
+ service_instance :vm, :vm, {
3
+ :pagers => [
4
+ {
5
+ :name => "spec2",
6
+ :namespace => "user",
7
+ :options => {
8
+ "hello" => "world"
9
+ }
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,8 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ }
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ var info = {
7
+ ns: "user",
8
+ key: 33
9
+ };
10
+
11
+ Request("vm", "read_sync", info);
12
+ }
13
+
14
+ on "read_res", %{
15
+ read_res_params = params;
16
+ }
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ var info = {
7
+ ns: "user",
8
+ key: 33
9
+ };
10
+
11
+ Request("vm", "read", info);
12
+ }
13
+
14
+ on "read_res", %{
15
+ read_res_params = params;
16
+ }
17
+ end
18
+ end
@@ -0,0 +1,20 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ var info = {
7
+ ns: "user",
8
+ key: 33,
9
+ value: 22
10
+ };
11
+
12
+ Request("vm", "write", info);
13
+ Request("vm", "read", info);
14
+ }
15
+
16
+ on "read_res", %{
17
+ read_res_params = params;
18
+ }
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ var info = {
7
+ ns: "user",
8
+ key: 33,
9
+ value: 22
10
+ };
11
+
12
+ Request("vm", "write", info);
13
+ Request("vm", "read", info);
14
+ Request("vm", "read", info);
15
+ Request("vm", "read_sync", info);
16
+ }
17
+
18
+ on "read_res", %{
19
+ read_res_params = params;
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ //Send a request
7
+ var info = {
8
+ ns: "user",
9
+ key: "my_key",
10
+ value: "my_value"
11
+ };
12
+
13
+ read_res_called_with = [];
14
+ Request("vm", "read", info);
15
+ Request("vm", "read", info);
16
+ }
17
+
18
+ on "read_res", %{
19
+ read_res_called_with.push(params);
20
+ }
21
+ end
22
+ end
@@ -0,0 +1,21 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ //Send a request
7
+ var info = {
8
+ ns: "user",
9
+ key: "my_key"
10
+ };
11
+
12
+ read_res_called_with = [];
13
+ Request("vm", "read", info);
14
+ Request("vm", "watch", info);
15
+ }
16
+
17
+ on "read_res", %{
18
+ read_res_called_with.push(params);
19
+ }
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ service :my_service do
2
+ on_wakeup %{
3
+ on_wakeup_called = true;
4
+ }
5
+
6
+ on_sleep %{
7
+ on_sleep_called = true;
8
+ }
9
+
10
+ on_connect %{
11
+ on_connect_called = true;
12
+ }
13
+
14
+ on_disconnect %{
15
+ on_disconnect_called = true;
16
+ }
17
+
18
+ every 1.seconds, %{
19
+ for (var i = 0; i < Object.keys(sessions).length; ++i) {
20
+ var bp = Object.keys(sessions)[i];
21
+ int_event(bp, "ping", {});
22
+ }
23
+ }
24
+ end
@@ -0,0 +1,7 @@
1
+ controller :my_controller do
2
+ services :vm
3
+
4
+ action :my_action do
5
+ on_entry %{
6
+ }
7
+ end
@@ -0,0 +1,153 @@
1
+ Dir.chdir File.join File.dirname(__FILE__), '../../'
2
+ require './spec/env/kern.rb'
3
+ require './spec/lib/helpers.rb'
4
+ require './spec/lib/io_extensions.rb'
5
+ require './spec/lib/rspec_extensions.rb'
6
+
7
+ RSpec.describe "kern:timer_service_spec" do
8
+ include_context "kern"
9
+
10
+ it "Can register for single-shot a callout event 1 tick in the future" do
11
+ #Compile the controller
12
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
13
+
14
+ #Register callout
15
+ ctx.eval %{
16
+ //Can accept an event via int_event
17
+ function event_handler(ep, ename, info) {
18
+ event_handler_ep = ep;
19
+ event_handler_ename = ename;
20
+ }
21
+ reg_evt(9, event_handler);
22
+
23
+ //Send the 'test' event in one tick to the 9 event function
24
+ reg_timeout(9, "test", 1);
25
+ }
26
+
27
+ @driver.int("int_timer")
28
+
29
+ ep = ctx.eval("event_handler_ep")
30
+ ename = ctx.eval("event_handler_ename")
31
+ expect(ep).to eq(9)
32
+ expect(ename).to eq("test")
33
+ end
34
+
35
+ it "Can register for an interval callout event 1 tick in the future" do
36
+ #Compile the controller
37
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
38
+
39
+ #Register callout
40
+ ctx.eval %{
41
+ //Can accept an event via int_event
42
+ times_called = 0;
43
+ function event_handler(ep, ename, info) {
44
+ times_called += 1;
45
+ }
46
+ reg_evt(9, event_handler);
47
+
48
+ //Send the 'test' event in one tick to the 9 event function
49
+ reg_interval(9, "test", 1);
50
+ }
51
+
52
+ @driver.int("int_timer")
53
+ @driver.int("int_timer")
54
+
55
+ times_called = ctx.eval("times_called")
56
+ expect(times_called).to eq(2);
57
+ end
58
+
59
+ it "only calls timeout event once" do
60
+ #Compile the controller
61
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
62
+
63
+ #Register callout
64
+ ctx.eval %{
65
+ //Can accept an event via int_event
66
+ times_called = 0;
67
+ function event_handler(ep, ename, info) {
68
+ times_called += 1;
69
+ }
70
+ reg_evt(9, event_handler);
71
+
72
+ //Send the 'test' event in one tick to the 9 event function
73
+ reg_timeout(9, "test", 1);
74
+ }
75
+
76
+ @driver.int("int_timer")
77
+ @driver.int("int_timer")
78
+
79
+ times_called = ctx.eval("times_called")
80
+ expect(times_called).to eq(1);
81
+ end
82
+
83
+ it "does have nothing left in queue after one timeout" do
84
+ #Compile the controller
85
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
86
+
87
+ #Register callout
88
+ ctx.eval %{
89
+ //Can accept an event via int_event
90
+ function event_handler(ep, ename, info) {
91
+ }
92
+ reg_evt(9, event_handler);
93
+
94
+ //Send the 'test' event in one tick to the 9 event function
95
+ reg_timeout(9, "test", 1);
96
+ }
97
+
98
+ @driver.int("int_timer")
99
+
100
+ res = JSON.parse(ctx.eval("JSON.stringify(callout_queue)"))
101
+ expect(res).to eq({});
102
+ end
103
+
104
+ it "does have left in queue after interval" do
105
+ #Compile the controller
106
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
107
+
108
+ #Register callout
109
+ ctx.eval %{
110
+ //Can accept an event via int_event
111
+ function event_handler(ep, ename, info) {
112
+ }
113
+ reg_evt(9, event_handler);
114
+
115
+ //Send the 'test' event in one tick to the 9 event function
116
+ reg_interval(9, "test", 1);
117
+ }
118
+
119
+ @driver.int("int_timer")
120
+
121
+ res = JSON.parse(ctx.eval("JSON.stringify(callout_queue)"))
122
+ expect(res).not_to eq({});
123
+ end
124
+
125
+ it "does NOT have left in queue after interval if event receiver is gone" do
126
+ #Compile the controller
127
+ ctx = flok_new_user File.read('./spec/kern/assets/blank.rb')
128
+
129
+ #Register callout
130
+ ctx.eval %{
131
+ //Can accept an event via int_event
132
+ times_called = 0;
133
+ function event_handler(ep, ename, info) {
134
+ times_called += 1;
135
+ }
136
+ reg_evt(9, event_handler);
137
+
138
+ //Send the 'test' event in one tick to the 9 event function
139
+ reg_interval(9, "test", 1);
140
+ }
141
+
142
+ @driver.int("int_timer")
143
+
144
+ ctx.eval "dereg_evt(9);"
145
+ @driver.int("int_timer")
146
+
147
+ times_called = ctx.eval("times_called")
148
+ expect(times_called).to eq(1);
149
+
150
+ res = JSON.parse(ctx.eval("JSON.stringify(callout_queue)"))
151
+ expect(res).to eq({});
152
+ end
153
+ end