@platforma-sdk/workflow-tengo 2.9.6 → 2.9.8

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 (64) hide show
  1. package/dist/tengo/lib/assets.lib.tengo +52 -52
  2. package/dist/tengo/lib/assets.swinfo.lib.tengo +45 -45
  3. package/dist/tengo/lib/constants.lib.tengo +32 -32
  4. package/dist/tengo/lib/exec.R.internal.lib.tengo +29 -29
  5. package/dist/tengo/lib/exec.R.lib.tengo +166 -166
  6. package/dist/tengo/lib/exec.constants.lib.tengo +4 -4
  7. package/dist/tengo/lib/exec.descriptor.lib.tengo +31 -31
  8. package/dist/tengo/lib/exec.internal.lib.tengo +297 -297
  9. package/dist/tengo/lib/exec.lib.tengo +815 -815
  10. package/dist/tengo/lib/exec.monetization.lib.tengo +130 -130
  11. package/dist/tengo/lib/exec.package.lib.tengo +212 -212
  12. package/dist/tengo/lib/exec.python.internal.lib.tengo +6 -6
  13. package/dist/tengo/lib/exec.python.lib.tengo +146 -146
  14. package/dist/tengo/lib/exec.runcmd.lib.tengo +371 -371
  15. package/dist/tengo/lib/exec.runenv.lib.tengo +92 -92
  16. package/dist/tengo/lib/exec.stream.lib.tengo +40 -40
  17. package/dist/tengo/lib/file.internal.lib.tengo +77 -77
  18. package/dist/tengo/lib/file.lib.tengo +57 -57
  19. package/dist/tengo/lib/ll.lib.tengo +244 -244
  20. package/dist/tengo/lib/maps.lib.tengo +152 -152
  21. package/dist/tengo/lib/objects.lib.tengo +13 -13
  22. package/dist/tengo/lib/oop.lib.tengo +19 -19
  23. package/dist/tengo/lib/path.lib.tengo +125 -125
  24. package/dist/tengo/lib/pframes.constants.lib.tengo +28 -28
  25. package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +33 -33
  26. package/dist/tengo/lib/pframes.lib.tengo +43 -43
  27. package/dist/tengo/lib/pframes.ll.lib.tengo +72 -72
  28. package/dist/tengo/lib/pframes.pcolumn.lib.tengo +49 -49
  29. package/dist/tengo/lib/pframes.spec.lib.tengo +96 -96
  30. package/dist/tengo/lib/pframes.util.lib.tengo +288 -288
  31. package/dist/tengo/lib/pframes.xsv.lib.tengo +272 -272
  32. package/dist/tengo/lib/render.lib.tengo +75 -75
  33. package/dist/tengo/lib/sets.lib.tengo +68 -68
  34. package/dist/tengo/lib/slices.lib.tengo +258 -155
  35. package/dist/tengo/lib/smart.lib.tengo +1069 -1069
  36. package/dist/tengo/lib/test.lib.tengo +161 -161
  37. package/dist/tengo/lib/tpl.lib.tengo +515 -515
  38. package/dist/tengo/lib/tpl.state-await.lib.tengo +240 -240
  39. package/dist/tengo/lib/tpl.util.lib.tengo +9 -9
  40. package/dist/tengo/lib/validation.lib.tengo +378 -378
  41. package/dist/tengo/lib/workdir.lib.tengo +331 -331
  42. package/dist/tengo/lib/workdir.proc.lib.tengo +144 -144
  43. package/dist/tengo/lib/workdir.save.lib.tengo +130 -130
  44. package/dist/tengo/lib/workflow.bobject.lib.tengo +26 -26
  45. package/dist/tengo/lib/workflow.bquery.lib.tengo +165 -165
  46. package/dist/tengo/lib/workflow.constants.lib.tengo +2 -2
  47. package/dist/tengo/lib/workflow.context.lib.tengo +32 -32
  48. package/dist/tengo/lib/workflow.lib.tengo +206 -206
  49. package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
  50. package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
  51. package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
  52. package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
  53. package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
  54. package/dist/tengo/tpl/pframes.aggregate.plj.gz +0 -0
  55. package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
  56. package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
  57. package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
  58. package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
  59. package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
  60. package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
  61. package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
  62. package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
  63. package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
  64. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
-
2
-
3
-
1
+ /**
2
+ * A library for run environments creation and bootstrapping.
3
+ */
4
4
 
