@reventlessdev/reventless-local 3.0.0-alpha.200 → 3.0.0-alpha.202
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/CHANGELOG.md +17 -0
- package/package.json +10 -9
- package/rescript.json +2 -1
- package/src/Platform.res +70 -37
- package/src/Platform.res.mjs +48 -34
- package/src/adapter/BackendState.res +13 -0
- package/src/adapter/BackendState.res.mjs +17 -1
- package/src/adapter/DcbEventLog/LocalDcbEventLogStorage.res.mjs +1 -1
- package/src/adapter/DomainGraphQL_Server.res +5 -5
- package/src/adapter/DomainGraphQL_Server.res.mjs +1 -1
- package/src/adapter/EventLog/LocalEventLogStorage.res.mjs +1 -1
- package/src/adapter/LocalBus.res +6 -46
- package/src/adapter/LocalBus.res.mjs +0 -29
- package/src/adapter/LocalStateChangeDescriptor.res +93 -0
- package/src/adapter/LocalStateChangeDescriptor.res.mjs +61 -0
- package/src/adapter/LocalUploadResolvers.res +16 -3
- package/src/adapter/LocalUploadResolvers.res.mjs +6 -4
- package/src/adapter/ObjectStore/LocalObjectStore.res +157 -0
- package/src/adapter/ObjectStore/LocalObjectStore.res.mjs +129 -0
- package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res +215 -0
- package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res.mjs +286 -0
- package/src/adapter/ObjectStore/ObjectStoreStorage_InMemory.res +33 -0
- package/src/adapter/ObjectStore/ObjectStoreStorage_InMemory.res.mjs +47 -0
- package/src/adapter/QueryDb/LocalQueryDbStorage.res.mjs +1 -1
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +4 -2
- package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +3 -3
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +4 -2
- package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +3 -3
- package/src/reset/LocalSeedReset.res +552 -0
- package/src/reset/LocalSeedReset.res.mjs +533 -0
- package/tests/adapter/BackendParityTest.res +51 -0
- package/tests/adapter/BackendParityTest.res.mjs +44 -0
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res +6 -4
- package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +4 -3
- package/tests/adapter/ObjectStorePersistenceTest.res +243 -0
- package/tests/adapter/ObjectStorePersistenceTest.res.mjs +159 -0
- package/tests/components/eventlog/EventLogProvisioningSeamTest.res +110 -0
- package/tests/components/eventlog/EventLogProvisioningSeamTest.res.mjs +141 -0
- package/tests/reset/LocalSeedResetTest.res +252 -0
- package/tests/reset/LocalSeedResetTest.res.mjs +280 -0
- package/src/adapter/LocalObjectStore.res +0 -70
- package/src/adapter/LocalObjectStore.res.mjs +0 -60
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
// Process-local object store backing the dev platform's served-bucket routes.
|
|
2
|
-
//
|
|
3
|
-
// The AWS path fronts a private S3 bucket through CloudFront (served-buckets
|
|
4
|
-
// plan); in dev there is no bucket, so uploaded and served objects live in this
|
|
5
|
-
// process-local map. Ephemeral by design — contents are lost on restart, which
|
|
6
|
-
// matches the plan's dev-only, non-durable stance. Held here (not in
|
|
7
|
-
// EventLog/QueryDb storage) because it is raw bytes, not event/query state, and
|
|
8
|
-
// has no SQLite arm — hence the `Local` prefix and no `_InMemory` suffix.
|
|
9
|
-
|
|
10
|
-
// Node Buffer, opaque here — produced by the PUT handler (concat of request
|
|
11
|
-
// chunks) and handed straight back to the response by the GET handler.
|
|
12
|
-
type buffer
|
|
13
|
-
|
|
14
|
-
@val @scope("Buffer") external concatBuffers: array<buffer> => buffer = "concat"
|
|
15
|
-
|
|
16
|
-
type entry = {
|
|
17
|
-
bytes: buffer,
|
|
18
|
-
contentType: string,
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
let objects: dict<entry> = Dict.make()
|
|
22
|
-
|
|
23
|
-
// The prefix the local upload route mints keys under. Mirrors the AWS presign
|
|
24
|
-
// `SERVED_PREFIX` (default "uploads"); the hybrid example uses "uploads".
|
|
25
|
-
let defaultUploadPrefix = "uploads"
|
|
26
|
-
|
|
27
|
-
// Prefixes the dev server serves at `/{prefix}/*` (PUT stores, GET reads).
|
|
28
|
-
// Seeded with the default upload prefix; a deployment serving another prefix
|
|
29
|
-
// registers it before the servers start.
|
|
30
|
-
let servedPrefixes: ref<array<string>> = ref([defaultUploadPrefix])
|
|
31
|
-
|
|
32
|
-
let registerServedPrefix = (prefix: string): unit =>
|
|
33
|
-
if !(servedPrefixes.contents->Array.includes(prefix)) {
|
|
34
|
-
servedPrefixes.contents = servedPrefixes.contents->Array.concat([prefix])
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// A request path is a served-object path when its first segment is a registered
|
|
38
|
-
// served prefix and at least one key segment follows. Returns the storage key
|
|
39
|
-
// (the path without its leading slash), or None for GraphQL / other paths.
|
|
40
|
-
let servedKey = (path: string): option<string> => {
|
|
41
|
-
let trimmed = path->String.startsWith("/") ? path->String.slice(~start=1, ~end=path->String.length) : path
|
|
42
|
-
let prefix = trimmed->String.split("/")->Array.get(0)->Option.getOr("")
|
|
43
|
-
if (
|
|
44
|
-
prefix->String.length > 0 &&
|
|
45
|
-
servedPrefixes.contents->Array.includes(prefix) &&
|
|
46
|
-
trimmed->String.length > prefix->String.length + 1
|
|
47
|
-
) {
|
|
48
|
-
Some(trimmed)
|
|
49
|
-
} else {
|
|
50
|
-
None
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
let put = (~key: string, ~bytes: buffer, ~contentType: string): unit =>
|
|
55
|
-
objects->Dict.set(key, {bytes, contentType})
|
|
56
|
-
|
|
57
|
-
let get = (~key: string): option<entry> => objects->Dict.get(key)
|
|
58
|
-
|
|
59
|
-
// Remove a stored object. Idempotent — deleting an absent key is a no-op, matching
|
|
60
|
-
// the release contract (see docs/plans/done/upload-release-path.md, Step 3). The dev
|
|
61
|
-
// store has no identities or clock, so the release resolver enforces only the
|
|
62
|
-
// *shape* of the rule (key under a served prefix), not the identity/age conditions.
|
|
63
|
-
let delete = (~key: string): unit => objects->Dict.delete(key)
|
|
64
|
-
|
|
65
|
-
// Clear stored objects and restore the default served prefix — used between
|
|
66
|
-
// isolated test suites (called from DomainGraphQL_Server.reset).
|
|
67
|
-
let reset = (): unit => {
|
|
68
|
-
objects->Dict.keysToArray->Array.forEach(k => objects->Dict.delete(k))
|
|
69
|
-
servedPrefixes.contents = [defaultUploadPrefix]
|
|
70
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
-
|
|
3
|
-
import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
|
|
4
|
-
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
5
|
-
|
|
6
|
-
let objects = {};
|
|
7
|
-
|
|
8
|
-
let defaultUploadPrefix = "uploads";
|
|
9
|
-
|
|
10
|
-
let servedPrefixes = {
|
|
11
|
-
contents: [defaultUploadPrefix]
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
function registerServedPrefix(prefix) {
|
|
15
|
-
if (!servedPrefixes.contents.includes(prefix)) {
|
|
16
|
-
servedPrefixes.contents = servedPrefixes.contents.concat([prefix]);
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function servedKey(path) {
|
|
22
|
-
let trimmed = path.startsWith("/") ? path.slice(1, path.length) : path;
|
|
23
|
-
let prefix = Stdlib_Option.getOr(trimmed.split("/")[0], "");
|
|
24
|
-
if (prefix.length > 0 && servedPrefixes.contents.includes(prefix) && trimmed.length > (prefix.length + 1 | 0)) {
|
|
25
|
-
return trimmed;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function put(key, bytes, contentType) {
|
|
30
|
-
objects[key] = {
|
|
31
|
-
bytes: bytes,
|
|
32
|
-
contentType: contentType
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function get(key) {
|
|
37
|
-
return objects[key];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function $$delete(key) {
|
|
41
|
-
Stdlib_Dict.$$delete(objects, key);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function reset() {
|
|
45
|
-
Object.keys(objects).forEach(k => Stdlib_Dict.$$delete(objects, k));
|
|
46
|
-
servedPrefixes.contents = [defaultUploadPrefix];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export {
|
|
50
|
-
objects,
|
|
51
|
-
defaultUploadPrefix,
|
|
52
|
-
servedPrefixes,
|
|
53
|
-
registerServedPrefix,
|
|
54
|
-
servedKey,
|
|
55
|
-
put,
|
|
56
|
-
get,
|
|
57
|
-
$$delete,
|
|
58
|
-
reset,
|
|
59
|
-
}
|
|
60
|
-
/* No side effect */
|