@platforma-sdk/workflow-tengo 2.9.6 → 2.9.7
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.
- package/dist/tengo/lib/assets.lib.tengo +52 -52
- package/dist/tengo/lib/assets.swinfo.lib.tengo +45 -45
- package/dist/tengo/lib/constants.lib.tengo +32 -32
- package/dist/tengo/lib/exec.R.internal.lib.tengo +29 -29
- package/dist/tengo/lib/exec.R.lib.tengo +166 -166
- package/dist/tengo/lib/exec.constants.lib.tengo +4 -4
- package/dist/tengo/lib/exec.descriptor.lib.tengo +31 -31
- package/dist/tengo/lib/exec.internal.lib.tengo +297 -297
- package/dist/tengo/lib/exec.lib.tengo +815 -815
- package/dist/tengo/lib/exec.monetization.lib.tengo +130 -130
- package/dist/tengo/lib/exec.package.lib.tengo +212 -212
- package/dist/tengo/lib/exec.python.internal.lib.tengo +6 -6
- package/dist/tengo/lib/exec.python.lib.tengo +146 -146
- package/dist/tengo/lib/exec.runcmd.lib.tengo +371 -371
- package/dist/tengo/lib/exec.runenv.lib.tengo +92 -92
- package/dist/tengo/lib/exec.stream.lib.tengo +40 -40
- package/dist/tengo/lib/file.internal.lib.tengo +77 -77
- package/dist/tengo/lib/file.lib.tengo +57 -57
- package/dist/tengo/lib/ll.lib.tengo +244 -244
- package/dist/tengo/lib/maps.lib.tengo +152 -152
- package/dist/tengo/lib/objects.lib.tengo +13 -13
- package/dist/tengo/lib/oop.lib.tengo +19 -19
- package/dist/tengo/lib/path.lib.tengo +125 -125
- package/dist/tengo/lib/pframes.constants.lib.tengo +28 -28
- package/dist/tengo/lib/pframes.export-pcolumn.lib.tengo +33 -33
- package/dist/tengo/lib/pframes.lib.tengo +43 -43
- package/dist/tengo/lib/pframes.ll.lib.tengo +72 -72
- package/dist/tengo/lib/pframes.pcolumn.lib.tengo +49 -49
- package/dist/tengo/lib/pframes.spec.lib.tengo +96 -96
- package/dist/tengo/lib/pframes.util.lib.tengo +288 -288
- package/dist/tengo/lib/pframes.xsv.lib.tengo +272 -272
- package/dist/tengo/lib/render.lib.tengo +75 -75
- package/dist/tengo/lib/sets.lib.tengo +68 -68
- package/dist/tengo/lib/slices.lib.tengo +258 -155
- package/dist/tengo/lib/smart.lib.tengo +1069 -1069
- package/dist/tengo/lib/test.lib.tengo +161 -161
- package/dist/tengo/lib/tpl.lib.tengo +515 -515
- package/dist/tengo/lib/tpl.state-await.lib.tengo +240 -240
- package/dist/tengo/lib/tpl.util.lib.tengo +9 -9
- package/dist/tengo/lib/validation.lib.tengo +378 -378
- package/dist/tengo/lib/workdir.lib.tengo +331 -331
- package/dist/tengo/lib/workdir.proc.lib.tengo +144 -144
- package/dist/tengo/lib/workdir.save.lib.tengo +130 -130
- package/dist/tengo/lib/workflow.bobject.lib.tengo +26 -26
- package/dist/tengo/lib/workflow.bquery.lib.tengo +165 -165
- package/dist/tengo/lib/workflow.constants.lib.tengo +2 -2
- package/dist/tengo/lib/workflow.context.lib.tengo +32 -32
- package/dist/tengo/lib/workflow.lib.tengo +206 -206
- package/dist/tengo/tpl/exec.R.create-renv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.exec.plj.gz +0 -0
- package/dist/tengo/tpl/exec.monetization_to_json.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.create-venv.plj.gz +0 -0
- package/dist/tengo/tpl/exec.python.install-deps.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.aggregate.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-multiple-pcolumns.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.export-single-pcolumn.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.import-dir.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.map-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-export-pframe.plj.gz +0 -0
- package/dist/tengo/tpl/pframes.xsv-import-map.plj.gz +0 -0
- package/dist/tengo/tpl/workdir.save.plj.gz +0 -0
- package/dist/tengo/tpl/workflow.build-ctx.plj.gz +0 -0
- package/package.json +1 -1
|
@@ -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
|
})
|