@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.
Files changed (42) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/package.json +10 -9
  3. package/rescript.json +2 -1
  4. package/src/Platform.res +70 -37
  5. package/src/Platform.res.mjs +48 -34
  6. package/src/adapter/BackendState.res +13 -0
  7. package/src/adapter/BackendState.res.mjs +17 -1
  8. package/src/adapter/DcbEventLog/LocalDcbEventLogStorage.res.mjs +1 -1
  9. package/src/adapter/DomainGraphQL_Server.res +5 -5
  10. package/src/adapter/DomainGraphQL_Server.res.mjs +1 -1
  11. package/src/adapter/EventLog/LocalEventLogStorage.res.mjs +1 -1
  12. package/src/adapter/LocalBus.res +6 -46
  13. package/src/adapter/LocalBus.res.mjs +0 -29
  14. package/src/adapter/LocalStateChangeDescriptor.res +93 -0
  15. package/src/adapter/LocalStateChangeDescriptor.res.mjs +61 -0
  16. package/src/adapter/LocalUploadResolvers.res +16 -3
  17. package/src/adapter/LocalUploadResolvers.res.mjs +6 -4
  18. package/src/adapter/ObjectStore/LocalObjectStore.res +157 -0
  19. package/src/adapter/ObjectStore/LocalObjectStore.res.mjs +129 -0
  20. package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res +215 -0
  21. package/src/adapter/ObjectStore/ObjectStoreStorage_FileSystem.res.mjs +286 -0
  22. package/src/adapter/ObjectStore/ObjectStoreStorage_InMemory.res +33 -0
  23. package/src/adapter/ObjectStore/ObjectStoreStorage_InMemory.res.mjs +47 -0
  24. package/src/adapter/QueryDb/LocalQueryDbStorage.res.mjs +1 -1
  25. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res +4 -2
  26. package/src/adapter/QueryDb/QueryDbStorage_InMemory.res.mjs +3 -3
  27. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res +4 -2
  28. package/src/adapter/QueryDb/QueryDbStorage_Sqlite.res.mjs +3 -3
  29. package/src/reset/LocalSeedReset.res +552 -0
  30. package/src/reset/LocalSeedReset.res.mjs +533 -0
  31. package/tests/adapter/BackendParityTest.res +51 -0
  32. package/tests/adapter/BackendParityTest.res.mjs +44 -0
  33. package/tests/adapter/GraphQL_SubscriptionResolversTest.res +6 -4
  34. package/tests/adapter/GraphQL_SubscriptionResolversTest.res.mjs +4 -3
  35. package/tests/adapter/ObjectStorePersistenceTest.res +243 -0
  36. package/tests/adapter/ObjectStorePersistenceTest.res.mjs +159 -0
  37. package/tests/components/eventlog/EventLogProvisioningSeamTest.res +110 -0
  38. package/tests/components/eventlog/EventLogProvisioningSeamTest.res.mjs +141 -0
  39. package/tests/reset/LocalSeedResetTest.res +252 -0
  40. package/tests/reset/LocalSeedResetTest.res.mjs +280 -0
  41. package/src/adapter/LocalObjectStore.res +0 -70
  42. 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 */