sdc_client 0.58.5 → 0.158.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.
Files changed (39) hide show
  1. package/.github/workflows/node.js.yml +2 -2
  2. package/.idea/inspectionProfiles/Project_Default.xml +17 -0
  3. package/.idea/workspace.xml +122 -23
  4. package/.readthedocs.yaml +13 -0
  5. package/dist/index.js +70 -51
  6. package/dist/ugly.index.js +1 -1
  7. package/docs/api-reference.rst +225 -0
  8. package/docs/conf.py +11 -0
  9. package/docs/controllers.rst +228 -0
  10. package/docs/events-and-dom.rst +120 -0
  11. package/docs/getting-started.rst +143 -0
  12. package/docs/index.rst +22 -0
  13. package/docs/models.rst +351 -0
  14. package/docs/overview.rst +66 -0
  15. package/docs/requirements.txt +1 -0
  16. package/eslint.config.js +60 -0
  17. package/gulp/gulp.jsx +15 -13
  18. package/package.json +13 -3
  19. package/src/index.js +44 -11
  20. package/src/simpleDomControl/AbstractSDC.js +287 -286
  21. package/src/simpleDomControl/sdc_controller.js +157 -132
  22. package/src/simpleDomControl/sdc_dom_events.js +99 -88
  23. package/src/simpleDomControl/sdc_events.js +39 -40
  24. package/src/simpleDomControl/sdc_main.js +88 -67
  25. package/src/simpleDomControl/sdc_model.js +1510 -0
  26. package/src/simpleDomControl/sdc_params.js +44 -29
  27. package/src/simpleDomControl/sdc_server_call.js +153 -154
  28. package/src/simpleDomControl/sdc_socket.js +8 -821
  29. package/src/simpleDomControl/sdc_test_utils.js +77 -80
  30. package/src/simpleDomControl/sdc_utils.js +295 -176
  31. package/src/simpleDomControl/sdc_view.js +245 -177
  32. package/test/model.test.js +332 -0
  33. package/test/models/Author.js +145 -0
  34. package/test/models/Book.js +112 -0
  35. package/test/models/BookContent.js +114 -0
  36. package/test/models/SdcUser.js +75 -0
  37. package/test/models/src.js +8 -0
  38. package/test/sdc_model_dates.ai.test.js +57 -0
  39. package/test/sdc_server_call.ai.test.js +267 -0
@@ -1,829 +1,16 @@
1
- import {app} from './sdc_main.js';
2
- import {trigger} from "./sdc_events.js";
3
- import {uuidv4} from "./sdc_utils.js";
1
+ const registeredModels = {};
4
2
 
5
- const MAX_FILE_UPLOAD = 25000;
6
3
 
