@cynodia/axiom-server 0.8.2-alpha.1 → 0.9.0-alpha.1

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 (45) hide show
  1. package/conformance/blob-authorized-read.json +810 -0
  2. package/conformance/blob-commit-not-dispatched-when-the-transaction-is-refused.json +822 -0
  3. package/conformance/blob-delete-failure-leaves-state-correct.json +821 -0
  4. package/conformance/blob-metadata-lookup.json +814 -0
  5. package/conformance/blob-metadata-missing-refuses-the-action.json +807 -0
  6. package/conformance/blob-restart-preserves-references.json +801 -0
  7. package/conformance/blob-unauthorized-read-and-guessed-key.json +812 -0
  8. package/conformance/blob-upload-and-commit.json +832 -0
  9. package/conformance/blob-upload-unauthorized.json +813 -0
  10. package/conformance/manifest.json +280 -0
  11. package/conformance/subscription-becomes-active-at-startup.json +786 -0
  12. package/conformance/subscription-client-cannot-forge-a-delivery.json +794 -0
  13. package/conformance/subscription-delivery-after-shutdown.json +807 -0
  14. package/conformance/subscription-delivery-applies.json +801 -0
  15. package/conformance/subscription-duplicate-delivery.json +808 -0
  16. package/conformance/subscription-invalid-payload.json +804 -0
  17. package/conformance/subscription-permanent-failure-leaves-application-running.json +810 -0
  18. package/conformance/subscription-poison-delivery.json +801 -0
  19. package/conformance/subscription-reconnects-after-transport-loss.json +828 -0
  20. package/conformance/subscription-sequential-delivery.json +807 -0
  21. package/dist/blobs.d.ts +103 -0
  22. package/dist/blobs.js +122 -0
  23. package/dist/conformance-runner.js +135 -3
  24. package/dist/conformance-types.d.ts +83 -0
  25. package/dist/deps.d.ts +2 -1
  26. package/dist/deps.js +1 -0
  27. package/dist/effects.d.ts +5 -1
  28. package/dist/effects.js +35 -2
  29. package/dist/host.d.ts +3 -1
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +3 -0
  32. package/dist/node-host.d.ts +27 -0
  33. package/dist/node-host.js +92 -0
  34. package/dist/persistence.d.ts +13 -0
  35. package/dist/persistence.js +16 -0
  36. package/dist/server.d.ts +83 -3
  37. package/dist/server.js +274 -12
  38. package/dist/subscription.d.ts +145 -0
  39. package/dist/subscription.js +82 -0
  40. package/dist/subscriptions.d.ts +97 -0
  41. package/dist/subscriptions.js +368 -0
  42. package/dist/triggers.d.ts +11 -2
  43. package/dist/triggers.js +9 -5
  44. package/package.json +3 -3
  45. package/schema/server-ir.v5.schema.json +2059 -0
