flok 0.0.36 → 0.0.38

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.
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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8a8425b97376c2855610394bfe1e5c12a498005
4
- data.tar.gz: 4a274f3ba25a295cb5971eef748a1e48cb5ac952
3
+ metadata.gz: 847b5b5b82356f175e5193de663c69487bc543fc
4
+ data.tar.gz: 06b557dd275ee22398619033cc94b893eb815cc8
5
5
  SHA512:
6
- metadata.gz: 2cf06cfac24fbaa78bed6f8bebdf63631325a32755fe38bfd7ec27368ccf411fdcdcf48b3b3d3dc7de4cee31c5e2ae845395b555d2c688a4a149ea9b5e21e03e
7
- data.tar.gz: 5ab28831852850064e7e6f2ae4484e937cf825e1fd197fa887f53bd320ddb070aa2d7d2aacb3f6a9d50e761b408268f2af9e62f63d30aa64d652cd6ffa8008f8
6
+ metadata.gz: 2dd662522a021063c44cfdbea4db37ea388f7d82f42108be93cd2b68507286b21650e524c9a2f99d2025781a375ae6d133383bb767e77cfa5af9642d37467f36
7
+ data.tar.gz: eed43cf8edd7d656d0364770c73468658bff40759621629f3e127627327ab7c9f03a3d3bf4200c079a5293297216fac924efb35bd259bb474bd1e97c6687ce26
data/Rakefile CHANGED
@@ -67,6 +67,7 @@ namespace :build do
67
67
  #What platform are we working with?
68
68
  raise "No $PLATFORM given" unless platform = ENV["PLATFORM"]
69
69
  raise "No $FLOK_ENV given" unless environment = ENV["FLOK_ENV"]
70
+
70
71
  build_path = "./products/#{platform}"
71
72
 
72
73
  Flok.build_world(build_path, platform, environment)
@@ -6,7 +6,7 @@ module Chrome
6
6
  @debug = (ENV['FLOK_ENV'] == "DEBUG")
7
7
  @release = (ENV['FLOK_ENV'] == "RELEASE")
8
8
  Dir.chdir File.join(File.dirname(__FILE__), "../../../") do
9
- @mods = Flok::Platform.mods(ENV['PLATFORM'], ENV['FLOK_ENV'])
9
+ @mods = Flok::Platform.mods(ENV['FLOK_ENV'])
10
10
  end
11
11
  end
12
12
 
@@ -8,6 +8,11 @@ DEBUG:
8
8
  - controller
9
9
  - debug
10
10
  - sockio
11
+ - persist
12
+ - timer
13
+ defines:
14
+ - mem_pager
15
+ - sockio_pager
11
16
  RELEASE:
12
17
  mods:
13
18
  - ui
@@ -16,3 +21,8 @@ RELEASE:
16
21
  - segue
17
22
  - controller
18
23
  - sockio
24
+ - persist
25
+ - timer
26
+ defines:
27
+ - mem_pager
28
+ - sockio_pager
@@ -2,6 +2,7 @@ require 'json'
2
2
  require 'tempfile'
3
3
  require 'securerandom'
4
4
  require 'open3'
5
+ $stdout.sync = true
5
6
 
6
7
  #Interactive pipe for testing.
7
8
  #Creates a server that routes $stdin into if_dispatch and $stdout to int_dispatch.
@@ -33,7 +34,29 @@ class InteractiveServer
33
34
  if results[0].include? STDIN
34
35
  begin
35
36
  q = gets.strip
36
- inp.puts "if_dispatch(JSON.parse('#{q}'))"
37
+ if q == "RESTART"
38
+ inp.puts "$__RESTART__"
39
+
40
+ begin
41
+ #Wait for restart to respond 'ok'
42
+ Timeout::timeout(10) do
43
+ restart_res = out.readline
44
+ raise "Restart of phantomjs did not return '__RESTART_OK__' like expected, returned: #{restart_res.inspect}" unless restart_res == "$__RESTART_OK__\n"
45
+ end
46
+ rescue Timeout::Error
47
+ raise "Restart of boojs did not happen within 5 seconds"
48
+ rescue EOFError
49
+ #Sleep for a second to let the error pipe fill up from boojs, this error
50
+ #will then be displayed and then we will crash
51
+ sleep 3
52
+ $stderr.puts err.read
53
+ raise "boojs encountered an error"
54
+ end
55
+
56
+ puts "RESTART OK"
57
+ else
58
+ inp.puts "if_dispatch(JSON.parse('#{q}'))"
59
+ end
37
60
  rescue Errno::EIO