5
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
6
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -18,103 +18,103 @@ _OUTPUT_RUN_ENV := "runEnv"
18
18
  _OUTPUT_WD_OUT := "workdirOut"
19
19
 
20
20
  saveBuilder := func(wd) {
21
- self := undefined
22
-
23
- pathsToSave := []
24
- envType := ""
25
-
26
- packagesMap := {}
27
-
28
- self = {
29
- addPath: func(path) {
30
- validation.assertJsonSchema(path, "string", "runenv.saveBuilder.addPath: <path> must be string")
31
-
32
- pathsToSave = append(pathsToSave, path)
33
- return self
34
- },
35
-
36
- envType: func(type) {
37
- validation.assertJsonSchema(type, "string", "runenv.saveBuilder.envType: <type> must be string")
38
-
39
- envType = type
40
- return self
41
- },
42
-
43
-
44
-
45
-
46
- addPackage: func(key, pkgRef) {
47
- ll.assert(!maps.containsKey(packagesMap, key), "runenv.saveBuilder.addPackage: package %q was already added to SaveRunEnv builder", key)
48
- validation.assertJsonSchema(pkgRef, validation.reference, "runenv.saveBuilder.addPackage: <pkgRef> must be reference")
49
-
50
- packagesMap[key] = pkgRef
51
- return self
52
- },
53
-
54
- build: func() {
55
- ll.assert(envType != "", "runenv.saveBuilder.build: environment type is not set")
56
-
57
- envSaver := smart.ephemeralBuilder(_RTYPE_SAVE_RUN_ENV)
58
-
59
- envSaver.getField(_INPUT_WD_IN).set(wd)
60
-
61
- envSaver.getField(_INPUT_SETTINGS).
62
- set(smart.createJsonResource({
63
- paths: pathsToSave,
64
- type: envType
65
- }))
66
-
67
- envSaver.getField(_INPUT_PACKAGES_MAP).
68
- set(smart.createMapResource(packagesMap))
69
-
70
- return oop.inherit(envSaver.lockAndBuild(), {
71
-
72
-
73
-
74
-
75
-
76
-
77
- runEnv: func() {
78
- return envSaver.getField(_OUTPUT_RUN_ENV)
79
- },
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
- workdir: func() {
88
- return envSaver.getField(_OUTPUT_WD_OUT)
89
- }
90
- })
91
- }
92
- }
93
-
94
- return self
21
+ self := undefined
22
+
23
+ pathsToSave := []
24
+ envType := ""
25
+
26
+ packagesMap := {}
27
+
28
+ self = {
29
+ addPath: func(path) {
30
+ validation.assertJsonSchema(path, "string", "runenv.saveBuilder.addPath: <path> must be string")
31
+
32
+ pathsToSave = append(pathsToSave, path)
33
+ return self
34
+ },
35
+
36
+ envType: func(type) {
37
+ validation.assertJsonSchema(type, "string", "runenv.saveBuilder.envType: <type> must be string")
38
+
39
+ envType = type
40
+ return self
41
+ },
42
+
43
+ /**
44
+ * Bind package to created run environment, holding it as long as run environment exists.
45
+ */
46
+ addPackage: func(key, pkgRef) {
47
+ ll.assert(!maps.containsKey(packagesMap, key), "runenv.saveBuilder.addPackage: package %q was already added to SaveRunEnv builder", key)
48
+ validation.assertJsonSchema(pkgRef, validation.reference, "runenv.saveBuilder.addPackage: <pkgRef> must be reference")
49
+
50
+ packagesMap[key] = pkgRef
51
+ return self
52
+ },
53
+
54
+ build: func() {
55
+ ll.assert(envType != "", "runenv.saveBuilder.build: environment type is not set")
56
+
57
+ envSaver := smart.ephemeralBuilder(_RTYPE_SAVE_RUN_ENV)
58
+
59
+ envSaver.getField(_INPUT_WD_IN).set(wd)
60
+
61
+ envSaver.getField(_INPUT_SETTINGS).
62
+ set(smart.createJsonResource({
63
+ paths: pathsToSave,
64
+ type: envType
65
+ }))
66
+
67
+ envSaver.getField(_INPUT_PACKAGES_MAP).
68
+ set(smart.createMapResource(packagesMap))
69
+
70
+ return oop.inherit(envSaver.lockAndBuild(), {
71
+ /**
72
+ * Run environment reference
73
+ *
74
+ * @return runEnv: smart.field - field where run environment appears
75
+ * after operation is done
76
+ */
77
+ runEnv: func() {
78
+ return envSaver.getField(_OUTPUT_RUN_ENV)
79
+ },
80
+
81
+ /**
82
+ * Working directory reference after operation is complete
83
+ *
84
+ * @return wd: smart.field - field where workdir appears after
85
+ * operation is done
86
+ */
87
+ workdir: func() {
88
+ return envSaver.getField(_OUTPUT_WD_OUT)
89
+ }
90
+ })
91
+ }
92
+ }
93
+
94
+ return self
95
95
  }
