firefly-compiler 0.5.38 → 0.5.40

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 (128) hide show
  1. package/.hintrc +4 -4
  2. package/.vscode/settings.json +4 -4
  3. package/bin/Release.ff +157 -157
  4. package/bin/firefly.mjs +1 -1
  5. package/compiler/Builder.ff +275 -276
  6. package/compiler/Compiler.ff +234 -234
  7. package/compiler/Dependencies.ff +186 -186
  8. package/compiler/DependencyLock.ff +17 -17
  9. package/compiler/JsEmitter.ff +1437 -1437
  10. package/compiler/LspHook.ff +202 -202
  11. package/compiler/ModuleCache.ff +178 -178
  12. package/compiler/Workspace.ff +88 -88
  13. package/core/.firefly/include/package.json +5 -5
  14. package/core/.firefly/package.ff +2 -2
  15. package/core/Any.ff +25 -25
  16. package/core/Array.ff +298 -298
  17. package/core/Atomic.ff +63 -63
  18. package/core/Box.ff +7 -7
  19. package/core/BrowserSystem.ff +40 -40
  20. package/core/BuildSystem.ff +156 -156
  21. package/core/Crypto.ff +94 -94
  22. package/core/Equal.ff +41 -41
  23. package/core/Error.ff +25 -25
  24. package/core/HttpClient.ff +142 -142
  25. package/core/Instant.ff +24 -24
  26. package/core/Js.ff +305 -305
  27. package/core/JsSystem.ff +135 -135
  28. package/core/Json.ff +423 -423
  29. package/core/List.ff +482 -482
  30. package/core/Lock.ff +108 -108
  31. package/core/NodeSystem.ff +198 -198
  32. package/core/Ordering.ff +160 -160
  33. package/core/Path.ff +377 -377
  34. package/core/Queue.ff +90 -90
  35. package/core/Random.ff +140 -140
  36. package/core/RbMap.ff +216 -216
  37. package/core/Show.ff +44 -44
  38. package/core/SourceLocation.ff +68 -68
  39. package/core/Task.ff +165 -165
  40. package/experimental/benchmarks/ListGrab.ff +23 -23
  41. package/experimental/benchmarks/ListGrab.java +55 -55
  42. package/experimental/benchmarks/Pyrotek45.ff +30 -30
  43. package/experimental/benchmarks/Pyrotek45.java +64 -64
  44. package/experimental/bidirectional/Bidi.ff +88 -88
  45. package/experimental/lines/Main.ff +40 -40
  46. package/experimental/random/Index.ff +53 -53
  47. package/experimental/random/Process.ff +120 -120
  48. package/experimental/random/RunLength.ff +65 -65
  49. package/experimental/random/Scrape.ff +51 -51
  50. package/experimental/random/Symbols.ff +73 -73
  51. package/experimental/random/Tensor.ff +52 -52
  52. package/experimental/random/Units.ff +36 -36
  53. package/experimental/s3/S3TestAuthorizationHeader.ff +39 -39
  54. package/experimental/s3/S3TestPut.ff +16 -16
  55. package/experimental/tests/TestJson.ff +26 -26
  56. package/firefly.sh +0 -0
  57. package/fireflysite/.firefly/package.ff +4 -4
  58. package/fireflysite/CommunityOverview.ff +20 -20
  59. package/fireflysite/CountingButtonDemo.ff +58 -58
  60. package/fireflysite/DocumentParser.ff +325 -325
  61. package/fireflysite/ExamplesOverview.ff +40 -40
  62. package/fireflysite/FrontPage.ff +344 -344
  63. package/fireflysite/GettingStarted.ff +45 -45
  64. package/fireflysite/Guide.ff +456 -456
  65. package/fireflysite/Main.ff +163 -163
  66. package/fireflysite/MatchingPasswordsDemo.ff +82 -82
  67. package/fireflysite/PackagesOverview.ff +49 -49
  68. package/fireflysite/PostgresqlDemo.ff +34 -34
  69. package/fireflysite/ReferenceAll.ff +18 -18
  70. package/fireflysite/ReferenceIntroduction.ff +11 -11
  71. package/fireflysite/Styles.ff +567 -567
  72. package/fireflysite/Test.ff +121 -121
  73. package/fireflysite/assets/markdown/reference/BaseTypes.md +209 -209
  74. package/fireflysite/assets/markdown/reference/EmittedJavascript.md +65 -65
  75. package/fireflysite/assets/markdown/reference/Exceptions.md +101 -101
  76. package/fireflysite/assets/markdown/reference/FunctionsAndMethods.md +364 -364
  77. package/fireflysite/assets/markdown/reference/JavascriptInterop.md +235 -235
  78. package/fireflysite/assets/markdown/reference/ModulesAndPackages.md +162 -162
  79. package/fireflysite/assets/markdown/reference/OldStructuredConcurrency.md +48 -48
  80. package/fireflysite/assets/markdown/reference/PatternMatching.md +224 -224
  81. package/fireflysite/assets/markdown/reference/StatementsAndExpressions.md +86 -86
  82. package/fireflysite/assets/markdown/reference/StructuredConcurrency.md +99 -99
  83. package/fireflysite/assets/markdown/reference/TraitsAndInstances.md +100 -100
  84. package/fireflysite/assets/markdown/reference/UserDefinedTypes.md +184 -184
  85. package/fireflysite/assets/markdown/scratch/ControlFlow.md +136 -136
  86. package/fireflysite/assets/markdown/scratch/Toc.md +40 -40
  87. package/lsp/.firefly/package.ff +1 -1
  88. package/lsp/CompletionHandler.ff +827 -827
  89. package/lsp/Handler.ff +714 -714
  90. package/lsp/HoverHandler.ff +79 -79
  91. package/lsp/LanguageServer.ff +272 -272
  92. package/lsp/SignatureHelpHandler.ff +55 -55
  93. package/lsp/SymbolHandler.ff +181 -181
  94. package/lsp/TestReferences.ff +17 -17
  95. package/lsp/TestReferencesCase.ff +7 -7
  96. package/lsp/stderr.txt +1 -1
  97. package/lsp/stdout.txt +34 -34
  98. package/lux/.firefly/package.ff +1 -1
  99. package/lux/Css.ff +648 -648
  100. package/lux/CssTest.ff +48 -48
  101. package/lux/Lux.ff +608 -608
  102. package/lux/LuxEvent.ff +79 -79
  103. package/lux/Main.ff +123 -123
  104. package/lux/Main2.ff +143 -143
  105. package/lux/TestDry.ff +28 -28
  106. package/output/js/ff/compiler/Builder.mjs +36 -38
  107. package/package.json +1 -1
  108. package/rpc/.firefly/package.ff +1 -1
  109. package/rpc/Rpc.ff +70 -70
  110. package/s3/.firefly/package.ff +1 -1
  111. package/s3/S3.ff +92 -92
  112. package/vscode/LICENSE.txt +21 -21
  113. package/vscode/Prepublish.ff +15 -15
  114. package/vscode/README.md +16 -16
  115. package/vscode/client/package-lock.json +544 -544
  116. package/vscode/client/package.json +22 -22
  117. package/vscode/client/src/extension.ts +104 -104
  118. package/vscode/icons/firefly-icon.svg +10 -10
  119. package/vscode/language-configuration.json +61 -61
  120. package/vscode/package-lock.json +3623 -3623
  121. package/vscode/package.json +1 -1
  122. package/vscode/snippets.json +241 -241
  123. package/vscode/syntaxes/firefly-markdown-injection.json +45 -45
  124. package/webserver/.firefly/include/package.json +5 -5
  125. package/webserver/.firefly/package.ff +2 -2
  126. package/webserver/WebServer.ff +647 -647
  127. package/websocket/.firefly/package.ff +1 -1
  128. package/websocket/WebSocket.ff +100 -100