38
61
  #Can't say anything here, we don't have a pipe
39
62
  exit 1
@@ -0,0 +1,29 @@
1
+ function if_per_set(ns, key, value) {
2
+ var _ns = store.namespace(ns);
3
+ _ns.set(key, value)
4
+ }
5
+
6
+ function if_per_del(ns, key) {
7
+ var _ns = store.namespace(ns);
8
+ _ns.remove(key);
9
+ }
10
+
11
+ function if_per_del_ns(ns) {
12
+ var _ns = store.namespace(ns);
13
+ _ns.clearAll();
14
+ }
15
+
16
+ function if_per_get(s, ns, key) {
17
+ function async() {
18
+ var _ns = store.namespace(ns);
19
+ var res = _ns.get(key);
20
+ int_dispatch([2, "int_per_get_res", s, res]);
21
+ }
22
+ setTimeout(async, 0);
23
+ }
24
+
25
+ function if_per_get_sync(s, ns, key) {
26
+ var _ns = store.namespace(ns);
27
+ var res = _ns.get(key);
28
+ int_dispatch([2, "int_per_get_res", s, res]);
29
+ }
@@ -1,7 +1,9 @@
1
1
  sp_to_sockio = {}
2
2
 
3
3
  function if_sockio_init(url, sp) {
4
- sp_to_sockio[sp] = io(url);
4
+ sp_to_sockio[sp] = io(url, {
5
+ "forceNew": true
6
+ });
5
7
  }
6
8
 