96
96
 
97
97
  loadDependencyFiles := func(packageRef, dependencies) {
98
- if len(dependencies) == 0 {
99
- return {}
100
- }
98
+ if len(dependencies) == 0 {
99
+ return {}
100
+ }
101
101
 
102
- depsMap := {}
102
+ depsMap := {}
103
103
 
104
- loader := pkg.pkgFileLoader(packageRef)
105
- for depName, fileName in dependencies {
106
- loader.saveFile(fileName)
107
- }
108
- deps := loader.load()
104
+ loader := pkg.pkgFileLoader(packageRef)
105
+ for depName, fileName in dependencies {
106
+ loader.saveFile(fileName)
107
+ }
108
+ deps := loader.load()
109
109
 
110
- for depName, fileName in dependencies {
111
- depsMap[depName] = deps.getFile(fileName)
112
- }
110
+ for depName, fileName in dependencies {
111
+ depsMap[depName] = deps.getFile(fileName)
112
+ }
113
113
 
114
- return depsMap
114
+ return depsMap
115
115
  }
116
116
 
117
117
  export ll.toStrict({
118
- saveBuilder : saveBuilder,
119
- loadDependencyFiles : loadDependencyFiles
118
+ saveBuilder : saveBuilder,
119
+ loadDependencyFiles : loadDependencyFiles
120
120
  })
@@ -1,6 +1,6 @@
1
-
2
-
3
-
1
+ /**
2
+ * A library for working with streams.
3
+ */
4
4
 
5
5
  ll := import("@platforma-sdk/workflow-tengo:ll")
6
6
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -10,55 +10,55 @@ file := import("@platforma-sdk/workflow-tengo:file")
10
10
  _RTYPE_CREATE_STREAM := { Name: "CreateStream", Version: "2" }
11
11
  _RTYPE_STREAM_MANAGER := { Name: "StreamManager", Version: "2" }
12
12
 
13
-
14
-
15
-
16
-
17
-
18
-
19
-
13
+ /**
14
+ * Creates a stream in the specified workdir for the given file path.
15
+ *
16
+ * @param workdir: reference - a reference to the workdir.
17
+ * @param filePath: string - the path of the file in the workdir.
18
+ * @return stream: resource - a smart.resource to the created stream with an output field.
19
+ */
20
20
  _create := func(workdir, filePath) {
21
- stream := smart.ephemeralBuilder(_RTYPE_CREATE_STREAM)
22
- stream.getField("workdir").set(workdir)
23
- stream.getField("filePath").setRefOrJson(filePath)
21
+ stream := smart.ephemeralBuilder(_RTYPE_CREATE_STREAM)
22
+ stream.getField("workdir").set(workdir)
23
+ stream.getField("filePath").setRefOrJson(filePath)
24
24
 
25
- return ll.toStrict(oop.inherit(stream.lockAndBuild(), {
26
- output: stream.outputs().stream
27
- }))
25
+ return ll.toStrict(oop.inherit(stream.lockAndBuild(), {
26
+ output: stream.outputs().stream
27
+ }))
28
28
  }
29
29
 
30
-
31
-
32
-
33
-
34
-
35
-
36
-
30
+ /**
31
+ * Creates a special manager resource that has either a blob or a stream in the `stream` field.
32
+ *
33
+ * @param stream: reference - a reference to the stream.
34
+ * @param downloadableRef: reference - a reference to the downloadable content.
35
+ * @return manager: reference - a reference to the stream manager.
36
+ */
37
37
  _manager := func(stream, downloadableRef) {
38
- res := smart.structBuilder(_RTYPE_STREAM_MANAGER)
38
+ res := smart.structBuilder(_RTYPE_STREAM_MANAGER)
39
39
 
40
- res.getField("downloadable").set(downloadableRef)
41
- res.getField("stream").set(stream.output)
40
+ res.getField("downloadable").set(downloadableRef)
41
+ res.getField("stream").set(stream.output)
42
42
 
43
- return res.lockAndBuild()
43
+ return res.lockAndBuild()
44
44
  }