7
-
8
- class SubModel {
9
-
10
- constructor(pk, model) {
11
- this.pk = pk;
12
- this._model = model;
13
- }
14
-
15
- /**
16
- * SDC Model Name
17
- * @param {string} model
18
- */
19
- set model(model) {
20
- this._model = model;
21
- }
22
-
23
- get model() {
24
- return this._model;
25
- }
26
-
27
- /**
28
- * Load the sub model.
29
- *
30
- * @param {AbstractSDC} controller
31
- * @returns {Model}
32
- */
33
- load(controller) {
34
- if (!this._model) {
35
- throw new TypeError("Model is not set!!");
36
- }
37
- if (this.pk instanceof Array) {
38
- return controller.newModel(this._model, {pk__in: this.pk});
39
- }
40
- return controller.newModel(this._model, {pk: this.pk});
41
- }
42
- }
43
-
44
- const ModelProxyHandler = {
45
- get(target, key) {
46
- const value = target[key] ?? undefined;
47
- if (value instanceof SubModel) {
48
- if (!value.pk && value.pk !== 0) {
49
- return null
50
- }
51
- let newVal;
52
- if (value.pk instanceof Array) {
53
- newVal = value.pk.slice();
54
- } else {
55
- newVal = new Number(value.pk);
56
- }
57
- newVal.load = value.load.bind(value);
58
- return newVal;
59
- }
60
- return value;
61
- },
62
- set(target, key, value) {
63
- if (key in target) {
64
- const oldVal = target[key];
65
- if (oldVal instanceof SubModel) {
66
- if (value.hasOwnProperty('pk')) {
67
- oldVal.pk = value.pk;
68
- } else {
69
- try {
70
- oldVal.pk = JSON.parse(value);
71
- } catch {
72
- oldVal.pk = value;
73
- }
74
-
75
- }
76
- } else {
77
- target[key] = value;
78
- }
79
- } else {
80
- target[key] = value;
81
- }
82
- return true;
83
- }
4
+ function registerModel(name, classObj) {
5
+ registeredModels[name] = classObj;
84
6
  }
85
7
 
86
-
87
- function parse_hidden_inputs(value) {
88
-
89
- let isFloatReg = /^-?\d+\.?\d+$/;
90
- let isIntReg = /^-?\d+$/;
91
- let isBoolReg = /^(true|false)$/;
92
- let isStringReg = /^(['][^']*['])|(["][^"]*["])$/;
93
-
94
-
95
- if (value.toLowerCase().match(isBoolReg)) {
96
- return value.toLowerCase() === 'true';
97
- } else if (value === 'undefined') {
98
- return undefined;
99
- } else if (value.toLowerCase() === 'none') {
100
- return null;
101
- } else if (value.match(isIntReg)) {
102
- return parseInt(value);
103
- } else if (value.match(isFloatReg)) {
104
- return parseFloat(value);
105
- } else if (value.match(isStringReg)) {
106
- return value.substring(1, value.length - 1);
107
- }
108
- return value;
8
+ function getModel(name) {
9
+ return registeredModels[name];
109
10
  }
110
11
 
111
12
 
112
- export class Model {
113
- /**
114
- *
115
- * @param model_name {string}
116
- * @param model_query {json}
117
- */
118
- constructor(model_name, model_query = {}) {
119
- this._onNoOpenRequests = [];
120
- this.values_list = [];
121
- this.values = {};
122
- this.model_name = model_name;
123
- this.model_query = model_query;
124
- this._is_connected = false;
125
- this._is_conneting_process = false;
126
- this._auto_reconnect = true;
127
- this.socket = null;
128
- this.open_request = {};
129
- this.on_update = () => {
130
- };
131
- this.on_create = () => {
132
- };
133
-
134
- this.form_id = uuidv4();
135
- }
136
-
137
- [Symbol.iterator]() {
138
- let idx = -1;
139
- return {
140
- next: () => {
141
- ++idx;
142
- if (idx < this.values_list.length) {
143
- return {value: this.values_list[idx], done: false};
144
- }
145
- return {value: null, done: true};
146
- }
147
- };
148
- }
149
-
150
- length() {
151
- return this.values_list.length;
152
- }
153
-
154
- byPk(pk) {
155
- if (pk !== null) {
156
- pk = parseInt(pk);
157
- if (isNaN(pk)) {
158
- pk = -1;
159
- }
160
- let elem = this.values_list.find(elm => elm.pk === pk);
161
- if (!elem) {
162
- elem = new Proxy({pk: pk}, ModelProxyHandler);
163
- this.values_list.push(elem);
164
- }
165
- return elem;
166
- }
167
- return {pk: pk};
168
-
169
- }
170
-
171
- filter(model_query) {
172
- this.model_query = Object.assign({}, this.model_query, model_query);
173
- return this;
174
- }
175
-
176
- load() {
177
- return this.isConnected().then(() => {
178
- const id = uuidv4();
179
- return new Promise((resolve, reject) => {
180
- this.socket.send(JSON.stringify({
181
- event: 'model',
182
- event_type: 'load',
183
- event_id: id,
184
- args: {
185
- model_name: this.model_name,
186
- model_query: this.model_query
187
- }
188
- }));
189
-
190
- this.open_request[id] = [resolve, reject];
191
- });
192
- });
193
- }
194
-
195
- listView(filter = {}, cbResolve = null, cbReject = null, templateContext = {}) {
196
- return this.view({filter, cbResolve, cbReject, templateContext, event_type: 'list_view'})
197
- }
198
-
199
- view({
200
- viewName = 'html_list_template',
201
- filter = {},
202
- cbResolve = null,
203
- cbReject = null,
204
- templateContext = {},
205
- event_type = 'named_view'
206
- }) {
207
- let $div_list = $('<div class="container-fluid">');
208
- this.isConnected().then(() => {
209
- const id = uuidv4();
210
- this.socket.send(JSON.stringify({
211
- event: 'model',
212
- event_type,
213
- event_id: id,
214
- args: {
215
- view_name: viewName,
216
- model_name: this.model_name,
217
- model_query: this.model_query,
218
- filter,
219
- template_context: templateContext
220
- }
221
- }));
222
-
223
- this.open_request[id] = [(data) => {
224
- $div_list.append(data.html);
225
- app.refresh($div_list);
226
- cbResolve && cbResolve(data);
227
- }, (res) => {
228
- cbReject && cbReject(res);
229
- }];
230
-
231
- });
232
-
233
- return $div_list;
234
- }
235
-
236
- detailView(pk = null, cb_resolve = null, cb_reject = null, template_context = {}) {
237
- pk = pk ?? -1;
238
- pk = parseInt(pk);
239
- if (isNaN(pk)) {
240
- pk = -1;
241
- }
242
- let $div_list = $('<div class="container-fluid">');
243
-
244
- let load_promise;
245
- if (this.values_list.length !== 0) {
246
- load_promise = this.isConnected();
247
- } else {
248
- load_promise = this.load();
249
- }
250
-
251
- load_promise.then(() => {
252
- if (pk === -1) {
253
- pk = this.values_list[0].pk
254
- }
255
- const id = uuidv4();
256
- this.socket.send(JSON.stringify({
257
- event: 'model',
258
- event_type: 'detail_view',
259
- event_id: id,
260
- args: {
261
- model_name: this.model_name,
262
- model_query: this.model_query,
263
- pk,
264
- template_context
265
- }
266
- }));
267
-
268
- this.open_request[id] = [(data) => {
269
- $div_list.append(data.html);
270
- app.refresh($div_list);
271
- cb_resolve && cb_resolve(data);
272
- }, (res) => {
273
- cb_reject && cb_reject(res);
274
- }];
275
-
276
- });
277
-
278
- return $div_list;
279
- }
280
-
281
- syncFormToModel($forms) {
282
- return this.syncForm($forms);
283
- }
284
-
285
- syncModelToForm($forms) {
286
- if (!$forms || !$forms.hasClass(this.form_id)) {
287
- $forms = $(`.${this.form_id}`);
288
- }
289
-
290
- let self = this;
291
- $forms.each(function () {
292
- if (!this.hasAttribute('data-model_pk')) {
293
- return;
294
- }
295
- let pk = $(this).data('model_pk');
296
- let instance = self.byPk(pk);
297
- for (let form_item of this.elements) {
298
- let name = form_item.name;
299
- if (name && name !== '') {
300
- if (form_item.type === 'checkbox') {
301
- form_item.checked = instance[name];
302
- } else if (form_item.type === 'file' && instance[name] instanceof File) {
303
- let container = new DataTransfer();
304
- container.items.add(instance[name]);
305
- form_item.files = container;
306
- } else {
307
- $(form_item).val(instance[name]);
308
- }
309
- }
310
- }
311
- });
312
-
313
- }
314
-
315
- syncForm($forms) {
316
- if (!$forms || !$forms.hasClass(this.form_id)) {
317
- $forms = $(`.${this.form_id}`);
318
- }
319
-
320
- const self = this;
321
- let instances = [];
322
-
323
- $forms.each(function () {
324
- let $form = $(this);
325
- let pk = $form.data('model_pk');
326
- let instance = self.byPk(pk);
327
- for (let form_item of this.elements) {
328
- let name = form_item.name;
329
- if (name && name !== '') {
330
- if (form_item.type === 'hidden') {
331
- instance[name] = parse_hidden_inputs($(form_item).val());
332
- } else if (form_item.type === 'checkbox') {
333
- instance[name] = form_item.checked;
334
- } else if (form_item.type === 'file') {
335
- instance[name] = form_item.files[0];
336
- } else {
337
- instance[name] = $(form_item).val();
338
- }
339
- }
340
- }
341
-
342
- instances.push(instance);
343
- return instance;
344
- });
345
-
346
- if (this.values_list.length <= 1 && instances.length > 0) {
347
- this.values = instances.at(-1);
348
- }
349
-
350
- return instances;
351
-
352
- }
353
-
354
- createForm(cb_resolve = null, cb_reject = null) {
355
- let $div_form = $('<div>');
356
- this.isConnected().then(() => {
357
- this._getForm(null, 'create_form', null, $div_form, cb_resolve, cb_reject);
358
- });
359
-
360
- return $div_form;
361
- }
362
-
363
- editForm(pk = -1, cb_resolve = null, cb_reject = null) {
364
- pk = parseInt(pk);
365
- if (isNaN(pk)) {
366
- pk = -1;
367
- }
368
- let load_promise;
369
- if (this.values_list.length !== 0) {
370
- load_promise = this.isConnected();
371
- } else {
372
- load_promise = this.load();
373
- }
374
-
375
- let $div_form = $('<div>');
376
-
377
- load_promise.then(() => {
378
- if (pk <= -1) {
379
- pk = this.values_list.at(pk).pk;
380
- }
381
-
382
- this._getForm(pk, 'edit_form', null, $div_form, cb_resolve, cb_reject);
383
- });
384
-
385
- return $div_form;
386
- }
387
-
388
- namedForm(pk = -1, formName, cb_resolve = null, cb_reject = null) {
389
- pk = parseInt(pk);
390
- if (isNaN(pk)) {
391
- pk = -1;
392
- }
393
- let load_promise;
394
- if (this.values_list.length !== 0) {
395
- load_promise = this.isConnected();
396
- } else {
397
- load_promise = this.load();
398
- }
399
-
400
- let $div_form = $('<div class="container-fluid">');
401
-
402
- load_promise.then(() => {
403
- if (pk <= -1) {
404
- pk = this.values_list.at(pk).pk;
405
- }
406
-
407
- this._getForm(pk, 'named_form', formName, $div_form, cb_resolve, cb_reject);
408
- });
409
-
410
- return $div_form;
411
- }
412
-
413
-
414
- _getForm(pk, event_type, formName, $div_form, cb_resolve, cb_reject) {
415
- pk = parseInt(pk);
416
- if (isNaN(pk)) {
417
- pk = -1;
418
- }
419
- const id = uuidv4();
420
- this.socket.send(JSON.stringify({
421
- event: 'model',
422
- event_type: event_type,
423
- event_id: id,
424
- args: {
425
- model_name: this.model_name,
426
- model_query: this.model_query,
427
- pk: pk,
428
- form_name: formName
429
- }
430
- }));
431
-
432
- const className = pk === null || pk === -1 ? 'create' : 'edit';
433
-
434
- this.open_request[id] = [(data) => {
435
- $div_form.append(data.html);
436
- let $form = $div_form.closest('form')
437
- .addClass(`sdc-model-${className}-form sdc-model-form ${this.form_id}`)
438
- .data('model', this)
439
- .data('model_pk', pk)
440
- .data('form_name', formName);
441
- if ($form.length > 0 && !$form[0].hasAttribute('sdc_submit')) {
442
- $form.attr('sdc_submit', 'submitModelFormDistributor')
443
- }
444
-
445
- app.refresh($div_form);
446
- cb_resolve && cb_resolve(data);
447
- }, (res) => {
448
- cb_reject && cb_reject(res);
449
- }];
450
- }
451
-
452
- new() {
453
- return new Promise((resolve, reject) => {
454
- const $form = $('<form>').append(this.createForm(() => {
455
- this.syncFormToModel($form);
456
- resolve();
457
- }, reject));
458
- })
459
- }
460
-
461
- save(pk = -1, fromName = 'edit_form') {
462
- pk = parseInt(pk);
463
- if (isNaN(pk)) {
464
- pk = -1;
465
- }
466
- return this.isConnected().then(() => {
467
- let elem_list;
468
- if (pk > -1) {
469
- elem_list = [this.byPk(pk)];
470
- } else {
471
- elem_list = this.values_list;
472
- }
473
- let p_list = []
474
- elem_list.forEach((elem) => {
475
- const id = uuidv4();
476
- p_list.push(new Promise((resolve, reject) => {
477
- this._readFiles(elem).then((files) => {
478
- this.socket.send(JSON.stringify({
479
- event: 'model',
480
- event_type: 'save',
481
- event_id: id,
482
- args: {
483
- form_name: fromName,
484
- model_name: this.model_name,
485
- model_query: this.model_query,
486
- data: elem,
487
- files: files
488
- }
489
- }));
490
-
491
- this.open_request[id] = [(res) => {
492
- let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;
493
- res.data.instance = this._parseServerRes(data);
494
- resolve(res);
495
- }, reject];
496
- });
497
- }));
498
- });
499
-
500
- return Promise.all(p_list);
501
- });
502
- }
503
-
504
- create(values = this.values) {
505
- const id = uuidv4();
506
- return this.isConnected().then(() => {
507
- return new Promise((resolve, reject) => {
508
- this._readFiles(values).then((files) => {
509
- this.socket.send(JSON.stringify({
510
- event: 'model',
511
- event_type: 'create',
512
- event_id: id,
513
- args: {
514
- model_name: this.model_name,
515
- model_query: this.model_query,
516
- data: values,
517
- files: files
518
- }
519
- }));
520
-
521
- this.open_request[id] = [(res) => {
522
- let data = typeof res.data.instance === 'string' ? JSON.parse(res.data.instance) : res.data.instance;
523
- if (this.values?.pk === -1) {
524
- this.values_list = [];
525
- this.values = null;
526
- }
527
- res.data.instance = this._parseServerRes(data)[0];
528
- resolve(res);
529
- }, reject];
530
- })
531
- });
532
- });
533
- }
534
-
535
- delete(pk = -1) {
536
- pk = parseInt(pk);
537
- if (isNaN(pk)) {
538
- pk = -1;
539
- }
540
- if (pk === -1) pk = this.values?.pk;
541
- const id = uuidv4();
542
- return this.isConnected().then(() => {
543
- return new Promise((resolve, reject) => {
544
- this.socket.send(JSON.stringify({
545
- event: 'model',
546
- event_type: 'delete',
547
- event_id: id,
548
- args: {
549
- model_name: this.model_name,
550
- model_query: this.model_query,
551
- pk: pk
552
- }
553
- }));
554
-
555
- this.open_request[id] = [resolve, reject];
556
- });
557
- });
558
- }
559
-
560
- isConnected() {
561
- return new Promise((resolve, reject) => {
562
- if (this._is_connected) {
563
- resolve();
564
- } else if (!this._is_conneting_process || !this.open_request['_connecting_process']) {
565
- this._is_conneting_process = true;
566
- this.open_request['_connecting_process'] = [() => {
567
- }, () => {
568
- }]
569
- this._connectToServer().then(() => {
570
- resolve(this._checkConnection());
571
- });
572
- } else {
573
- const [resolve_origin, reject_origin] = this.open_request['_connecting_process'];
574
- this.open_request['_connecting_process'] = [
575
- () => {
576
- resolve_origin();
577
- resolve();
578
- },
579
- () => {
580
- reject_origin();
581
- reject();
582
- }
583
- ]
584
- }
585
- });
586
- }
587
-
588
- close() {
589
- if (this.socket) {
590
- this._auto_reconnect = false;
591
- this.socket.onclose = () => {
592
- };
593
- this.socket.close();
594
- delete this['socket'];
595
- }
596
- }
597
-
598
- clean() {
599
- this.values_list = [];
600
- this.values = {};
601
- return this;
602
- }
603
-
604
- _readFiles(elem) {
605
- let to_solve = [];
606
- 100
607
- let files = {}
608
- for (const [key, value] of Object.entries(elem)) {
609
- if (value instanceof File) {
610
- to_solve.push(new Promise((resolve, reject) => {
611
- ((key, value) => {
612
- let reader = new FileReader();
613
- reader.onload = e => {
614
- const id = uuidv4();
615
- this.open_request[id] = [resolve, reject];
616
-
617
- let result = e.target.result;
618
- let number_of_chunks = parseInt(Math.ceil(result.length / MAX_FILE_UPLOAD));
619
- files[key] = {
620
- id: id,
621
- file_name: value.name,
622
- field_name: key,
623
- content_length: value.size,
624
- };
625
- for (let i = 0; i < number_of_chunks; ++i) {
626
- this.socket.send(JSON.stringify({
627
- event: 'model',
628
- event_type: 'upload',
629
- event_id: id,
630
- args: {
631
- chunk: result.slice(MAX_FILE_UPLOAD * i, MAX_FILE_UPLOAD * (i + 1)),
632
- idx: i,
633
- number_of_chunks: number_of_chunks,
634
- file_name: value.name,
635
- field_name: key,
636
- content_length: value.size,
637
- content_type: value.type,
638
- model_name: this.model_name,
639
- model_query: this.model_query
640
- }
641
- }));
642
- }
643
- }
644
- reader.onerror = () => {
645
- reject()
646
- };
647
- reader.readAsBinaryString(value);
648
- })(key, value);
649
- }))
650
- }
651
- }
652
-
653
- return Promise.all(to_solve).then(() => {
654
- return files
655
- });
656
- }
657
-
658
- _onMessage(e) {
659
- let data = JSON.parse(e.data);
660
- if (data.is_error) {
661
- if (this.open_request.hasOwnProperty(data.event_id)) {
662
- this.open_request[data.event_id][1](data);
663
- this._closeOpenRequest(data.event_id);
664
- }
665
- if (data.msg || data.header) {
666
- trigger('pushErrorMsg', data.header || '', data.msg || '');
667
- }
668
-
669
- if (data.type === 'connect') {
670
- this.open_request['_connecting_process'][1](data);
671
- this._closeOpenRequest('_connecting_process');
672
- this._auto_reconnect = false;
673
- this.socket.close();
674
- }
675
- } else {
676
-
677
- if (data.msg || data.header) {
678
- trigger('pushMsg', data.header || '', data.msg || '');
679
- }
680
-
681
- if (data.type === 'connect') {
682
- this._is_connected = true;
683
- this._is_conneting_process = false;
684
- this.open_request['_connecting_process'][0](data);
685
- this._closeOpenRequest('_connecting_process');
686
- } else if (['load', 'named_view', 'detail_view'].includes(data.type)) {
687
- const json_res = JSON.parse(data.args.data);
688
- this.values_list = [];
689
- data.args.data = this._parseServerRes(json_res);
690
-
691
- } else if (data.type === 'on_update' || data.type === 'on_create') {
692
- const json_res = JSON.parse(data.args.data);
693
-
694
- let obj = this._parseServerRes(json_res);
695
- let cb;
696
-
697
- if (data.type === 'on_create') {
698
- cb = this.on_create;
699
- } else {
700
- cb = this.on_update;
701
- }
702
-
703
- cb(obj);
704
- data.args.data = obj;
705
-
706
- }
707
-
708
- let instance = data.data?.instance
709
- if (instance) {
710
- data.data.instance = JSON.parse(data.data.instance);
711
- }
712
-
713
- if (this.open_request.hasOwnProperty(data.event_id)) {
714
- this.open_request[data.event_id][0](data);
715
- this._closeOpenRequest(data.event_id);
716
- }
717
- }
718
- }
719
-
720
- noOpenRequests() {
721
- return new Promise(resolve => {
722
- if (Object.keys(this.open_request).length === 0) {
723
- return resolve();
724
- }
725
-
726
- this._onNoOpenRequests.push(resolve);
727
- });
728
- }
729
-
730
- _closeOpenRequest(event_id) {
731
- delete this.open_request[event_id];
732
- if (Object.keys(this.open_request).length === 0) {
733
- this._onNoOpenRequests.forEach(x => x());
734
- this._onNoOpenRequests = [];
735
- }
736
-
737
- }
738
-
739
- _connectToServer() {
740
- return new Promise((resolve) => {
741
-
742
- const model_identifier = `${this.model_name}` + (this.model_id > 0 ? `/${this.model_id}` : '');
743
- if (window.location.protocol === "https:") {
744
- this.socket = new WebSocket(`wss://${window.location.host}/sdc_ws/model/${model_identifier}`);
745
- } else {
746
- this.socket = new WebSocket(`ws://${window.location.host}/sdc_ws/model/${model_identifier}`);
747
- }
748
-
749
-
750
- this.socket.onmessage = this._onMessage.bind(this);
751
-
752
- this.socket.onclose = (e) => {
753
- console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`);
754
- this._is_connected = false;
755
- for (const [_key, value] of Object.entries(this.open_request)) {
756
- value[1](e);
757
- }
758
- this.open_request = {};
759
-
760
- setTimeout(() => {
761
- if (this._auto_reconnect) {
762
- this._connectToServer().then(() => {
763
- });
764
- }
765
- }, 1000);
766
- };
767
-
768
- this.socket.onerror = (err) => {
769
- console.error(`Model Socket encountered error: ${err} Closing socket`);
770
- if (this._is_connected) {
771
- try {
772
- this.socket.close();
773
- } catch (e) {
774
-
775
- }
776
- }
777
- };
778
-
779
-
780
- this.socket.onopen = () => {
781
- resolve();
782
- }
783
- });
784
-
785
- }
786
-
787
- _checkConnection() {
788
- const id = uuidv4();
789
- return new Promise((resolve, reject) => {
790
- this.socket.send(JSON.stringify({
791
- event: 'model',
792
- event_type: 'connect',
793
- event_id: id,
794
- args: {
795
- model_name: this.model_name,
796
- model_query: this.model_query
797
- }
798
- }));
799
-
800
- this.open_request[id] = [resolve, reject];
801
- });
802
- }
803
-
804
- _parseServerRes(res) {
805
- let updated = [];
806
- for (let json_data of res) {
807
- const pk = json_data.pk;
808
- const obj = this.byPk(pk);
809
- for (const [k, v] of Object.entries(json_data.fields)) {
810
- if (v && typeof v === 'object' && v['__is_sdc_model__']) {
811
- obj[k] = new SubModel(v['pk'], v['model'])
812
- } else {
813
- obj[k] = v;
814
- }
815
- }
816
-
817
- updated.push(obj);
818
- }
819
-
820
- if (this.values_list.length === 1) {
821
- this.values = this.values_list.at(-1);
822
- } else {
823
- this.values = {};
824
- }
825
-
826
- return updated;
827
-
828
- }
13
+ export {
14
+ registerModel,
15
+ getModel,
829
16
  }