7
9
  function if_sockio_fwd(sp, event_name, bp) {
@@ -0,0 +1,3 @@
1
+ /*! store2 - v2.3.0 - 2015-05-22
2
+ * Copyright (c) 2015 Nathan Bubna; Licensed MIT, GPL */
3
+ (function(t,e){var n={version:"2.3.0",areas:{},apis:{},inherit:function(t,e){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n]);return e},stringify:function(t){return void 0===t||"function"==typeof t?t+"":JSON.stringify(t)},parse:function(t){try{return JSON.parse(t)}catch(e){return t}},fn:function(t,e){n.storeAPI[t]=e;for(var i in n.apis)n.apis[i][t]=e},get:function(t,e){return t.getItem(e)},set:function(t,e,n){t.setItem(e,n)},remove:function(t,e){t.removeItem(e)},key:function(t,e){return t.key(e)},length:function(t){return t.length},clear:function(t){t.clear()},Store:function(t,e,i){var r=n.inherit(n.storeAPI,function(t,e,n){return 0===arguments.length?r.getAll():void 0!==e?r.set(t,e,n):"string"==typeof t?r.get(t):t?r.setAll(t,e):r.clear()});r._id=t;try{var s="_safariPrivate_";e.setItem(s,"sucks"),r._area=e,e.removeItem(s)}catch(a){}return r._area||(r._area=n.inherit(n.storageAPI,{items:{},name:"fake"})),r._ns=i||"",n.areas[t]||(n.areas[t]=r._area),n.apis[r._ns+r._id]||(n.apis[r._ns+r._id]=r),r},storeAPI:{area:function(t,e){var i=this[t];return i&&i.area||(i=n.Store(t,e,this._ns),this[t]||(this[t]=i)),i},namespace:function(t,e){if(!t)return this._ns?this._ns.substring(0,this._ns.length-1):"";var i=t,r=this[i];return r&&r.namespace||(r=n.Store(this._id,this._area,this._ns+i+"."),this[i]||(this[i]=r),e||r.area("session",n.areas.session)),r},isFake:function(){return"fake"===this._area.name},toString:function(){return"store"+(this._ns?"."+this.namespace():"")+"["+this._id+"]"},has:function(t){return this._area.has?this._area.has(this._in(t)):!!(this._in(t)in this._area)},size:function(){return this.keys().length},each:function(t,e){for(var i=0,r=n.length(this._area);r>i;i++){var s=this._out(n.key(this._area,i));if(void 0!==s&&t.call(this,s,e||this.get(s))===!1)break;r>n.length(this._area)&&(r--,i--)}return e||this},keys:function(){return this.each(function(t,e){e.push(t)},[])},get:function(t,e){var i=n.get(this._area,this._in(t));return null!==i?n.parse(i):e||i},getAll:function(){return this.each(function(t,e){e[t]=this.get(t)},{})},set:function(t,e,i){var r=this.get(t);return null!=r&&i===!1?e:n.set(this._area,this._in(t),n.stringify(e),i)||r},setAll:function(t,e){var n,i;for(var r in t)i=t[r],this.set(r,i,e)!==i&&(n=!0);return n},remove:function(t){var e=this.get(t);return n.remove(this._area,this._in(t)),e},clear:function(){return this._ns?this.each(function(t){n.remove(this._area,this._in(t))},1):n.clear(this._area),this},clearAll:function(){var t=this._area;for(var e in n.areas)n.areas.hasOwnProperty(e)&&(this._area=n.areas[e],this.clear());return this._area=t,this},_in:function(t){return"string"!=typeof t&&(t=n.stringify(t)),this._ns?this._ns+t:t},_out:function(t){return this._ns?t&&0===t.indexOf(this._ns)?t.substring(this._ns.length):void 0:t}},storageAPI:{length:0,has:function(t){return this.items.hasOwnProperty(t)},key:function(t){var e=0;for(var n in this.items)if(this.has(n)&&t===e++)return n},setItem:function(t,e){this.has(t)||this.length++,this.items[t]=e},removeItem:function(t){this.has(t)&&(delete this.items[t],this.length--)},getItem:function(t){return this.has(t)?this.items[t]:null},clear:function(){for(var t in this.list)this.removeItem(t)},toString:function(){return this.length+" items in "+this.name+"Storage"}}};t.store&&(n.conflict=t.store);var i=n.Store("local",function(){try{return localStorage}catch(t){}}());i.local=i,i._=n,i.area("session",function(){try{return sessionStorage}catch(t){}}()),t.store=i,"function"==typeof e&&void 0!==e.amd?e(function(){return i}):"undefined"!=typeof module&&module.exports&&(module.exports=i)})(this,this.define);
@@ -0,0 +1,55 @@
1
+ callout_tick = 0;
2
+ callout_queue = {};
3
+
4
+ function callout_wakeup() {
5
+ callout_tick += 1;
6
+
7
+ //Get an array of things that should fire now
8
+ var arr = callout_queue[callout_tick];
9
+ if (arr === undefined) {
10
+ return;
11
+ }
12
+ delete callout_queue[callout_tick];
13
+
14
+ for (var i = 0; i < arr.length; ++i) {
15
+ var e = arr[i];
16
+
17
+ //Send event
18
+ var ep_ok = int_event(e.ep, e.ename, {});
19
+
20
+ //Reschedule interval if the ep still exists
21
+ if (e.interval && ep_ok) {
22
+ reg_interval(e.ep, e.ename, e.ticks);
23
+ }
24
+ }
25
+ }
26
+
27
+ function reg_timeout(ep, ename, ticks) {
28
+ //Create an array if there isn't already one
29
+ if (callout_queue[ticks+callout_tick] === undefined) {
30
+ callout_queue[ticks+callout_tick] = [];
31
+ }
32
+
33
+ //Insert an item
34
+ callout_queue[ticks+callout_tick].push({
35
+ ep: ep,
36
+ ename: ename,
37
+ ticks: ticks,
38
+ interval: false
39
+ });
40
+ }
41
+
42
+ function reg_interval(ep, ename, ticks) {
43
+ //Create an array if there isn't already one
44
+ if (callout_queue[ticks+callout_tick] === undefined) {
45
+ callout_queue[ticks+callout_tick] = [];
46
+ }
47
+
48
+ //Insert an item
49
+ callout_queue[ticks+callout_tick].push({
50
+ ep: ep,
51
+ ename: ename,
52
+ ticks: ticks,
53
+ interval: true
54
+ });
55
+ }
@@ -90,6 +90,9 @@ function _embed(vc_name, sp, context, event_gw) {
90
90
  //Register the event handler callback
91
91
  reg_evt(base, controller_event_callback);
92
92
 
93
+ //Call __init__
94
+ cte.__init__(base);
95
+
93
96
  //Call the on_entry function with the base address
94
97
  cte.actions[action].on_entry(base);
95
98
 
data/app/kern/crc32.js ADDED
@@ -0,0 +1,22 @@
1
+ function crc_init() {
2
+ var c;
3
+ crc_table = [];
4
+ for (var n = 0; n < 256; n++) {
5
+ c = n;
6
+ for (var k = 0; k < 8; k++) {
7
+ c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));
8
+ }
9
+ crc_table[n] = c;
10
+ }
11
+ }
12
+ crc_init();
13
+
14
+ function crc32(seed, str) {
15
+ var crc = seed ^ (-1);
16
+
17
+ for (var i = 0; i < str.length; i++) {
18
+ crc = (crc >>> 8) ^ crc_table[(crc ^ str.charCodeAt(i)) & 0xFF];
19
+ }
20
+
21
+ return (crc ^ (-1)) >>> 0;
22
+ };
data/app/kern/dispatch.js CHANGED
@@ -96,6 +96,16 @@ function int_dispatch(q) {
96
96
  gpu_q_rem -= n;
97
97
  }
