rsence 2.1.2 → 2.1.3
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.
- data/VERSION +1 -1
- data/js/comm/transporter/transporter.js +61 -4
- data/js/comm/values/values.js +62 -0
- data/js/foundation/json_renderer/json_renderer.js +5 -2
- data/lib/session/msg.rb +28 -16
- data/lib/values/hvalue.rb +3 -133
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.3
|
@@ -27,7 +27,8 @@ COMM.Transporter = HApplication.extend({
|
|
27
27
|
**/
|
28
28
|
constructor: function(){
|
29
29
|
var _this = this;
|
30
|
-
|
30
|
+
_this._detectNativeJSONSupport();
|
31
|
+
_this.serverLostMessage = 'Server Connection Lost: Reconnecting...';
|
31
32
|
_this.label = 'Transporter';
|
32
33
|
_this.url = false;
|
33
34
|
_this.busy = false;
|
@@ -37,6 +38,17 @@ COMM.Transporter = HApplication.extend({
|
|
37
38
|
_this._busyFlushTimeout = false;
|
38
39
|
_this.base(1);
|
39
40
|
},
|
41
|
+
|
42
|
+
_detectNativeJSONSupport: function(){
|
43
|
+
if(window['JSON']){
|
44
|
+
var
|
45
|
+
_JSON = window.JSON,
|
46
|
+
_fun = 'function';
|
47
|
+
if((typeof _JSON['parse'] === _fun) && (typeof _JSON['stringify'] === _fun)){
|
48
|
+
this.parseResponseArray = this._nativeParseResponseArray;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
},
|
40
52
|
|
41
53
|
/** Tries to (re)connect to the server as often as possible,
|
42
54
|
* mandated essentially by the priority of its
|
@@ -64,6 +76,49 @@ COMM.Transporter = HApplication.extend({
|
|
64
76
|
COMM.Values._encodeString(_this._clientEvalError):'';
|
65
77
|
},
|
66
78
|
|
79
|
+
parseResponseArray: function( _responseText ){
|
80
|
+
var _arr = eval( _responseText );
|
81
|
+
return _arr;
|
82
|
+
},
|
83
|
+
|
84
|
+
_nativeParseResponseArray: function( _responseText ){
|
85
|
+
var _arr = JSON.parse( _responseText );
|
86
|
+
return _arr;
|
87
|
+
},
|
88
|
+
|
89
|
+
setValues: function( _values ){
|
90
|
+
if(!_values instanceof Object){
|
91
|
+
console.log("Invalid values block: ", _values );
|
92
|
+
return;
|
93
|
+
}
|
94
|
+
var
|
95
|
+
i = 0,
|
96
|
+
_valueManager = COMM.Values,
|
97
|
+
_itemtype,
|
98
|
+
_valueId,
|
99
|
+
_valueData;
|
100
|
+
if(_values['new'] instanceof Array){
|
101
|
+
for(i=0;i<_values['new'].length;i++){
|
102
|
+
_valueId = _values['new'][i][0];
|
103
|
+
_valueData = _values['new'][i][1];
|
104
|
+
_valueManager.create( _valueId, _valueData );
|
105
|
+
}
|
106
|
+
}
|
107
|
+
if(_values['set'] instanceof Array){
|
108
|
+
for(i=0;i<_values['set'].length;i++){
|
109
|
+
_valueId = _values['set'][i][0];
|
110
|
+
_valueData = _values['set'][i][1];
|
111
|
+
_valueManager.s( _valueId, _valueData );
|
112
|
+
}
|
113
|
+
}
|
114
|
+
if(_values['del'] instanceof Array){
|
115
|
+
for(i=0;i<_values['del'].length;i++){
|
116
|
+
_valueId = _values['del'][i];
|
117
|
+
_valueManager.del( _valueId );
|
118
|
+
}
|
119
|
+
}
|
120
|
+
},
|
121
|
+
|
67
122
|
/** = Description
|
68
123
|
* Handles synchronization responses.
|
69
124
|
*
|
@@ -83,10 +138,11 @@ COMM.Transporter = HApplication.extend({
|
|
83
138
|
_this.failure(resp);
|
84
139
|
return;
|
85
140
|
}
|
86
|
-
var _responseArray =
|
87
|
-
i =
|
141
|
+
var _responseArray = _this.parseResponseArray(resp.X.responseText),
|
142
|
+
i = 2,
|
88
143
|
_responseArrayLen = _responseArray.length,
|
89
144
|
_sesKey = _responseArray[0],
|
145
|
+
_values = _responseArray[1],
|
90
146
|
_session = COMM.Session,
|
91
147
|
_queue = COMM.Queue;
|
92
148
|
if(_sesKey === ''){
|
@@ -95,6 +151,7 @@ COMM.Transporter = HApplication.extend({
|
|
95
151
|
else {
|
96
152
|
_session.newKey(_sesKey);
|
97
153
|
}
|
154
|
+
_this.setValues( _values );
|
98
155
|
for(;i<_responseArrayLen;i++){
|
99
156
|
try {
|
100
157
|
_queue.pushEval( _responseArray[i] );
|
@@ -123,7 +180,7 @@ COMM.Transporter = HApplication.extend({
|
|
123
180
|
failMessage: function(_title,_message){
|
124
181
|
var _this = COMM.Transporter,
|
125
182
|
_queue = COMM.Queue;
|
126
|
-
console.log('failMessage
|
183
|
+
console.log('failMessage title:',_title,', message:',_message);
|
127
184
|
_this.stop = true;
|
128
185
|
_queue.push(function(){jsLoader.load('default_theme');});
|
129
186
|
_queue.push(function(){jsLoader.load('controls');});
|
data/js/comm/values/values.js
CHANGED
@@ -322,6 +322,11 @@ COMM.Values = HClass.extend({
|
|
322
322
|
return _str;
|
323
323
|
},
|
324
324
|
|
325
|
+
_nativeEncode: function(_obj){
|
326
|
+
return JSON.stringify( _obj );
|
327
|
+
},
|
328
|
+
|
329
|
+
|
325
330
|
/** = Description
|
326
331
|
* Decodes a JSON object. Decodes url-encoded strings contained.
|
327
332
|
*
|
@@ -355,6 +360,29 @@ COMM.Values = HClass.extend({
|
|
355
360
|
return _obj;
|
356
361
|
},
|
357
362
|
|
363
|
+
_nativeDecode: function(_ibj){
|
364
|
+
var _obj, _type, _this = this;
|
365
|
+
if(_ibj !== null && _ibj !== undefined){
|
366
|
+
_type = _this.type(_ibj);
|
367
|
+
if(!_type){
|
368
|
+
return null;
|
369
|
+
}
|
370
|
+
switch(_type){
|
371
|
+
case 'b': _obj = _ibj; break;
|
372
|
+
case 'n': _obj = _ibj; break;
|
373
|
+
case 's': _obj = _this._decodeString(_ibj); break;
|
374
|
+
case 'd': _obj = _ibj; break;
|
375
|
+
case 'a': _obj = JSON.parse(_ibj); break;
|
376
|
+
case 'h': _obj = JSON.parse(_ibj); break;
|
377
|
+
default: _obj = null; break;
|
378
|
+
}
|
379
|
+
}
|
380
|
+
else {
|
381
|
+
return null;
|
382
|
+
}
|
383
|
+
return _obj;
|
384
|
+
},
|
385
|
+
|
358
386
|
/** = Description
|
359
387
|
* Makes a deep copy of the object.
|
360
388
|
*
|
@@ -408,6 +436,24 @@ COMM.Values = HClass.extend({
|
|
408
436
|
}
|
409
437
|
},
|
410
438
|
|
439
|
+
_nativeClone: function( _obj ){
|
440
|
+
if(_obj === null){
|
441
|
+
return null;
|
442
|
+
}
|
443
|
+
else if (_obj === undefined){
|
444
|
+
console.log('Undefined object, supplementing with null.');
|
445
|
+
return null;
|
446
|
+
}
|
447
|
+
if( (_obj instanceof Array) || (_obj instanceof Object) ){
|
448
|
+
// conversion via encoding/decoding via JSON string.
|
449
|
+
return JSON.parse( JSON.stringify( _obj ) );
|
450
|
+
}
|
451
|
+
else {
|
452
|
+
// no conversion needed (numbers, strings, booleans etc..)
|
453
|
+
return _obj;
|
454
|
+
}
|
455
|
+
},
|
456
|
+
|
411
457
|
/** = Description
|
412
458
|
* Returns an URI-encoded string representation of all the changed values to
|
413
459
|
* synchronize to the server.
|
@@ -431,9 +477,25 @@ COMM.Values = HClass.extend({
|
|
431
477
|
_syncValues[_id] = _value;
|
432
478
|
}
|
433
479
|
return encodeURIComponent(_this.encode(_syncValues));
|
480
|
+
},
|
481
|
+
|
482
|
+
_detectNativeJSONSupport: function(){
|
483
|
+
if(window['JSON']){
|
484
|
+
var
|
485
|
+
_JSON = window.JSON,
|
486
|
+
_fun = 'function';
|
487
|
+
if((typeof _JSON['parse'] === _fun) && (typeof _JSON['stringify'] === _fun)){
|
488
|
+
// console.log('Has native JSON support. Re-routing encode, decode and clone methods of COMM.Values...');
|
489
|
+
this.clone = this._nativeClone;
|
490
|
+
this.encode = this._nativeEncode;
|
491
|
+
// this.decode = this._nativeDecode;
|
492
|
+
}
|
493
|
+
}
|
434
494
|
}
|
435
495
|
});
|
436
496
|
|
497
|
+
COMM.Values._detectNativeJSONSupport();
|
498
|
+
|
437
499
|
// Backwards compatibility assignment for code that still
|
438
500
|
// uses HVM as a reference of the Value Manager:
|
439
501
|
HVM = COMM.Values;
|
@@ -24,7 +24,7 @@
|
|
24
24
|
//var//RSence.Foundation
|
25
25
|
COMM.JSONRenderer = HClass.extend({
|
26
26
|
|
27
|
-
version: 0.
|
27
|
+
version: 0.8,
|
28
28
|
|
29
29
|
/** = Description
|
30
30
|
* Renders JSON structured data, see some of the demos for usage examples.
|
@@ -77,7 +77,10 @@ COMM.JSONRenderer = HClass.extend({
|
|
77
77
|
for( _key in _definition ){
|
78
78
|
if( _reserved.indexOf( _key ) === -1 ){
|
79
79
|
_value = _definition[_key];
|
80
|
-
|
80
|
+
if( typeof _value === 'string' ){
|
81
|
+
_value = this.extEval( _value );
|
82
|
+
}
|
83
|
+
_extension[_key] = _value;
|
81
84
|
}
|
82
85
|
}
|
83
86
|
_scope[ _className ] = _extend.extend( _extension );
|
data/lib/session/msg.rb
CHANGED
@@ -111,7 +111,11 @@ module RSence
|
|
111
111
|
@options = options
|
112
112
|
|
113
113
|
# Value response output.
|
114
|
-
@value_buffer =
|
114
|
+
@value_buffer = {
|
115
|
+
:new => [],
|
116
|
+
:set => [],
|
117
|
+
:del => []
|
118
|
+
}
|
115
119
|
|
116
120
|
# The session key placeholder.
|
117
121
|
@ses_key = false
|
@@ -238,21 +242,22 @@ module RSence
|
|
238
242
|
if not @response_success
|
239
243
|
@response.status = 200
|
240
244
|
#@response.status = 503
|
241
|
-
|
245
|
+
|
242
246
|
buffer = [
|
243
|
-
"" # empty session key will stop the syncing
|
247
|
+
"", # empty session key will stop the syncing
|
248
|
+
{}, # no session values
|
244
249
|
] + @error_js
|
245
250
|
else
|
246
251
|
## The response status should always be 200 (OK)
|
247
252
|
@response.status = 200
|
248
|
-
|
249
|
-
buffer =
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
253
|
+
|
254
|
+
buffer = [
|
255
|
+
@ses_key,
|
256
|
+
@value_buffer,
|
257
|
+
] + @buffer
|
258
|
+
|
254
259
|
end
|
255
|
-
|
260
|
+
|
256
261
|
# flush the output
|
257
262
|
if @do_gzip
|
258
263
|
outp = GZString.new('')
|
@@ -262,13 +267,13 @@ module RSence
|
|
262
267
|
else
|
263
268
|
outp = buf_json(buffer)
|
264
269
|
end
|
265
|
-
|
270
|
+
|
266
271
|
@response['content-length'] = outp.size
|
267
272
|
@response.body = outp
|
268
|
-
|
273
|
+
|
269
274
|
@response_sent = true
|
270
275
|
end
|
271
|
-
|
276
|
+
|
272
277
|
# Sends data to the client, usually javascript, but is valid for any data that responds to #to_json
|
273
278
|
# @param [String<js>, #to_json] data Javascript source or object that responds to #to_json
|
274
279
|
# @param [Boolean] dont_squeeze When true, doesn't `squeeze` the contents (jsmin + jscompress)
|
@@ -280,9 +285,16 @@ module RSence
|
|
280
285
|
end
|
281
286
|
|
282
287
|
# @private For value manager; insert changed values BEFORE other js.
|
283
|
-
def reply_value(data)
|
284
|
-
|
285
|
-
|
288
|
+
def reply_value( operation_type, value_id, data=nil )
|
289
|
+
if operation_type == :set
|
290
|
+
@value_buffer[:set].push( [ value_id, data ] )
|
291
|
+
elsif operation_type == :new
|
292
|
+
@value_buffer[:new].push( [ value_id, data ] )
|
293
|
+
elsif operation_type == :del
|
294
|
+
@value_buffer[:del].push( value_id )
|
295
|
+
else
|
296
|
+
throw "Invalid reply_value operation: operation_type: #{operation_type.inspect}, value_id: #{value_id.inspect}, data: #{data.inspect}"
|
297
|
+
end
|
286
298
|
end
|
287
299
|
|
288
300
|
# Sends data to the client's javascript console.
|
data/lib/values/hvalue.rb
CHANGED
@@ -248,12 +248,11 @@ module RSence
|
|
248
248
|
def to_client( msg )
|
249
249
|
if @is_new_to_client
|
250
250
|
## Initialize a new client value
|
251
|
-
|
252
|
-
msg.reply_value( init_str )
|
251
|
+
msg.reply_value( :new, @value_id, @data )
|
253
252
|
@is_new_to_client = false
|
254
253
|
else
|
255
254
|
## Sets the client value
|
256
|
-
msg.reply_value
|
255
|
+
msg.reply_value( :set, @value_id, @data )
|
257
256
|
end
|
258
257
|
end
|
259
258
|
|
@@ -270,142 +269,13 @@ module RSence
|
|
270
269
|
session_values.delete( @value_id )
|
271
270
|
|
272
271
|
if msg and not @is_new_to_client
|
273
|
-
msg.reply_value(
|
272
|
+
msg.reply_value( :del, @value_id )
|
274
273
|
end
|
275
274
|
end
|
276
275
|
alias die die!
|
277
276
|
|
278
277
|
end
|
279
278
|
|
280
|
-
|
281
|
-
=begin
|
282
|
-
class UploadValue < HValue
|
283
|
-
|
284
|
-
@state_responders = {
|
285
|
-
:ready => [], # id == 0
|
286
|
-
:started => [], # id == 1
|
287
|
-
:process => [], # id == 2 ; also uses bind
|
288
|
-
3 => [], # id == 3
|
289
|
-
4 => [], # id == 4
|
290
|
-
:error => [] # id < 0
|
291
|
-
}
|
292
|
-
|
293
|
-
@upload_state = 0
|
294
|
-
@upload_key = ''
|
295
|
-
@uploads = []
|
296
|
-
|
297
|
-
# the data should contain both state and key in the value
|
298
|
-
def from_client( msg, data )
|
299
|
-
|
300
|
-
## change the valid state, because the value was set by the client!
|
301
|
-
@is_valid = data.include?(':::')
|
302
|
-
|
303
|
-
# the state and key are separated by the ':::' delimiter string
|
304
|
-
if @is_valid
|
305
|
-
|
306
|
-
# split state and key using the delimiter
|
307
|
-
(upload_state, upload_key) = data.split(':::')
|
308
|
-
|
309
|
-
# the state is a number
|
310
|
-
upload_state = upload_state.to_i
|
311
|
-
|
312
|
-
@upload_state = upload_state
|
313
|
-
@upload_key = upload_key
|
314
|
-
|
315
|
-
# negative states are errors
|
316
|
-
if upload_state < 0
|
317
|
-
# "upload error: #{upload_state}"
|
318
|
-
# (parse the error)
|
319
|
-
unless @state_responders[:error].empty?
|
320
|
-
@state_responders[:error].each do |plugin_name,method_name|
|
321
|
-
msg.run( plugin_name,method_name,msg,self,upload_state )
|
322
|
-
end
|
323
|
-
end
|
324
|
-
|
325
|
-
# the default state, 0 means the UI is ready to send an
|
326
|
-
# upload and ticketserve is ready to receive it
|
327
|
-
elsif upload_state == 0
|
328
|
-
# "upload state: ready to upload."
|
329
|
-
# (do nothing)
|
330
|
-
|
331
|
-
unless @state_responders[:ready].empty?
|
332
|
-
@state_responders[:ready].each do |plugin_name,method_name|
|
333
|
-
msg.run( plugin_name,method_name,msg,self,upload_state )
|
334
|
-
end
|
335
|
-
end
|
336
|
-
|
337
|
-
# this state means the upload's transfer is started and progressing
|
338
|
-
elsif upload_state == 1
|
339
|
-
# "upload state: upload started."
|
340
|
-
# (show progress bar)
|
341
|
-
|
342
|
-
unless @state_responders[:started].empty?
|
343
|
-
@state_responders[:started].each do |plugin_name,method_name|
|
344
|
-
msg.run( plugin_name,method_name,msg,self,upload_state )
|
345
|
-
end
|
346
|
-
end
|
347
|
-
|
348
|
-
# this state means the upload's transfer is complete,
|
349
|
-
# but the uploaded data hasn't been handled yet.
|
350
|
-
elsif upload_state == 2
|
351
|
-
# "upload state: waiting to process."
|
352
|
-
|
353
|
-
uploads = msg.plugins[:ticketservices].get_uploads(upload_key,true)
|
354
|
-
if uploads.size == 1
|
355
|
-
uploaded_data = uploads[0]
|
356
|
-
|
357
|
-
# only process changes, if different from the one already stored.
|
358
|
-
if uploaded_data != @data
|
359
|
-
|
360
|
-
@data = uploaded_data
|
361
|
-
|
362
|
-
## add the id to the values to be checked
|
363
|
-
check_ids = msg.session[:values][:check]
|
364
|
-
unless check_ids.include?( @value_id )
|
365
|
-
check_ids.push( @value_id )
|
366
|
-
end
|
367
|
-
|
368
|
-
end
|
369
|
-
msg.plugins[:ticketservices].del_uploads(upload_key,msg.ses_id)
|
370
|
-
else
|
371
|
-
# "upload, amount of uploads: #{uploads.size}"
|
372
|
-
end
|
373
|
-
|
374
|
-
#
|
375
|
-
hvalue.set(msg,"3:::#{upload_key}")
|
376
|
-
|
377
|
-
msg.console( "upload state: set to ack" )
|
378
|
-
|
379
|
-
elsif upload_state == 3
|
380
|
-
# "upload state: waiting for user ack."
|
381
|
-
# (do nothing)
|
382
|
-
|
383
|
-
msg.console( "upload state: waiting user ack" )
|
384
|
-
|
385
|
-
|
386
|
-
elsif upload_state == 4
|
387
|
-
# "upload state: user wants to upload again."
|
388
|
-
# (set a new upload key, )
|
389
|
-
|
390
|
-
msg.console( "upload state: ack, getting new key" )
|
391
|
-
|
392
|
-
|
393
|
-
setup_upload( msg, hvalue )
|
394
|
-
|
395
|
-
|
396
|
-
else
|
397
|
-
# "upload unknown state: #{upload_state.inspect}"
|
398
|
-
end
|
399
|
-
end
|
400
|
-
return true
|
401
|
-
end
|
402
|
-
def setup_upload(msg,hvalue,size_bytes=500*1024,accept_mime=/image\/(.*?)/,allow_multi=false)
|
403
|
-
upload_key = msg.plugins[:ticketservices].upload_key(msg,hvalue.val_id,size_bytes,accept_mime,allow_multi)
|
404
|
-
hvalue.set( msg, upload_key )
|
405
|
-
end
|
406
|
-
end
|
407
|
-
=end
|
408
|
-
|
409
279
|
end
|
410
280
|
|
411
281
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsence
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 2.1.
|
9
|
+
- 3
|
10
|
+
version: 2.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Riassence Inc.
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-12-
|
18
|
+
date: 2010-12-12 00:00:00 +02:00
|
19
19
|
default_executable: rsence
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|