firefly-compiler 0.4.31 → 0.4.32
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/bin/Release.ff +6 -0
- package/compiler/Builder.ff +15 -7
- package/compiler/Compiler.ff +13 -8
- package/compiler/Dependencies.ff +24 -17
- package/compiler/DependencyLock.ff +17 -0
- package/compiler/Deriver.ff +2 -1
- package/compiler/Dictionaries.ff +4 -4
- package/compiler/Environment.ff +3 -3
- package/compiler/Inference.ff +7 -7
- package/compiler/JsEmitter.ff +2 -2
- package/compiler/JsImporter.ff +2 -2
- package/compiler/LspHook.ff +2 -2
- package/compiler/Main.ff +22 -8
- package/compiler/ModuleCache.ff +6 -6
- package/compiler/Parser.ff +36 -36
- package/compiler/Resolver.ff +7 -7
- package/compiler/Syntax.ff +1 -1
- package/compiler/Tokenizer.ff +2 -2
- package/compiler/Unification.ff +3 -3
- package/compiler/Wildcards.ff +1 -1
- package/core/.firefly/include/package-lock.json +96 -96
- package/core/.firefly/include/package.json +1 -1
- package/core/Array.ff +2 -2
- package/core/Atomic.ff +1 -1
- package/core/Buffer.ff +1 -1
- package/core/Int.ff +2 -2
- package/core/IntMap.ff +4 -4
- package/core/Json.ff +5 -5
- package/core/List.ff +15 -15
- package/core/Map.ff +1 -1
- package/core/NodeSystem.ff +85 -0
- package/core/Option.ff +10 -3
- package/core/Random.ff +1 -1
- package/core/RbMap.ff +1 -1
- package/core/Serializable.ff +2 -2
- package/core/Set.ff +2 -2
- package/core/Stream.ff +4 -4
- package/core/StringMap.ff +4 -4
- package/experimental/random/Index.ff +53 -0
- package/experimental/random/MapTest.ff +2 -2
- package/experimental/random/Process.ff +120 -0
- package/experimental/random/RunLength.ff +2 -2
- package/experimental/random/Symbols.ff +2 -2
- package/lsp/CompletionHandler.ff +3 -6
- package/lsp/Handler.ff +45 -24
- package/lsp/LanguageServer.ff +13 -3
- package/lsp/SymbolHandler.ff +2 -2
- package/lsp/TestReferences.ff +2 -2
- package/lux/Lux.ff +6 -6
- package/output/js/ff/compiler/Builder.mjs +40 -28
- package/output/js/ff/compiler/Compiler.mjs +38 -14
- package/output/js/ff/compiler/Dependencies.mjs +30 -16
- package/output/js/ff/compiler/DependencyLock.mjs +128 -0
- package/output/js/ff/compiler/Deriver.mjs +4 -4
- package/output/js/ff/compiler/Dictionaries.mjs +8 -8
- package/output/js/ff/compiler/Environment.mjs +6 -6
- package/output/js/ff/compiler/Inference.mjs +12 -12
- package/output/js/ff/compiler/JsEmitter.mjs +4 -4
- package/output/js/ff/compiler/JsImporter.mjs +4 -4
- package/output/js/ff/compiler/LspHook.mjs +4 -4
- package/output/js/ff/compiler/Main.mjs +14 -12
- package/output/js/ff/compiler/ModuleCache.mjs +4 -4
- package/output/js/ff/compiler/Parser.mjs +72 -72
- package/output/js/ff/compiler/Resolver.mjs +14 -14
- package/output/js/ff/compiler/Syntax.mjs +2 -2
- package/output/js/ff/compiler/Tokenizer.mjs +4 -4
- package/output/js/ff/compiler/Unification.mjs +4 -4
- package/output/js/ff/compiler/Wildcards.mjs +2 -2
- package/output/js/ff/core/Array.mjs +5 -5
- package/output/js/ff/core/Atomic.mjs +3 -3
- package/output/js/ff/core/Buffer.mjs +3 -3
- package/output/js/ff/core/Int.mjs +4 -4
- package/output/js/ff/core/IntMap.mjs +9 -9
- package/output/js/ff/core/Json.mjs +10 -10
- package/output/js/ff/core/List.mjs +31 -31
- package/output/js/ff/core/Map.mjs +2 -2
- package/output/js/ff/core/NodeSystem.mjs +119 -0
- package/output/js/ff/core/Option.mjs +28 -2
- package/output/js/ff/core/Random.mjs +2 -2
- package/output/js/ff/core/RbMap.mjs +2 -2
- package/output/js/ff/core/Serializable.mjs +4 -4
- package/output/js/ff/core/Set.mjs +4 -4
- package/output/js/ff/core/Stream.mjs +8 -8
- package/output/js/ff/core/StringMap.mjs +9 -9
- package/package.json +1 -1
- package/postgresql/Pg.ff +2 -2
- package/rpc/Rpc.ff +3 -3
- package/vscode/package.json +1 -1
- package/webserver/WebServer.ff +2 -2
- package/httpserver/.firefly/package.ff +0 -1
- package/httpserver/HttpServer.ff +0 -184
package/httpserver/HttpServer.ff
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
capability HttpRequest {}
|
|
2
|
-
capability HttpResponse {}
|
|
3
|
-
|
|
4
|
-
listen(system: NodeSystem, host: String, port: Int, handler: (HttpRequest, HttpResponse) => Unit): Unit
|
|
5
|
-
target node async """
|
|
6
|
-
import * as http from 'http'
|
|
7
|
-
ff_core_Task.Task_throwIfAborted($task)
|
|
8
|
-
const server = http.createServer(async (req, res) => {
|
|
9
|
-
try {
|
|
10
|
-
const channel = ff_core_Task.Task_channel($task)
|
|
11
|
-
ff_core_Task.Task_spawn($task, async task => {
|
|
12
|
-
try {
|
|
13
|
-
await handler_(req, res, task)
|
|
14
|
-
} finally {
|
|
15
|
-
await ff_core_Channel.Channel_write$(channel, null, task)
|
|
16
|
-
}
|
|
17
|
-
})
|
|
18
|
-
await ff_core_Channel.Channel_read$(channel, $task)
|
|
19
|
-
if(!res.headersSent) res.writeHead(200, 'OK')
|
|
20
|
-
} finally {
|
|
21
|
-
if(!res.headersSent) res.writeHead(500, 'Internal Server Error')
|
|
22
|
-
if(!res.writableEnded) res.end()
|
|
23
|
-
}
|
|
24
|
-
})
|
|
25
|
-
await new Promise((resolve, reject) => {
|
|
26
|
-
server.listen(port_, host_, error => {if(error != null) reject(error); else resolve()})
|
|
27
|
-
})
|
|
28
|
-
await new Promise((resolve, reject) => {
|
|
29
|
-
const abort = () => {
|
|
30
|
-
$task.controller.signal.removeEventListener('abort', abort)
|
|
31
|
-
const reason = $task.controller.signal.reason
|
|
32
|
-
$task.controller = new AbortController()
|
|
33
|
-
server.close(() => reject(reason))
|
|
34
|
-
}
|
|
35
|
-
$task.controller.signal.addEventListener('abort', abort)
|
|
36
|
-
})
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
extend self: HttpRequest {
|
|
41
|
-
|
|
42
|
-
method(): String
|
|
43
|
-
target node async "return self_.method"
|
|
44
|
-
|
|
45
|
-
path(): String
|
|
46
|
-
target node async """
|
|
47
|
-
let i = self_.url.indexOf('?')
|
|
48
|
-
return i === -1 ? self_.url : self_.url.slice(0, i)
|
|
49
|
-
"""
|
|
50
|
-
|
|
51
|
-
parameters(): Option[String]
|
|
52
|
-
target node async """
|
|
53
|
-
let i = self_.url.indexOf('?')
|
|
54
|
-
return i === -1 ? ff_core_Option.None() : ff_core_Option.Some(self_.url.slice(i + 1))
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
|
-
parameter(name: String): Option[String]
|
|
58
|
-
target node async """
|
|
59
|
-
let i = self_.url.indexOf('?')
|
|
60
|
-
if(i === -1) return ff_core_Option.None()
|
|
61
|
-
let ps = self_.url.slice(i + 1).split('&')
|
|
62
|
-
let n = name_ + '='
|
|
63
|
-
let r = ps.find(p => p === name_ || p.startsWith(n))
|
|
64
|
-
if(r == null) return ff_core_Option.None()
|
|
65
|
-
return ff_core_Option.Some(r.slice(name_.length + 1))
|
|
66
|
-
"""
|
|
67
|
-
|
|
68
|
-
header(name: String): Option[String]
|
|
69
|
-
target node async """
|
|
70
|
-
let header = self_.headers[name_.toLowerCase()]
|
|
71
|
-
if(header == null || header.length == 0) ff_core_Option.None()
|
|
72
|
-
return ff_core_Option.Some(Array.isArray(header) ? header[0] : header)
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
encoding(): Option[String]
|
|
76
|
-
target node async """
|
|
77
|
-
return self_.readableEncoding ? ff_core_Option.Some(self_.readableEncoding) : ff_core_Option.None()
|
|
78
|
-
"""
|
|
79
|
-
|
|
80
|
-
readText(encoding: Option[String] = None): String {
|
|
81
|
-
self.readStream().toString(encoding.else {self.encoding().else {"utf8"}})
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
readBuffer(): Buffer {
|
|
85
|
-
self.readStream().toBuffer()
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
readStream(): Stream[Buffer]
|
|
89
|
-
target node async """
|
|
90
|
-
import * as http from 'http'
|
|
91
|
-
let task = null
|
|
92
|
-
let readable = self_
|
|
93
|
-
let doResolve = null
|
|
94
|
-
let doReject = null
|
|
95
|
-
let seenError = null
|
|
96
|
-
const abort = () => {
|
|
97
|
-
if(task != null) {
|
|
98
|
-
task.controller.signal.removeEventListener('abort', abort)
|
|
99
|
-
readable.destroy()
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
function open($task) {
|
|
103
|
-
ff_core_Task.Task_throwIfAborted($task)
|
|
104
|
-
if(self_.streamWorkaround != null) throw new Error("Can't open HttpRequest body stream twice")
|
|
105
|
-
task = $task
|
|
106
|
-
self_.streamWorkaround = true
|
|
107
|
-
readable.on('readable', () => {
|
|
108
|
-
if(doResolve != null) doResolve()
|
|
109
|
-
})
|
|
110
|
-
readable.on('error', error => {
|
|
111
|
-
task.controller.signal.removeEventListener('abort', abort)
|
|
112
|
-
seenError = error
|
|
113
|
-
if(doReject != null) doReject(error)
|
|
114
|
-
})
|
|
115
|
-
readable.on('close', () => {
|
|
116
|
-
task.controller.signal.removeEventListener('abort', abort)
|
|
117
|
-
if(doResolve != null) doResolve()
|
|
118
|
-
})
|
|
119
|
-
$task.controller.signal.addEventListener('abort', abort)
|
|
120
|
-
}
|
|
121
|
-
return ff_core_Stream.Stream(async function go($task) {
|
|
122
|
-
if(task == null) open($task)
|
|
123
|
-
let buffer = readable.read()
|
|
124
|
-
if(buffer != null) return ff_core_Option.Some(buffer)
|
|
125
|
-
if(seenError != null) throw seenError
|
|
126
|
-
if(readable.destroyed) return ff_core_Option.None()
|
|
127
|
-
let promise = new Promise((resolve, reject) => {
|
|
128
|
-
doResolve = () => {doResolve = null; doReject = null; resolve()}
|
|
129
|
-
doReject = error => {doResolve = null; doReject = null; reject(error)}
|
|
130
|
-
}).then(() => go($task))
|
|
131
|
-
return await promise
|
|
132
|
-
}, abort)
|
|
133
|
-
"""
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
extend self: HttpResponse {
|
|
138
|
-
|
|
139
|
-
setHeader(name: String, values: List[String]): Unit
|
|
140
|
-
target node async "self_.setHeader(name_, ff_core_List.List_toArray(values_))"
|
|
141
|
-
|
|
142
|
-
writeStatus(code: Int, message: Option[String]): Unit
|
|
143
|
-
target node async "self_.writeHead(code_, message_.value_)"
|
|
144
|
-
|
|
145
|
-
write(buffer: Buffer): Unit
|
|
146
|
-
target node async """
|
|
147
|
-
import * as http from 'http'
|
|
148
|
-
ff_core_Task.Task_throwIfAborted($task)
|
|
149
|
-
if(!self_.write(Buffer.from(buffer_.buffer))) {
|
|
150
|
-
let reject = null;
|
|
151
|
-
await new Promise((resolve, reject) => {
|
|
152
|
-
const abort = () => {
|
|
153
|
-
$task.controller.signal.removeEventListener('abort', abort)
|
|
154
|
-
reject($task.controller.signal.reason)
|
|
155
|
-
}
|
|
156
|
-
$task.controller.signal.addEventListener('abort', abort)
|
|
157
|
-
self_.once('drain', () => {
|
|
158
|
-
$task.controller.signal.removeEventListener('abort', abort)
|
|
159
|
-
resolve()
|
|
160
|
-
})
|
|
161
|
-
})
|
|
162
|
-
}
|
|
163
|
-
"""
|
|
164
|
-
|
|
165
|
-
writeText(text: String, encoding: String = "utf8"): Unit
|
|
166
|
-
target node async """
|
|
167
|
-
import * as http from 'http'
|
|
168
|
-
ff_core_Task.Task_throwIfAborted($task)
|
|
169
|
-
if(!self_.write(text_, encoding_)) {
|
|
170
|
-
await new Promise((resolve, reject) => {
|
|
171
|
-
const abort = () => {
|
|
172
|
-
$task.controller.signal.removeEventListener('abort', abort)
|
|
173
|
-
reject($task.controller.signal.reason)
|
|
174
|
-
}
|
|
175
|
-
$task.controller.signal.addEventListener('abort', abort)
|
|
176
|
-
self_.once('drain', () => {
|
|
177
|
-
$task.controller.signal.removeEventListener('abort', abort)
|
|
178
|
-
resolve()
|
|
179
|
-
})
|
|
180
|
-
})
|
|
181
|
-
}
|
|
182
|
-
"""
|
|
183
|
-
|
|
184
|
-
}
|