45
45
 
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
46
+ /**
47
+ * Creates a stream and manages its downloadable content.
48
+ *
49
+ * @param workdirBefore: reference - a reference to the workdir before RunCommand were executed.
50
+ * @param workdirAfter: reference - a reference to the resulted workdir field of RunCommand.
51
+ * @param filePath: string - the path of the file in the workdir.
52
+ * @return manager: reference - a reference to the stream manager.
53
+ */
54
54
  create := func(workdirBefore, workdirAfter, filePath) {
55
- stream := _create(workdirBefore, filePath)
56
- fileFuture := workdirAfter.files.getFutureInputField(filePath)
57
- downloadable := file.exportFile(fileFuture)
55
+ stream := _create(workdirBefore, filePath)
56
+ fileFuture := workdirAfter.files.getFutureInputField(filePath)
57
+ downloadable := file.exportFile(fileFuture)
58
58
 
59
- return _manager(stream, downloadable)
59
+ return _manager(stream, downloadable)
60
60
  }
61
61
 
62
62
  export ll.toStrict({
63
- create: create
63
+ create: create
64
64
  })
@@ -1,13 +1,13 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
1
+ /**
2
+ * Internal functions to work with blobs.
3
+ *
4
+ * This file contains functions intended for use only within workflow tengo SDK.
5
+ * Their parameters list, results and other parts of the interface may change from
6
+ * vertion to version without prior notice.
7
+ *
8
+ * DO NOT USE them in workflows or templates directly.
9
+ *
10
+ */
11
11
 
12
12
  ll := import("@platforma-sdk/workflow-tengo:ll")
13
13
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -15,87 +15,87 @@ validation := import("@platforma-sdk/workflow-tengo:validation")
15
15
 
16
16
  json := import("json")
17
17
 
18
-
19
-
20
-
18
+ //
19
+ // Resource types:
20
+ //
21
21
 
22
22
  RTYPE_BLOB_IMPORT_EXTERNAL := { Name: "BlobImportExternal", Version: "1" }
23
23
  RTYPE_BLOB_IMPORT_INTERNAL := { Name: "BlobImportInternal", Version: "1" }
24
24
  RTYPE_BLOB_UPLOAD := { Name: "BlobUpload", Version: "1" }
25
25
  RTYPE_BLOB_DOWNLOAD := { Name: "BlobDownload", Version: "2" }
26
26
 
27
-
28
-
29
-
30
-
31
-
32
-
27
+ /**
28
+ * Create a task for importing blob from external service by URL
29
+ * Produces 2 fields:
30
+ * 'file' - reference to blob to appear once import gets finished.
31
+ * 'handle' - reference to resource with 'progress' API.
32
+ */
33
33
  createBlobImportExternal := func(settings) {
34
- validation.assertJsonSchema(settings, {
35
- "dataURL": "string",
36
- "dataHeaders,?": [["string"]],
37
- "dataVersion,?": "string"
38
- })
39
-
40
- importer := smart.structBuilder(RTYPE_BLOB_IMPORT_EXTERNAL, json.encode(settings)).lockAndBuild()
41
-
42
- return ll.toStrict({
43
- file: importer.getField("blob"),
44
- handle: importer.getField("handle")
45
- })
34
+ validation.assertJsonSchema(settings, {
35
+ "dataURL": "string",
36
+ "dataHeaders,?": [["string"]],
37
+ "dataVersion,?": "string"
38
+ })
39
+
40
+ importer := smart.structBuilder(RTYPE_BLOB_IMPORT_EXTERNAL, json.encode(settings)).lockAndBuild()
41
+
42
+ return ll.toStrict({
43
+ file: importer.getField("blob"),
44
+ handle: importer.getField("handle")
45
+ })
46
46
  }
47
47
 