98
98
 
99
+ //Send async queue
100
+ if (async_q.length > 0) {
101
+ var out = [5];
102
+ for (var i = 0; i < async_q.length; ++i) {
103
+ out.push.apply(out, async_q[i]);
104
+ }
105
+ dump.push(out);
106
+ async_q = [];
107
+ }
108
+
99
109
  if (dump.length != 0) {
100
110
  if_dispatch(dump);
101
111
  }
@@ -125,6 +135,8 @@ function ping3(arg1) {
125
135
  SEND("cpu", "pong3");
126
136
  } else if (arg1 == "gpu") {
127
137
  SEND("gpu", "pong3");
138
+ } else if (arg1 == "async") {
139
+ SEND("async", "pong3");
128
140
  }
129
141
  }
130
142
 
@@ -139,6 +151,8 @@ function ping4(arg1) {
139
151
  SEND("cpu", "pong4");
140
152
  } else if (arg1 == "gpu") {
141
153
  SEND("gpu", "pong4");
154
+ } else if (arg1 == "async") {
155
+ SEND("async", "pong4");
142
156
  }
143
157
  }
144
158
 
@@ -152,6 +166,7 @@ function ping4_int(arg1) {
152
166
  ++cpu_q_rem;
153
167
  } else if (arg1 == "gpu") {
154
168
  ++gpu_q_rem;
169
+ } else if (arg1 == "async") {
155
170
  }
156
171
  }
157
172
 
@@ -161,6 +176,7 @@ net_q = [];
161
176
  disk_q = [];
162
177
  cpu_q = [];
163
178
  gpu_q = [];
179
+ async_q = [];
164
180
 
165
181
  //Each queue has a max # of things that can be en-queued
166
182
  //These are decremented when the message is sent (not just queued)
@@ -5,6 +5,9 @@ function int_event(ep, event_name, info) {
5
5
  var f = evt[ep];
6
6
  if (f != undefined) {
7
7
  f(ep, event_name, info);
8
+ return true;
9
+ } else {
10
+ return false;
8
11
  }
9
12
  }
10
13
 