package/lux/Main2.ff CHANGED
@@ -1,143 +1,143 @@
1
- import HttpServer from ff:httpserver
2
-
3
- import Lux
4
- import LuxEvent
5
-
6
-
7
- mainComponent(lux: Lux, system: BrowserSystem) {
8
- sleepComponent(lux, system)
9
- }
10
-
11
- sleepComponent(lux: Lux, system: BrowserSystem) {
12
- lux.useState(False): start, setStart =>
13
- if(start) {
14
- lux.useSuspense {
15
- lux.div {
16
- lux.div {lux.text("Sleeping")}
17
- lux.button {
18
- lux.text("Cancel")
19
- lux.onClick {event =>
20
- event.preventDefault()
21
- setStart(False)
22
- }
23
- }
24
- }
25
- } {lux =>
26
- trySleep(lux.task, "A")
27
- lux.div {lux.text("Done sleeping")}
28
- }
29
- } else {
30
- lux.button {
31
- lux.text("Start")
32
- lux.onClick {event =>
33
- event.preventDefault()
34
- setStart(True)
35
- }
36
- }
37
- }
38
- }
39
-
40
- ifComponent(lux: Lux, system: BrowserSystem) {
41
- lux.useState(False): start, setStart =>
42
- if(start) {
43
- lux.div {lux.text("Started")}
44
- } else {
45
- lux.button {
46
- lux.text("Start")
47
- lux.onClick {event =>
48
- event.preventDefault()
49
- setStart(True)
50
- }
51
- }
52
- }
53
- }
54
-
55
- rhymeComponent(lux: Lux, system: BrowserSystem) {
56
- lux.div {
57
- lux.useState(0): count, setCount =>
58
- Log.debug("useState(0)")
59
- lux.useState("Ɛ"): text, setText =>
60
- lux.div {
61
- lux.button {
62
- lux.text("Count: " + count)
63
- lux.onClick {event =>
64
- setCount(count + 1)
65
- }
66
- }
67
- lux.div {
68
- lux.useCallback1(setText): setText =>
69
- lux.useLazy1(text): text =>
70
- lux.div {
71
- lux.div {
72
- lux.text("Text: " + text + " -> ")
73
- lux.useSuspense {lux.span {lux.text("Rhyming...")}} {lux =>
74
- lux.span {
75
- lux.text(rhyme(system, text))
76
- }
77
- }
78
- }
79
- lux.input {
80
- lux.setValue(text)
81
- Log.debug("setValue: " + text)
82
- lux.onInput {event =>
83
- Log.debug(text + " -> " + event.text())
84
- setText(event.text())
85
- }
86
- }
87
- }
88
- }
89
- }
90
- }
91
- }
92
-
93
-
94
- rhyme(system: BrowserSystem, text: String): String {
95
- let json = system.httpClient().get("https://api.datamuse.com/words?rel_rhy=" + text, []) {_.readJson()}
96
- json.index(0).field("word").getString().else {"?"}
97
- }
98
-
99
- browserMain(system: BrowserSystem): Unit {
100
- Lux.renderById(system, "main") {lux =>
101
- lux.div {
102
- mainComponent(lux, system)
103
- }
104
- }
105
- }
106
-
107
- nodeMain(system: NodeSystem): Unit {
108
- HttpServer.listen(system, "localhost", 8080) {request, response =>
109
- if(request.path() == "/") {
110
- response.setHeader("Content-Type", ["text/html; charset=UTF-8"])
111
- response.writeText("<!doctype html>")
112
- response.writeText("<div id='main'></div>")
113
- response.writeText("<script type='module' src='/js/script/script/Main2.mjs'></script>")
114
- } elseIf {request.path().startsWith("/js/") && !request.path().contains("..")} {
115
- response.setHeader("Content-Type", ["text/javascript; charset=UTF-8"])
116
- response.writeText(system.assets().readText(request.path()))
117
- } elseIf {request.path() == "/chat"} {
118
- system.mainTask().sleep(Duration(request.readText().size().toFloat()))
119
- response.setHeader("Content-Type", ["text/plain; charset=UTF-8"])
120
- response.writeText("Hello there!")
121
- } else {
122
- response.writeStatus(404, Some("Not found"))
123
- }
124
- }
125
- }
126
-
127
- buildMain(system: BuildSystem) {
128
- let browser = system.compileForBrowser("Main2.ff")
129
- let assets = AssetSystem.create().addAssets("/js", browser.assets())
130
- system.setAssets(assets)
131
- }
132
-
133
- trySleep(task: Task, name: String) {
134
- try {
135
- task.sleep(Duration(4.0))
136
- Log.debug("Slept!")
137
- } catchAny {error =>
138
- if(error.name() == "AbortError") {
139
- Log.debug(name + " aborted")
140
- }
141
- error.rethrow()
142
- }
143
- }
1
+ import HttpServer from ff:httpserver
2
+
3
+ import Lux
4
+ import LuxEvent
5
+
6
+
7
+ mainComponent(lux: Lux, system: BrowserSystem) {
8
+ sleepComponent(lux, system)
9
+ }
10
+
11
+ sleepComponent(lux: Lux, system: BrowserSystem) {
12
+ lux.useState(False): start, setStart =>
13
+ if(start) {
14
+ lux.useSuspense {
15
+ lux.div {
16
+ lux.div {lux.text("Sleeping")}
17
+ lux.button {
18
+ lux.text("Cancel")
19
+ lux.onClick {event =>
20
+ event.preventDefault()
21
+ setStart(False)
22
+ }
23
+ }
24
+ }
25
+ } {lux =>
26
+ trySleep(lux.task, "A")
27
+ lux.div {lux.text("Done sleeping")}
28
+ }
29
+ } else {
30
+ lux.button {
31
+ lux.text("Start")
32
+ lux.onClick {event =>
33
+ event.preventDefault()
34
+ setStart(True)
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ ifComponent(lux: Lux, system: BrowserSystem) {
41
+ lux.useState(False): start, setStart =>
42
+ if(start) {
43
+ lux.div {lux.text("Started")}
44
+ } else {
45
+ lux.button {
46
+ lux.text("Start")
47
+ lux.onClick {event =>
48
+ event.preventDefault()
49
+ setStart(True)
50
+ }
51
+ }
52
+ }
53
+ }
54
+
55
+ rhymeComponent(lux: Lux, system: BrowserSystem) {
56
+ lux.div {
57
+ lux.useState(0): count, setCount =>
58
+ Log.debug("useState(0)")
59
+ lux.useState("Ɛ"): text, setText =>
60
+ lux.div {
61
+ lux.button {
62
+ lux.text("Count: " + count)
63
+ lux.onClick {event =>
64
+ setCount(count + 1)
65
+ }
66
+ }
67
+ lux.div {
68
+ lux.useCallback1(setText): setText =>
69
+ lux.useLazy1(text): text =>
70
+ lux.div {
71
+ lux.div {
72
+ lux.text("Text: " + text + " -> ")
73
+ lux.useSuspense {lux.span {lux.text("Rhyming...")}} {lux =>
74
+ lux.span {
75
+ lux.text(rhyme(system, text))
76
+ }
77
+ }
78
+ }
79
+ lux.input {
80
+ lux.setValue(text)
81
+ Log.debug("setValue: " + text)
82
+ lux.onInput {event =>
83
+ Log.debug(text + " -> " + event.text())
84
+ setText(event.text())
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+
94
+ rhyme(system: BrowserSystem, text: String): String {
95
+ let json = system.httpClient().get("https://api.datamuse.com/words?rel_rhy=" + text, []) {_.readJson()}
96
+ json.index(0).field("word").getString().else {"?"}
97
+ }
98
+
99
+ browserMain(system: BrowserSystem): Unit {
100
+ Lux.renderById(system, "main") {lux =>
101
+ lux.div {
102
+ mainComponent(lux, system)
103
+ }
104
+ }
105
+ }
106
+
107
+ nodeMain(system: NodeSystem): Unit {
108
+ HttpServer.listen(system, "localhost", 8080) {request, response =>
109
+ if(request.path() == "/") {
110
+ response.setHeader("Content-Type", ["text/html; charset=UTF-8"])
111
+ response.writeText("<!doctype html>")
112
+ response.writeText("<div id='main'></div>")
113
+ response.writeText("<script type='module' src='/js/script/script/Main2.mjs'></script>")
114
+ } elseIf {request.path().startsWith("/js/") && !request.path().contains("..")} {
115
+ response.setHeader("Content-Type", ["text/javascript; charset=UTF-8"])
116
+ response.writeText(system.assets().readText(request.path()))
117
+ } elseIf {request.path() == "/chat"} {
118
+ system.mainTask().sleep(Duration(request.readText().size().toFloat()))
119
+ response.setHeader("Content-Type", ["text/plain; charset=UTF-8"])
120
+ response.writeText("Hello there!")
121
+ } else {
122
+ response.writeStatus(404, Some("Not found"))
123
+ }
124
+ }
125
+ }
126
+
127
+ buildMain(system: BuildSystem) {
128
+ let browser = system.compileForBrowser("Main2.ff")
129
+ let assets = AssetSystem.create().addAssets("/js", browser.assets())
130
+ system.setAssets(assets)
131
+ }
132
+
133
+ trySleep(task: Task, name: String) {
134
+ try {
135
+ task.sleep(Duration(4.0))
136
+ Log.debug("Slept!")
137
+ } catchAny {error =>
138
+ if(error.name() == "AbortError") {
139
+ Log.debug(name + " aborted")
140
+ }
141
+ error.rethrow()
142
+ }
143
+ }
package/lux/TestDry.ff CHANGED
@@ -1,28 +1,28 @@
1
- import Lux
2
-
3
- nodeMain(system: NodeSystem) {
4
-
5
-
6
-
7
- let html = Lux.renderToString(system, render)
8
- Log.trace(html.first)
9
-
10
- }
11
-
12
- render(lux: Lux): Unit {
13
- lux.div {
14
- lux.set("id", "its-me")
15
- lux.span {
16
- lux.text("Hello")
17
- lux.keyed("noegle"):
18
- lux.div {
19
- lux.set("id", "it's \"a-me\"")
20
- lux.span {
21
- lux.text("Hello ]]>")
22
- }
23
- lux.text("Hi")
24
- }
25
- }
26
- lux.text("Hi")
27
- }
28
- }
1
+ import Lux
2
+
3
+ nodeMain(system: NodeSystem) {
4
+
5
+
6
+
7
+ let html = Lux.renderToString(system, render)
8
+ Log.trace(html.first)
9
+
10
+ }
11
+
12
+ render(lux: Lux): Unit {
13
+ lux.div {
14
+ lux.set("id", "its-me")
15
+ lux.span {
16
+ lux.text("Hello")
17
+ lux.keyed("noegle"):
18
+ lux.div {
19
+ lux.set("id", "it's \"a-me\"")
20
+ lux.span {
21
+ lux.text("Hello ]]>")
22
+ }
23
+ lux.text("Hi")
24
+ }
25
+ }
26
+ lux.text("Hi")
27
+ }
28
+ }
@@ -163,7 +163,6 @@ for(let for_a = info_.includes_, for_i = 0, for_l = for_a.length; for_i < for_l;
163
163
  const include_ = for_a[for_i];
164
164
  const fromPath_ = ff_core_Path.Path_slash(ff_core_Path.Path_slash(ff_core_Path.Path_slash(packagePath_, ".firefly"), "include"), include_.path_);
165
165
  const toPath_ = ff_core_Path.Path_slash(ff_core_Path.Path_slash(jsPathFile_, ff_compiler_Syntax.PackagePair_groupName(info_.package_.packagePair_, "/")), include_.path_);
166
- ff_core_Log.debug_(((("Linking: " + fromPath_.absolutePath_) + " -> ") + toPath_.absolutePath_));
167
166
  ff_core_Path.Path_createSymlinkTo(toPath_, fromPath_, true)
168
167
  }
169
168
  }
@@ -319,24 +318,24 @@ ff_core_Path.Path_writeStream(p_, makeStream_(), false)
319
318
  return
320
319
  }
321
320
  }));
322
- const json_ = `{
323
- "name": "main",
324
- "bin": {
325
- "firefly-main": "Main.bundle.js"
326
- },
327
- "devDependencies": {
328
- "pkg": "^5.8.0"
329
- },
330
- "pkg": {
331
- "scripts": "Main.bundle.js",
332
- "outputPath": "bin",
333
- "assets": ["../assets/**/*"],
334
- "targets": [
335
- "node18-linux-x64",
336
- "node18-macos-x64",
337
- "node18-win-x64"
338
- ]
339
- }
321
+ const json_ = `{
322
+ "name": "main",
323
+ "bin": {
324
+ "firefly-main": "Main.bundle.js"
325
+ },
326
+ "devDependencies": {
327
+ "pkg": "^5.8.0"
328
+ },
329
+ "pkg": {
330
+ "scripts": "Main.bundle.js",
331
+ "outputPath": "bin",
332
+ "assets": ["../assets/**/*"],
333
+ "targets": [
334
+ "node18-linux-x64",
335
+ "node18-macos-x64",
336
+ "node18-win-x64"
337
+ ]
338
+ }
340
339
  }`;
341
340
  const packageFile_ = ff_core_Path.Path_slash(outputPath_, "executable/package.json");
342
341
  ff_core_Path.Path_writeText(packageFile_, json_);
@@ -386,7 +385,6 @@ for(let for_a = info_.includes_, for_i = 0, for_l = for_a.length; for_i < for_l;
386
385
  const include_ = for_a[for_i];
387
386
  const fromPath_ = (await ff_core_Path.Path_slash$((await ff_core_Path.Path_slash$((await ff_core_Path.Path_slash$(packagePath_, ".firefly", $task)), "include", $task)), include_.path_, $task));
388
387
  const toPath_ = (await ff_core_Path.Path_slash$((await ff_core_Path.Path_slash$(jsPathFile_, ff_compiler_Syntax.PackagePair_groupName(info_.package_.packagePair_, "/"), $task)), include_.path_, $task));
389
- ff_core_Log.debug_(((("Linking: " + fromPath_.absolutePath_) + " -> ") + toPath_.absolutePath_));
390
388
  (await ff_core_Path.Path_createSymlinkTo$(toPath_, fromPath_, true, $task))
391
389
  }
392
390
  }
@@ -542,24 +540,24 @@ const p_ = (await ff_core_Path.Path_slash$(assetOutputPath_, path_, $task));
542
540
  return
543
541
  }
544
542
  }), $task));
545
- const json_ = `{
546
- "name": "main",
547
- "bin": {
548
- "firefly-main": "Main.bundle.js"
549
- },
550
- "devDependencies": {
551
- "pkg": "^5.8.0"
552
- },
553
- "pkg": {
554
- "scripts": "Main.bundle.js",
555
- "outputPath": "bin",
556
- "assets": ["../assets/**/*"],
557
- "targets": [
558
- "node18-linux-x64",
559
- "node18-macos-x64",
560
- "node18-win-x64"
561
- ]
562
- }
543
+ const json_ = `{
544
+ "name": "main",
545
+ "bin": {
546
+ "firefly-main": "Main.bundle.js"
547
+ },
548
+ "devDependencies": {
549
+ "pkg": "^5.8.0"
550
+ },
551
+ "pkg": {
552
+ "scripts": "Main.bundle.js",
553
+ "outputPath": "bin",
554
+ "assets": ["../assets/**/*"],
555
+ "targets": [
556
+ "node18-linux-x64",
557
+ "node18-macos-x64",
558
+ "node18-win-x64"
559
+ ]
560
+ }
563
561
  }`;
564
562
  const packageFile_ = (await ff_core_Path.Path_slash$(outputPath_, "executable/package.json", $task));
565
563
  (await ff_core_Path.Path_writeText$(packageFile_, json_, $task));
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "description": "Firefly compiler",
5
5
  "author": "Firefly team",
6
6
  "license": "MIT",
7
- "version": "0.5.38",
7
+ "version": "0.5.40",
8
8
  "repository": {
9
9
  "type": "git",
10
10
  "url": "https://github.com/Ahnfelt/firefly-boot"
@@ -1 +1 @@
1
- package ff:rpc:0.0.0
1
+ package ff:rpc:0.0.0
package/rpc/Rpc.ff CHANGED
@@ -1,70 +1,70 @@
1
- trait I: Rpc[O] {}
2
-
3
- capability RpcServer[I, O, C](
4
- handlers: StringMap[(C, I) => O]
5
- )
6
-
7
- newServer[I, O, C](): RpcServer[I, O, C] {
8
- RpcServer(StringMap.new())
9
- }
10
-
11
- extend self[I, O, C]: RpcServer[I, O, C] {
12
- handle(name: String, context: C, input: I): Option[O] {
13
- self.handlers.get(name).map {handler =>
14
- handler(context, input)
15
- }
16
- }
17
-
18
- addCustom(
19
- handler: (C, I) => O
20
- ): Unit {
21
- let name = "TODO"
22
- self.handlers.set(name) {context, input =>
23
- handler(context, input)
24
- }
25
- }
26
- }
27
-
28
- extend self[C]: RpcServer[Buffer, Buffer, C] {
29
- add[I: Rpc[O]: HasAnyTag: Serializable, O: Serializable](
30
- handler: (C, I) => O
31
- ): Unit {
32
- let name = Any.anyTag[I]().show()
33
- self.handlers.set(name) {context, message =>
34
- let input = Serializable.deserialize(message)
35
- let output = handler(context, input)
36
- Serializable.serialize(output)
37
- }
38
- }
39
- }
40
-
41
- capability RpcClient(
42
- binaryCall: (String, Buffer) => Buffer
43
- )
44
-
45
- extend self: RpcClient {
46
- call[I: Rpc[O]: HasAnyTag: Serializable, O: Serializable](
47
- message: I
48
- ): O {
49
- let name = Any.anyTag[I]().show()
50
- let input = Serializable.serialize(message)
51
- let response = self.binaryCall(name, input)
52
- Serializable.deserialize(response)
53
- }
54
- }
55
-
56
- newClient(
57
- httpClient: HttpClient
58
- prefix: String
59
- method: String = "POST"
60
- ): RpcClient {
61
- RpcClient {name, buffer =>
62
- httpClient.fetch(
63
- method = method
64
- url = prefix + name
65
- headers = []
66
- payload = Some(buffer)
67
- options = FetchOptions()
68
- ) {_.readBuffer()}
69
- }
70
- }
1
+ trait I: Rpc[O] {}
2
+
3
+ capability RpcServer[I, O, C](
4
+ handlers: StringMap[(C, I) => O]
5
+ )
6
+
7
+ newServer[I, O, C](): RpcServer[I, O, C] {
8
+ RpcServer(StringMap.new())
9
+ }
10
+
11
+ extend self[I, O, C]: RpcServer[I, O, C] {
12
+ handle(name: String, context: C, input: I): Option[O] {
13
+ self.handlers.get(name).map {handler =>
14
+ handler(context, input)
15
+ }
16
+ }
17
+
18
+ addCustom(
19
+ handler: (C, I) => O
20
+ ): Unit {
21
+ let name = "TODO"
22
+ self.handlers.set(name) {context, input =>
23
+ handler(context, input)
24
+ }
25
+ }
26
+ }
27
+
28
+ extend self[C]: RpcServer[Buffer, Buffer, C] {
29
+ add[I: Rpc[O]: HasAnyTag: Serializable, O: Serializable](
30
+ handler: (C, I) => O
31
+ ): Unit {
32
+ let name = Any.anyTag[I]().show()
33
+ self.handlers.set(name) {context, message =>
34
+ let input = Serializable.deserialize(message)
35
+ let output = handler(context, input)
36
+ Serializable.serialize(output)
37
+ }
38
+ }
39
+ }
40
+
41
+ capability RpcClient(
42
+ binaryCall: (String, Buffer) => Buffer
43
+ )
44
+
45
+ extend self: RpcClient {
46
+ call[I: Rpc[O]: HasAnyTag: Serializable, O: Serializable](
47
+ message: I
48
+ ): O {
49
+ let name = Any.anyTag[I]().show()
50
+ let input = Serializable.serialize(message)
51
+ let response = self.binaryCall(name, input)
52
+ Serializable.deserialize(response)
53
+ }
54
+ }
55
+
56
+ newClient(
57
+ httpClient: HttpClient
58
+ prefix: String
59
+ method: String = "POST"
60
+ ): RpcClient {
61
+ RpcClient {name, buffer =>
62
+ httpClient.fetch(
63
+ method = method
64
+ url = prefix + name
65
+ headers = []
66
+ payload = Some(buffer)
67
+ options = FetchOptions()
68
+ ) {_.readBuffer()}
69
+ }
70
+ }
@@ -1 +1 @@
1
- package ff:s3:0.0.0
1
+ package ff:s3:0.0.0