48
-
49
-
50
-
51
-
52
-
53
-
48
+ /**
49
+ * Create a task for importing blob from one of preconfigured storages.
50
+ * Produces 2 fields:
51
+ * 'file' - reference to blob to appear once import gets finished.
52
+ * 'handle' - reference to resource with 'progress' API.
53
+ */
54
54
  createBlobImportInternal := func(settings) {
55
- validation.assertJsonSchema(settings, {
56
- "path": "string",
57
- "storageId": "string",
58
- "maxSpeedBytes,?": "number",
59
- "dataVersion,?": "string"
60
- })
61
-
62
- importer := smart.structBuilder(RTYPE_BLOB_IMPORT_INTERNAL, json.encode(settings)).lockAndBuild()
63
-
64
- return ll.toStrict({
65
- file: importer.getField("blob"),
66
- handle: importer.getField("handle")
67
- })
55
+ validation.assertJsonSchema(settings, {
56
+ "path": "string",
57
+ "storageId": "string",
58
+ "maxSpeedBytes,?": "number",
59
+ "dataVersion,?": "string"
60
+ })
61
+
62
+ importer := smart.structBuilder(RTYPE_BLOB_IMPORT_INTERNAL, json.encode(settings)).lockAndBuild()
63
+
64
+ return ll.toStrict({
65
+ file: importer.getField("blob"),
66
+ handle: importer.getField("handle")
67
+ })
68
68
  }
69
69
 
70
-
71
-
72
-
73
-
74
-
75
-
70
+ /**
71
+ * Create a task for getting a blob directly from the user via 'upload' procedure.
72
+ * Produces 2 fields:
73
+ * 'file' - reference to blob to appear once upload gets finished.
74
+ * 'handle' - reference to resource with 'progress' and 'upload' APIs.
75
+ */
76
76
  createBlobUpload := func(settings) {
77
- validation.assertJsonSchema(settings, {
78
- "modificationTime": "string",
79
- "localPath": "string",
80
- "pathSignature": "string",
81
- "sizeBytes": "string"
82
- })
83
-
84
- uploader := smart.structBuilder(RTYPE_BLOB_UPLOAD, json.encode(settings)).lockAndBuild()
85
-
86
- return ll.toStrict({
87
- file: uploader.getField("blob"),
88
- handle: uploader.getField("handle")
89
- })
77
+ validation.assertJsonSchema(settings, {
78
+ "modificationTime": "string",
79
+ "localPath": "string",
80
+ "pathSignature": "string",
81
+ "sizeBytes": "string"
82
+ })
83
+
84
+ uploader := smart.structBuilder(RTYPE_BLOB_UPLOAD, json.encode(settings)).lockAndBuild()
85
+
86
+ return ll.toStrict({
87
+ file: uploader.getField("blob"),
88
+ handle: uploader.getField("handle")
89
+ })
90
90
  }
91
91
 
92
92
  export ll.toStrict({
93
- RTYPE_BLOB_IMPORT_EXTERNAL : RTYPE_BLOB_IMPORT_EXTERNAL,
94
- RTYPE_BLOB_IMPORT_INTERNAL : RTYPE_BLOB_IMPORT_INTERNAL,
95
- RTYPE_BLOB_UPLOAD : RTYPE_BLOB_UPLOAD,
96
- RTYPE_BLOB_DOWNLOAD : RTYPE_BLOB_DOWNLOAD,
97
-
98
- createBlobImportExternal : createBlobImportExternal,
99
- createBlobImportInternal : createBlobImportInternal,
100
- createBlobUpload : createBlobUpload
93
+ RTYPE_BLOB_IMPORT_EXTERNAL : RTYPE_BLOB_IMPORT_EXTERNAL,
94
+ RTYPE_BLOB_IMPORT_INTERNAL : RTYPE_BLOB_IMPORT_INTERNAL,
95
+ RTYPE_BLOB_UPLOAD : RTYPE_BLOB_UPLOAD,
96
+ RTYPE_BLOB_DOWNLOAD : RTYPE_BLOB_DOWNLOAD,
97
+
98
+ createBlobImportExternal : createBlobImportExternal,
99
+ createBlobImportInternal : createBlobImportInternal,
100
+ createBlobUpload : createBlobUpload
101
101
  })
@@ -1,15 +1,15 @@
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
1
+ /**
2
+ * Functions to work with blobs / files.
3
+ *
4
+ * Allowing to create resources to import files from configured storages
5
+ * as well as creation of resources to facilitate file upload from the
6
+ * users machine.
7
+ *
8
+ * This library exposes rather high level functions working with
9
+ * ImportFileHandle, encoding user intent to import a file from a pl-wide
10
+ * configured storage or to upload file from users side in a universal
11
+ * string representation.
12
+ */
13
13
 