@@ -0,0 +1,810 @@
1
+ {
2
+ "conformance": "axiom.conformance.v3",
3
+ "name": "blob-authorized-read",
4
+ "covers": [
5
+ "blob storage",
6
+ "authorization"
7
+ ],
8
+ "description": "A stored object referenced by a device is readable, because the store’s readAuthorization is a rule over authoritative state rather than a route guard.",
9
+ "principals": {
10
+ "operator": {
11
+ "field_io_user_id": "op-1",
12
+ "field_io_user_role": "operator"
13
+ },
14
+ "viewer": {
15
+ "field_io_user_id": "v-1",
16
+ "field_io_user_role": "viewer"
17
+ }
18
+ },
19
+ "serverIR": {
20
+ "contract": "axiom.server.v5",
21
+ "id": "external-io",
22
+ "name": "External IO",
23
+ "version": "0.9.0",
24
+ "entities": [
25
+ {
26
+ "id": "entity_io_user",
27
+ "kind": "entity",
28
+ "identityFieldId": "field_io_user_id",
29
+ "fields": [
30
+ {
31
+ "id": "field_io_user_id",
32
+ "valueType": {
33
+ "kind": "primitive",
34
+ "primitive": "string"
35
+ },
36
+ "required": true
37
+ },
38
+ {
39
+ "id": "field_io_user_role",
40
+ "valueType": {
41
+ "kind": "primitive",
42
+ "primitive": "string"
43
+ },
44
+ "required": true
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "id": "entity_io_blob",
50
+ "kind": "entity",
51
+ "name": "BlobRef",
52
+ "identityFieldId": "field_blob_key",
53
+ "fields": [
54
+ {
55
+ "id": "field_blob_key",
56
+ "name": "Key",
57
+ "valueType": {
58
+ "kind": "primitive",
59
+ "primitive": "string"
60
+ },
61
+ "required": true
62
+ },
63
+ {
64
+ "id": "field_blob_media_type",
65
+ "name": "Media type",
66
+ "valueType": {
67
+ "kind": "primitive",
68
+ "primitive": "string"
69
+ },
70
+ "required": true
71
+ },
72
+ {
73
+ "id": "field_blob_size",
74
+ "name": "Size",
75
+ "valueType": {
76
+ "kind": "primitive",
77
+ "primitive": "number"
78
+ },
79
+ "required": true
80
+ },
81
+ {
82
+ "id": "field_blob_filename",
83
+ "name": "Filename",
84
+ "valueType": {
85
+ "kind": "primitive",
86
+ "primitive": "string"
87
+ }
88
+ },
89
+ {
90
+ "id": "field_blob_checksum",
91
+ "name": "Checksum",
92
+ "valueType": {
93
+ "kind": "primitive",
94
+ "primitive": "string"
95
+ }
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "id": "entity_io_device",
101
+ "kind": "entity",
102
+ "identityFieldId": "field_io_device_id",
103
+ "fields": [
104
+ {
105
+ "id": "field_io_device_id",
106
+ "valueType": {
107
+ "kind": "primitive",
108
+ "primitive": "string"
109
+ },
110
+ "required": true
111
+ },
112
+ {
113
+ "id": "field_io_device_status",
114
+ "valueType": {
115
+ "kind": "primitive",
116
+ "primitive": "string"
117
+ },
118
+ "required": true
119
+ },
120
+ {
121
+ "id": "field_io_device_log",
122
+ "valueType": {
123
+ "kind": "optional",
124
+ "valueType": {
125
+ "kind": "entity",
126
+ "entityId": "entity_io_blob"
127
+ }
128
+ }
129
+ }
130
+ ]
131
+ },
132
+ {
133
+ "id": "entity_io_change",
134
+ "kind": "entity",
135
+ "fields": [
136
+ {
137
+ "id": "field_io_change_device",
138
+ "valueType": {
139
+ "kind": "primitive",
140
+ "primitive": "string"
141
+ },
142
+ "required": true
143
+ },
144
+ {
145
+ "id": "field_io_change_status",
146
+ "valueType": {
147
+ "kind": "primitive",
148
+ "primitive": "string"
149
+ },
150
+ "required": true
151
+ },
152
+ {
153
+ "id": "field_io_change_delivery",
154
+ "valueType": {
155
+ "kind": "primitive",
156
+ "primitive": "string"
157
+ }
158
+ }
159
+ ]
160
+ }
161
+ ],
162
+ "fields": {
163
+ "field_io_user_id": {
164
+ "entityId": "entity_io_user",
165
+ "field": {
166
+ "id": "field_io_user_id",
167
+ "valueType": {
168
+ "kind": "primitive",
169
+ "primitive": "string"
170
+ },
171
+ "required": true
172
+ }
173
+ },
174
+ "field_io_user_role": {
175
+ "entityId": "entity_io_user",
176
+ "field": {
177
+ "id": "field_io_user_role",
178
+ "valueType": {
179
+ "kind": "primitive",
180
+ "primitive": "string"
181
+ },
182
+ "required": true
183
+ }
184
+ },
185
+ "field_blob_key": {
186
+ "entityId": "entity_io_blob",
187
+ "field": {
188
+ "id": "field_blob_key",
189
+ "name": "Key",
190
+ "valueType": {
191
+ "kind": "primitive",
192
+ "primitive": "string"
193
+ },
194
+ "required": true
195
+ }
196
+ },
197
+ "field_blob_media_type": {
198
+ "entityId": "entity_io_blob",
199
+ "field": {
200
+ "id": "field_blob_media_type",
201
+ "name": "Media type",
202
+ "valueType": {
203
+ "kind": "primitive",
204
+ "primitive": "string"
205
+ },
206
+ "required": true
207
+ }
208
+ },
209
+ "field_blob_size": {
210
+ "entityId": "entity_io_blob",
211
+ "field": {
212
+ "id": "field_blob_size",
213
+ "name": "Size",
214
+ "valueType": {
215
+ "kind": "primitive",
216
+ "primitive": "number"
217
+ },
218
+ "required": true
219
+ }
220
+ },
221
+ "field_blob_filename": {
222
+ "entityId": "entity_io_blob",
223
+ "field": {
224
+ "id": "field_blob_filename",
225
+ "name": "Filename",
226
+ "valueType": {
227
+ "kind": "primitive",
228
+ "primitive": "string"
229
+ }
230
+ }
231
+ },
232
+ "field_blob_checksum": {
233
+ "entityId": "entity_io_blob",
234
+ "field": {
235
+ "id": "field_blob_checksum",
236
+ "name": "Checksum",
237
+ "valueType": {
238
+ "kind": "primitive",
239
+ "primitive": "string"
240
+ }
241
+ }
242
+ },
243
+ "field_io_device_id": {
244
+ "entityId": "entity_io_device",
245
+ "field": {
246
+ "id": "field_io_device_id",
247
+ "valueType": {
248
+ "kind": "primitive",
249
+ "primitive": "string"
250
+ },
251
+ "required": true
252
+ }
253
+ },
254
+ "field_io_device_status": {
255
+ "entityId": "entity_io_device",
256
+ "field": {
257
+ "id": "field_io_device_status",
258
+ "valueType": {
259
+ "kind": "primitive",
260
+ "primitive": "string"
261
+ },
262
+ "required": true
263
+ }
264
+ },
265
+ "field_io_device_log": {
266
+ "entityId": "entity_io_device",
267
+ "field": {
268
+ "id": "field_io_device_log",
269
+ "valueType": {
270
+ "kind": "optional",
271
+ "valueType": {
272
+ "kind": "entity",
273
+ "entityId": "entity_io_blob"
274
+ }
275
+ }
276
+ }
277
+ },
278
+ "field_io_change_device": {
279
+ "entityId": "entity_io_change",
280
+ "field": {
281
+ "id": "field_io_change_device",
282
+ "valueType": {
283
+ "kind": "primitive",
284
+ "primitive": "string"
285
+ },
286
+ "required": true
287
+ }
288
+ },
289
+ "field_io_change_status": {
290
+ "entityId": "entity_io_change",
291
+ "field": {
292
+ "id": "field_io_change_status",
293
+ "valueType": {
294
+ "kind": "primitive",
295
+ "primitive": "string"
296
+ },
297
+ "required": true
298
+ }
299
+ },
300
+ "field_io_change_delivery": {
301
+ "entityId": "entity_io_change",
302
+ "field": {
303
+ "id": "field_io_change_delivery",
304
+ "valueType": {
305
+ "kind": "primitive",
306
+ "primitive": "string"
307
+ }
308
+ }
309
+ }
310
+ },
311
+ "states": [
312
+ {
313
+ "id": "state_io_devices",
314
+ "kind": "state",
315
+ "name": "devices",
316
+ "authority": "server",
317
+ "valueType": {
318
+ "kind": "collection",
319
+ "itemType": {
320
+ "kind": "entity",
321
+ "entityId": "entity_io_device"
322
+ }
323
+ },
324
+ "initialValue": [
325
+ {
326
+ "field_io_device_id": "d1",
327
+ "field_io_device_status": "unknown",
328
+ "field_io_device_log": null
329
+ }
330
+ ]
331
+ }
332
+ ],
333
+ "actions": {
334
+ "action_io_apply_status": {
335
+ "id": "action_io_apply_status",
336
+ "kind": "action",
337
+ "name": "applyStatus",
338
+ "invocation": {
339
+ "allowedSources": [
340
+ "system"
341
+ ]
342
+ },
343
+ "parameters": [
344
+ {
345
+ "id": "param_io_device",
346
+ "valueType": {
347
+ "kind": "primitive",
348
+ "primitive": "string"
349
+ },
350
+ "required": true
351
+ },
352
+ {
353
+ "id": "param_io_status",
354
+ "valueType": {
355
+ "kind": "primitive",
356
+ "primitive": "string"
357
+ },
358
+ "required": true
359
+ }
360
+ ],
361
+ "operations": [
362
+ {
363
+ "kind": "set",
364
+ "target": {
365
+ "kind": "field",
366
+ "target": {
367
+ "kind": "collection-item",
368
+ "collection": {
369
+ "kind": "state",
370
+ "stateId": "state_io_devices"
371
+ },
372
+ "selector": {
373
+ "kind": "identity",
374
+ "fieldId": "field_io_device_id",
375
+ "value": {
376
+ "kind": "ref",
377
+ "targetId": "param_io_device"
378
+ }
379
+ }
380
+ },
381
+ "fieldId": "field_io_device_status"
382
+ },
383
+ "value": {
384
+ "kind": "ref",
385
+ "targetId": "param_io_status"
386
+ }
387
+ }
388
+ ],
389
+ "preconditions": [],
390
+ "failureModes": []
391
+ },
392
+ "action_io_attach": {
393
+ "id": "action_io_attach",
394
+ "kind": "action",
395
+ "name": "attachLog",
396
+ "authorization": {
397
+ "kind": "binary",
398
+ "operator": "eq",
399
+ "left": {
400
+ "kind": "field",
401
+ "source": {
402
+ "kind": "ref",
403
+ "targetId": "axiom_principal"
404
+ },
405
+ "fieldId": "field_io_user_role"
406
+ },
407
+ "right": {
408
+ "kind": "literal",
409
+ "value": "operator"
410
+ }
411
+ },
412
+ "parameters": [
413
+ {
414
+ "id": "param_io_attach_device",
415
+ "valueType": {
416
+ "kind": "primitive",
417
+ "primitive": "string"
418
+ },
419
+ "required": true
420
+ },
421
+ {
422
+ "id": "param_io_attach_blob",
423
+ "valueType": {
424
+ "kind": "entity",
425
+ "entityId": "entity_io_blob"
426
+ },
427
+ "required": true
428
+ }
429
+ ],
430
+ "operations": [
431
+ {
432
+ "kind": "set",
433
+ "target": {
434
+ "kind": "field",
435
+ "target": {
436
+ "kind": "collection-item",
437
+ "collection": {
438
+ "kind": "state",
439
+ "stateId": "state_io_devices"
440
+ },
441
+ "selector": {
442
+ "kind": "identity",
443
+ "fieldId": "field_io_device_id",
444
+ "value": {
445
+ "kind": "ref",
446
+ "targetId": "param_io_attach_device"
447
+ }
448
+ }
449
+ },
450
+ "fieldId": "field_io_device_log"
451
+ },
452
+ "value": {
453
+ "kind": "ref",
454
+ "targetId": "param_io_attach_blob"
455
+ }
456
+ },
457
+ {
458
+ "kind": "blob-commit",
459
+ "storageId": "storage_io_logs",
460
+ "blobKey": {
461
+ "kind": "field",
462
+ "source": {
463
+ "kind": "ref",
464
+ "targetId": "param_io_attach_blob"
465
+ },
466
+ "fieldId": "field_blob_key"
467
+ }
468
+ }
469
+ ],
470
+ "preconditions": [],
471
+ "failureModes": []
472
+ },
473
+ "action_io_detach": {
474
+ "id": "action_io_detach",
475
+ "kind": "action",
476
+ "name": "detachLog",
477
+ "authorization": {
478
+ "kind": "binary",
479
+ "operator": "eq",
480
+ "left": {
481
+ "kind": "field",
482
+ "source": {
483
+ "kind": "ref",
484
+ "targetId": "axiom_principal"
485
+ },
486
+ "fieldId": "field_io_user_role"
487
+ },
488
+ "right": {
489
+ "kind": "literal",
490
+ "value": "operator"
491
+ }
492
+ },
493
+ "parameters": [
494
+ {
495
+ "id": "param_io_detach_device",
496
+ "valueType": {
497
+ "kind": "primitive",
498
+ "primitive": "string"
499
+ },
500
+ "required": true
501
+ }
502
+ ],
503
+ "operations": [
504
+ {
505
+ "kind": "blob-metadata",
506
+ "storageId": "storage_io_logs",
507
+ "bindAs": "scope_io_metadata",
508
+ "blobKey": {
509
+ "kind": "field",
510
+ "source": {
511
+ "kind": "field",
512
+ "source": {
513
+ "kind": "find",
514
+ "source": {
515
+ "kind": "ref",
516
+ "targetId": "state_io_devices"
517
+ },
518
+ "scopeId": "scope_io_device",
519
+ "predicate": {
520
+ "kind": "binary",
521
+ "operator": "eq",
522
+ "left": {
523
+ "kind": "field",
524
+ "source": {
525
+ "kind": "ref",
526
+ "targetId": "scope_io_device"
527
+ },
528
+ "fieldId": "field_io_device_id"
529
+ },
530
+ "right": {
531
+ "kind": "ref",
532
+ "targetId": "param_io_detach_device"
533
+ }
534
+ }
535
+ },
536
+ "fieldId": "field_io_device_log"
537
+ },
538
+ "fieldId": "field_blob_key"
539
+ }
540
+ },
541
+ {
542
+ "kind": "set",
543
+ "target": {
544
+ "kind": "field",
545
+ "target": {
546
+ "kind": "collection-item",
547
+ "collection": {
548
+ "kind": "state",
549
+ "stateId": "state_io_devices"
550
+ },
551
+ "selector": {
552
+ "kind": "identity",
553
+ "fieldId": "field_io_device_id",
554
+ "value": {
555
+ "kind": "ref",
556
+ "targetId": "param_io_detach_device"
557
+ }
558
+ }
559
+ },
560
+ "fieldId": "field_io_device_log"
561
+ },
562
+ "value": {
563
+ "kind": "literal",
564
+ "value": null
565
+ }
566
+ },
567
+ {
568
+ "kind": "blob-delete",
569
+ "storageId": "storage_io_logs",
570
+ "blobKey": {
571
+ "kind": "field",
572
+ "source": {
573
+ "kind": "ref",
574
+ "targetId": "scope_io_metadata"
575
+ },
576
+ "fieldId": "field_blob_key"
577
+ }
578
+ }
579
+ ],
580
+ "preconditions": [],
581
+ "failureModes": []
582
+ }
583
+ },
584
+ "constraints": [
585
+ {
586
+ "id": "constraint_io_status",
587
+ "kind": "constraint",
588
+ "entityId": "entity_io_device",
589
+ "message": "Device status must be unknown, online or offline.",
590
+ "expression": {
591
+ "kind": "call",
592
+ "function": "one-of",
593
+ "arguments": [
594
+ {
595
+ "kind": "field",
596
+ "source": {
597
+ "kind": "ref",
598
+ "targetId": "entity_io_device"
599
+ },
600
+ "fieldId": "field_io_device_status"
601
+ },
602
+ {
603
+ "kind": "literal",
604
+ "value": "unknown"
605
+ },
606
+ {
607
+ "kind": "literal",
608
+ "value": "online"
609
+ },
610
+ {
611
+ "kind": "literal",
612
+ "value": "offline"
613
+ }
614
+ ]
615
+ }
616
+ }
617
+ ],
618
+ "transitionConstraints": [],
619
+ "principalEntityId": "entity_io_user",
620
+ "observableStateIds": [
621
+ "state_io_devices"
622
+ ],
623
+ "integrations": [
624
+ {
625
+ "id": "integration_io_devices",
626
+ "kind": "integration",
627
+ "name": "Devices"
628
+ }
629
+ ],
630
+ "events": [
631
+ {
632
+ "id": "event_io_status",
633
+ "kind": "event",
634
+ "payloadType": {
635
+ "kind": "entity",
636
+ "entityId": "entity_io_change"
637
+ }
638
+ }
639
+ ],
640
+ "triggers": [
641
+ {
642
+ "id": "trigger_io_status",
643
+ "kind": "trigger",
644
+ "actionId": "action_io_apply_status",
645
+ "when": {
646
+ "kind": "event",
647
+ "eventId": "event_io_status"
648
+ },
649
+ "arguments": {
650
+ "param_io_device": {
651
+ "kind": "field",
652
+ "source": {
653
+ "kind": "ref",
654
+ "targetId": "trigger_io_status"
655
+ },
656
+ "fieldId": "field_io_change_device"
657
+ },
658
+ "param_io_status": {
659
+ "kind": "field",
660
+ "source": {
661
+ "kind": "ref",
662
+ "targetId": "trigger_io_status"
663
+ },
664
+ "fieldId": "field_io_change_status"
665
+ }
666
+ }
667
+ }
668
+ ],
669
+ "subscriptions": [
670
+ {
671
+ "id": "subscription_io_status",
672
+ "kind": "subscription",
673
+ "name": "live status",
674
+ "integrationId": "integration_io_devices",
675
+ "source": "device-status",
676
+ "eventId": "event_io_status",
677
+ "lifecycle": {
678
+ "reconnect": {
679
+ "policy": "fixed",
680
+ "maxAttempts": 3,
681
+ "delayMs": 100
682
+ }
683
+ },
684
+ "delivery": {
685
+ "deduplicateBy": "field_io_change_delivery",
686
+ "maxQueued": 8,
687
+ "backpressure": "block"
688
+ }
689
+ }
690
+ ],
691
+ "storages": [
692
+ {
693
+ "id": "storage_io_logs",
694
+ "kind": "storage",
695
+ "name": "Logs",
696
+ "blobEntityId": "entity_io_blob",
697
+ "readAuthorization": {
698
+ "kind": "some",
699
+ "source": {
700
+ "kind": "ref",
701
+ "targetId": "state_io_devices"
702
+ },
703
+ "scopeId": "scope_io_ref",
704
+ "predicate": {
705
+ "kind": "binary",
706
+ "operator": "eq",
707
+ "left": {
708
+ "kind": "field",
709
+ "source": {
710
+ "kind": "field",
711
+ "source": {
712
+ "kind": "ref",
713
+ "targetId": "scope_io_ref"
714
+ },
715
+ "fieldId": "field_io_device_log"
716
+ },
717
+ "fieldId": "field_blob_key"
718
+ },
719
+ "right": {
720
+ "kind": "field",
721
+ "source": {
722
+ "kind": "ref",
723
+ "targetId": "storage_io_logs"
724
+ },
725
+ "fieldId": "field_blob_key"
726
+ }
727
+ }
728
+ },
729
+ "uploadAuthorization": {
730
+ "kind": "binary",
731
+ "operator": "eq",
732
+ "left": {
733
+ "kind": "field",
734
+ "source": {
735
+ "kind": "ref",
736
+ "targetId": "axiom_principal"
737
+ },
738
+ "fieldId": "field_io_user_role"
739
+ },
740
+ "right": {
741
+ "kind": "literal",
742
+ "value": "operator"
743
+ }
744
+ }
745
+ }
746
+ ]
747
+ },
748
+ "initialState": [
749
+ {
750
+ "stateId": "state_io_devices",
751
+ "value": [
752
+ {
753
+ "field_io_device_id": "d1",
754
+ "field_io_device_status": "unknown",
755
+ "field_io_device_log": {
756
+ "field_blob_key": "log-1",
757
+ "field_blob_media_type": "text/plain",
758
+ "field_blob_size": 8,
759
+ "field_blob_filename": "d1.log",
760
+ "field_blob_checksum": "5f2e1a7f"
761
+ }
762
+ }
763
+ ],
764
+ "revision": 1
765
+ }
766
+ ],
767
+ "externalSubscriptions": {
768
+ "subscription_io_status": {
769
+ "entries": []
770
+ }
771
+ },
772
+ "blobStores": {
773
+ "storage_io_logs": {
774
+ "objects": [
775
+ {
776
+ "key": "log-1",
777
+ "mediaType": "text/plain",
778
+ "filename": "d1.log",
779
+ "text": "boot ok\n"
780
+ }
781
+ ]
782
+ }
783
+ },
784
+ "steps": [
785
+ {
786
+ "kind": "read-blob",
787
+ "storageId": "storage_io_logs",
788
+ "blobKey": "log-1",
789
+ "credential": "viewer",
790
+ "expect": {
791
+ "ok": true
792
+ }
793
+ }
794
+ ],
795
+ "expectedState": {
796
+ "state_io_devices": [
797
+ {
798
+ "field_io_device_id": "d1",
799
+ "field_io_device_status": "unknown",
800
+ "field_io_device_log": {
801
+ "field_blob_key": "log-1",
802
+ "field_blob_media_type": "text/plain",
803
+ "field_blob_size": 8,
804
+ "field_blob_filename": "d1.log",
805
+ "field_blob_checksum": "5f2e1a7f"
806
+ }
807
+ }
808
+ ]
809
+ }
810
+ }