@@ -0,0 +1 @@
1
+ //Stub
@@ -0,0 +1,5 @@
1
+ //SEND("cpu", "if_timer_init", 4);
2
+
3
+ function int_timer() {
4
+ callout_wakeup();
5
+ }
@@ -0,0 +1,2 @@
1
+ <% if @defines['mem_pager'] %>
2
+ <% end %>
@@ -0,0 +1,66 @@
1
+ <% if @defines['sockio_pager'] %>
2
+ sockio_pager_data = {};
3
+
4
+ sockio_pager_sp = null;
5
+ sockio_pager_bp = null;
6
+ waiting_bp = null;
7
+ function sockio_pager_init(options) {
8
+ sockio_pager_sp = tels(1);
9
+ sockio_pager_bp = tels(1);
10
+ SEND("main", "if_sockio_init", options.url, sockio_pager_sp);
11
+ reg_evt(sockio_pager_bp, sockio_pager_sp_endpoint);
12
+ SEND("async", "if_sockio_fwd", sockio_pager_sp, "read_res", sockio_pager_bp);
13
+ SEND("async", "if_sockio_fwd", sockio_pager_sp, "notify", sockio_pager_bp);
14
+ }
15
+
16
+ function sockio_pager_read_sync(ns, bp, key) {
17
+ throw "sockio_pager does not support read_sync"
18
+ }
19
+
20
+ function sockio_pager_read(ns, bp, key) {
21
+ var info = {
22
+ key: key,
23
+ bp: bp
24
+ }
25
+
26
+ SEND("async", "if_sockio_send", sockio_pager_sp, "read", info);
27
+
28
+ waiting_bp = bp;
29
+ }
30
+
31
+ function sockio_pager_write(key, value) {
32
+ throw "sockio_pager does not support write"
33
+ }
34
+
35
+ //Where socket.io data comes in
36
+ function sockio_pager_sp_endpoint(ep, ename, info) {
37
+ if (ename === "read_res") {
38
+ var bp = info.bp;
39
+ var key = info.key;
40
+ var value = info.value;
41
+ int_event(waiting_bp, "read_res", info);
42
+ vm_cache_write("net", key, value);
43
+ } else if (ename === "notify") {
44
+ var key = info.key;
45
+ vm_notify("net", key);
46
+ }
47
+ }
48
+
49
+ function sockio_pager_watch(ns, key) {
50
+ var info = {
51
+ ns: ns,
52
+ key: key
53
+ }
54
+ SEND("async", "if_sockio_send", sockio_pager_sp, "watch", info);
55
+ }
56
+
57
+ function sockio_pager_unwatch(ns, key) {
58
+ var info = {
59
+ ns: ns,
60
+ key: key
61
+ }
62
+ SEND("async", "if_sockio_send", sockio_pager_sp, "unwatch", info);
63
+ }
64
+
65
+
66
+ <% end %>
@@ -0,0 +1,35 @@
1
+ <% if @debug %>
2
+ spec0_data = {};
3
+ spec0_read_count = 0;
4
+
5
+ function spec0_init(options) {
6
+ spec0_init_options = options;
7
+ }
8
+
9
+ function spec0_read_sync(ns, bp, key) {
10
+ spec0_read_count += 1;
11
+
12
+ var info = {
13
+ key: key,
14
+ value: spec0_data[key],
15
+ }
16
+ int_event(bp, "read_res", info);
17
+ //vm_cache[ns][key] = spec0_data[key];
18
+ }
19
+
20
+ function spec0_read(ns, bp, key) {
21
+ spec0_read_count += 1;
22
+
23
+ var info = {
24
+ key: key,
25
+ value: spec0_data[key],
26
+ }
27
+
28
+ int_event(bp, "read_res", info);
29
+ vm_cache_write(ns, key, spec0_data[key]);
30
+ }
31
+
32
+ function spec0_write(key, value) {
33
+ spec0_data[key] = value;
34
+ }
35
+ <% end %>
@@ -0,0 +1,24 @@
1
+ <% if @debug %>
2
+ spec1_value = "a";
3
+
4
+ function spec1_init(options) {
5
+ spec1_init_options = options;
6
+ }
7
+
8
+ function spec1_read_sync(ns, bp, key) {
9
+ throw "unsupported"
10
+ }
11
+
12
+ function spec1_read(ns, bp, key) {
13
+ var info = {
14
+ key: key,
15
+ value: spec1_value,
16
+ }
17
+
18
+ int_event(bp, "read_res", info);
19
+ vm_cache_write(ns, key, spec1_value);
20
+
21
+ //Now change the value
22
+ spec1_value = "b";
23
+ }
24
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <% if @debug %>
2
+ spec2_value = "a";
3
+
4
+ function spec2_init(options) {
5
+ spec2_init_options = options;
6
+ }
7
+
8
+ function spec2_read_sync(ns, bp, key) {
9
+ throw "unsupported"
10
+ }
11
+
12
+ function spec2_read(ns, bp, key) {
13
+ var info = {
14
+ key: key,
15
+ value: spec2_value,
16
+ }
17
+
18
+ int_event(bp, "read_res", info);
19
+ vm_cache_write(ns, key, spec2_value);
20
+
21
+ //Now change the value
22
+ spec2_value = "b";
23
+ }
24
+
25
+ function spec2_watch(ns, key) {
26
+ }
27
+
28
+ function spec2_spec_trigger() {
29
+ vm_notify("user", "my_key");
30
+ }
31
+ <% end %>