14
14
  ll := import("@platforma-sdk/workflow-tengo:ll")
15
15
  smart := import("@platforma-sdk/workflow-tengo:smart")
@@ -18,59 +18,59 @@ blobs := import("@platforma-sdk/workflow-tengo:file.internal")
18
18
 
19
19
  json := import("json")
20
20
 
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
21
+ /**
22
+ * Imports an external file into the workflow, either from pre-configured storage,
23
+ * available from the pl instance, or from the client machine via upload.
24
+ *
25
+ * @param importFileHandle string a string file import handle, in most cases obtained via the
26
+ * LS controller in UI
27
+ *
28
+ * @return a structure with two field references
29
+ * {
30
+ * file: field,
31
+ * handle: field
32
+ * }
33
+ */
34
34
  importFile := func(importFileHandle) {
35
- validation.assertJsonSchema(
36
- importFileHandle,
37
- `string,regex=^(upload://upload/.*|index://index/.*)`
38
- )
39
-
40
- url := ll.parseUrl(importFileHandle)
41
- path := url.Path[1:] // trim "/"
42
-
43
- settings := json.decode(path)
44
-
45
- if url.Scheme == "upload" {
46
- ll.assert(url.Host == "upload", "wrong 'host' in import file handle. Expected: 'upload', found: '", url.Host, "'")
47
- return blobs.createBlobUpload(settings)
48
- } else if url.Scheme == "index" {
49
- ll.assert(url.Host == "index", "wrong 'host' in import file handle. Expected 'index', found: '", url.Host, "'")
50
- return blobs.createBlobImportInternal(settings)
51
- } else if (url.Scheme == "download") {
52
- ll.assert(url.Host == "download", "wrong 'host' in import file handle. Expected: 'download', found: '", url.Host, "'")
53
- return blobs.createBlobImportExternal(settings)
54
- } else {
55
- ll.panic("Unknown file import handle schema: ", url.Scheme)
56
- }
35
+ validation.assertJsonSchema(
36
+ importFileHandle,
37
+ `string,regex=^(upload://upload/.*|index://index/.*)`
38
+ )
39
+
40
+ url := ll.parseUrl(importFileHandle)
41
+ path := url.Path[1:] // trim "/"
42
+
43
+ settings := json.decode(path)
44
+
45
+ if url.Scheme == "upload" {
46
+ ll.assert(url.Host == "upload", "wrong 'host' in import file handle. Expected: 'upload', found: '", url.Host, "'")
47
+ return blobs.createBlobUpload(settings)
48
+ } else if url.Scheme == "index" {
49
+ ll.assert(url.Host == "index", "wrong 'host' in import file handle. Expected 'index', found: '", url.Host, "'")
50
+ return blobs.createBlobImportInternal(settings)
51
+ } else if (url.Scheme == "download") {
52
+ ll.assert(url.Host == "download", "wrong 'host' in import file handle. Expected: 'download', found: '", url.Host, "'")
53
+ return blobs.createBlobImportExternal(settings)
54
+ } else {
55
+ ll.panic("Unknown file import handle schema: ", url.Scheme)
56
+ }
57
57
  }
58
58
 
59
-
60
-
61
-
62
-
59
+ /**
60
+ * Given a reference to the file, converts it into resource that can be
61
+ * downloaded from the UI side.
62
+ */
63
63
  exportFile := func(blob) {
64
- builder := smart.structBuilder(blobs.RTYPE_BLOB_DOWNLOAD)
64
+ builder := smart.structBuilder(blobs.RTYPE_BLOB_DOWNLOAD)
65
65
 
66
- builder.createInputField("blob").set(blob)
66
+ builder.createInputField("blob").set(blob)
67
67
 
68
- downloader := builder.lockAndBuild()
68
+ downloader := builder.lockAndBuild()
69
69
 
70
- return downloader.getField("downloadable")
70
+ return downloader.getField("downloadable")
71
71
  }
72
72
 
73
73
  export ll.toStrict({
74
- importFile: importFile,
75
- exportFile: exportFile
74
+ importFile: importFile,
75
+ exportFile: exportFile
76
76
  })