@streetjs/storage 1.0.0 → 1.0.2

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 (225) hide show
  1. package/dist/drivers/local.d.ts +8 -0
  2. package/dist/drivers/local.d.ts.map +1 -1
  3. package/dist/drivers/local.js +18 -3
  4. package/dist/drivers/local.js.map +1 -1
  5. package/dist/tests/contract.d.ts +19 -0
  6. package/dist/tests/contract.d.ts.map +1 -1
  7. package/dist/tests/contract.js +28 -0
  8. package/dist/tests/contract.js.map +1 -1
  9. package/package.json +10 -6
  10. package/dist/tests/access.test.d.ts +0 -2
  11. package/dist/tests/access.test.d.ts.map +0 -1
  12. package/dist/tests/access.test.js +0 -270
  13. package/dist/tests/access.test.js.map +0 -1
  14. package/dist/tests/azure-driver.test.d.ts +0 -2
  15. package/dist/tests/azure-driver.test.d.ts.map +0 -1
  16. package/dist/tests/azure-driver.test.js +0 -183
  17. package/dist/tests/azure-driver.test.js.map +0 -1
  18. package/dist/tests/backblaze-driver.test.d.ts +0 -2
  19. package/dist/tests/backblaze-driver.test.d.ts.map +0 -1
  20. package/dist/tests/backblaze-driver.test.js +0 -185
  21. package/dist/tests/backblaze-driver.test.js.map +0 -1
  22. package/dist/tests/bridge-degradation.test.d.ts +0 -2
  23. package/dist/tests/bridge-degradation.test.d.ts.map +0 -1
  24. package/dist/tests/bridge-degradation.test.js +0 -138
  25. package/dist/tests/bridge-degradation.test.js.map +0 -1
  26. package/dist/tests/cli.test.d.ts +0 -2
  27. package/dist/tests/cli.test.d.ts.map +0 -1
  28. package/dist/tests/cli.test.js +0 -127
  29. package/dist/tests/cli.test.js.map +0 -1
  30. package/dist/tests/contract.test.d.ts +0 -2
  31. package/dist/tests/contract.test.d.ts.map +0 -1
  32. package/dist/tests/contract.test.js +0 -110
  33. package/dist/tests/contract.test.js.map +0 -1
  34. package/dist/tests/directory.test.d.ts +0 -2
  35. package/dist/tests/directory.test.d.ts.map +0 -1
  36. package/dist/tests/directory.test.js +0 -125
  37. package/dist/tests/directory.test.js.map +0 -1
  38. package/dist/tests/errors.test.d.ts +0 -2
  39. package/dist/tests/errors.test.d.ts.map +0 -1
  40. package/dist/tests/errors.test.js +0 -93
  41. package/dist/tests/errors.test.js.map +0 -1
  42. package/dist/tests/events-bridge.test.d.ts +0 -2
  43. package/dist/tests/events-bridge.test.d.ts.map +0 -1
  44. package/dist/tests/events-bridge.test.js +0 -228
  45. package/dist/tests/events-bridge.test.js.map +0 -1
  46. package/dist/tests/example-smoke.test.d.ts +0 -2
  47. package/dist/tests/example-smoke.test.d.ts.map +0 -1
  48. package/dist/tests/example-smoke.test.js +0 -34
  49. package/dist/tests/example-smoke.test.js.map +0 -1
  50. package/dist/tests/gcs-driver.test.d.ts +0 -2
  51. package/dist/tests/gcs-driver.test.d.ts.map +0 -1
  52. package/dist/tests/gcs-driver.test.js +0 -197
  53. package/dist/tests/gcs-driver.test.js.map +0 -1
  54. package/dist/tests/image.test.d.ts +0 -2
  55. package/dist/tests/image.test.d.ts.map +0 -1
  56. package/dist/tests/image.test.js +0 -102
  57. package/dist/tests/image.test.js.map +0 -1
  58. package/dist/tests/lifecycle.test.d.ts +0 -2
  59. package/dist/tests/lifecycle.test.d.ts.map +0 -1
  60. package/dist/tests/lifecycle.test.js +0 -171
  61. package/dist/tests/lifecycle.test.js.map +0 -1
  62. package/dist/tests/local-driver.test.d.ts +0 -2
  63. package/dist/tests/local-driver.test.d.ts.map +0 -1
  64. package/dist/tests/local-driver.test.js +0 -153
  65. package/dist/tests/local-driver.test.js.map +0 -1
  66. package/dist/tests/local-streaming.test.d.ts +0 -2
  67. package/dist/tests/local-streaming.test.d.ts.map +0 -1
  68. package/dist/tests/local-streaming.test.js +0 -121
  69. package/dist/tests/local-streaming.test.js.map +0 -1
  70. package/dist/tests/memory-driver.test.d.ts +0 -2
  71. package/dist/tests/memory-driver.test.d.ts.map +0 -1
  72. package/dist/tests/memory-driver.test.js +0 -180
  73. package/dist/tests/memory-driver.test.js.map +0 -1
  74. package/dist/tests/memory-streaming.test.d.ts +0 -2
  75. package/dist/tests/memory-streaming.test.d.ts.map +0 -1
  76. package/dist/tests/memory-streaming.test.js +0 -92
  77. package/dist/tests/memory-streaming.test.js.map +0 -1
  78. package/dist/tests/minio-driver.test.d.ts +0 -2
  79. package/dist/tests/minio-driver.test.d.ts.map +0 -1
  80. package/dist/tests/minio-driver.test.js +0 -146
  81. package/dist/tests/minio-driver.test.js.map +0 -1
  82. package/dist/tests/non-s3-integration.test.d.ts +0 -2
  83. package/dist/tests/non-s3-integration.test.d.ts.map +0 -1
  84. package/dist/tests/non-s3-integration.test.js +0 -201
  85. package/dist/tests/non-s3-integration.test.js.map +0 -1
  86. package/dist/tests/observability.registration.test.d.ts +0 -2
  87. package/dist/tests/observability.registration.test.d.ts.map +0 -1
  88. package/dist/tests/observability.registration.test.js +0 -103
  89. package/dist/tests/observability.registration.test.js.map +0 -1
  90. package/dist/tests/observability.test.d.ts +0 -2
  91. package/dist/tests/observability.test.d.ts.map +0 -1
  92. package/dist/tests/observability.test.js +0 -240
  93. package/dist/tests/observability.test.js.map +0 -1
  94. package/dist/tests/plugin.test.d.ts +0 -2
  95. package/dist/tests/plugin.test.d.ts.map +0 -1
  96. package/dist/tests/plugin.test.js +0 -112
  97. package/dist/tests/plugin.test.js.map +0 -1
  98. package/dist/tests/prop-concurrent.test.d.ts +0 -2
  99. package/dist/tests/prop-concurrent.test.d.ts.map +0 -1
  100. package/dist/tests/prop-concurrent.test.js +0 -59
  101. package/dist/tests/prop-concurrent.test.js.map +0 -1
  102. package/dist/tests/prop-copy.test.d.ts +0 -2
  103. package/dist/tests/prop-copy.test.d.ts.map +0 -1
  104. package/dist/tests/prop-copy.test.js +0 -63
  105. package/dist/tests/prop-copy.test.js.map +0 -1
  106. package/dist/tests/prop-delete.test.d.ts +0 -2
  107. package/dist/tests/prop-delete.test.d.ts.map +0 -1
  108. package/dist/tests/prop-delete.test.js +0 -35
  109. package/dist/tests/prop-delete.test.js.map +0 -1
  110. package/dist/tests/prop-directory.test.d.ts +0 -2
  111. package/dist/tests/prop-directory.test.d.ts.map +0 -1
  112. package/dist/tests/prop-directory.test.js +0 -118
  113. package/dist/tests/prop-directory.test.js.map +0 -1
  114. package/dist/tests/prop-driver-conformance.test.d.ts +0 -2
  115. package/dist/tests/prop-driver-conformance.test.d.ts.map +0 -1
  116. package/dist/tests/prop-driver-conformance.test.js +0 -110
  117. package/dist/tests/prop-driver-conformance.test.js.map +0 -1
  118. package/dist/tests/prop-driver-equivalence.test.d.ts +0 -2
  119. package/dist/tests/prop-driver-equivalence.test.d.ts.map +0 -1
  120. package/dist/tests/prop-driver-equivalence.test.js +0 -163
  121. package/dist/tests/prop-driver-equivalence.test.js.map +0 -1
  122. package/dist/tests/prop-lifecycle.test.d.ts +0 -2
  123. package/dist/tests/prop-lifecycle.test.d.ts.map +0 -1
  124. package/dist/tests/prop-lifecycle.test.js +0 -83
  125. package/dist/tests/prop-lifecycle.test.js.map +0 -1
  126. package/dist/tests/prop-list.test.d.ts +0 -2
  127. package/dist/tests/prop-list.test.d.ts.map +0 -1
  128. package/dist/tests/prop-list.test.js +0 -53
  129. package/dist/tests/prop-list.test.js.map +0 -1
  130. package/dist/tests/prop-metadata.test.d.ts +0 -2
  131. package/dist/tests/prop-metadata.test.d.ts.map +0 -1
  132. package/dist/tests/prop-metadata.test.js +0 -87
  133. package/dist/tests/prop-metadata.test.js.map +0 -1
  134. package/dist/tests/prop-move.test.d.ts +0 -2
  135. package/dist/tests/prop-move.test.d.ts.map +0 -1
  136. package/dist/tests/prop-move.test.js +0 -67
  137. package/dist/tests/prop-move.test.js.map +0 -1
  138. package/dist/tests/prop-multipart-abort.test.d.ts +0 -2
  139. package/dist/tests/prop-multipart-abort.test.d.ts.map +0 -1
  140. package/dist/tests/prop-multipart-abort.test.js +0 -48
  141. package/dist/tests/prop-multipart-abort.test.js.map +0 -1
  142. package/dist/tests/prop-multipart.test.d.ts +0 -2
  143. package/dist/tests/prop-multipart.test.d.ts.map +0 -1
  144. package/dist/tests/prop-multipart.test.js +0 -65
  145. package/dist/tests/prop-multipart.test.js.map +0 -1
  146. package/dist/tests/prop-resumable.test.d.ts +0 -2
  147. package/dist/tests/prop-resumable.test.d.ts.map +0 -1
  148. package/dist/tests/prop-resumable.test.js +0 -78
  149. package/dist/tests/prop-resumable.test.js.map +0 -1
  150. package/dist/tests/prop-search.test.d.ts +0 -2
  151. package/dist/tests/prop-search.test.d.ts.map +0 -1
  152. package/dist/tests/prop-search.test.js +0 -120
  153. package/dist/tests/prop-search.test.js.map +0 -1
  154. package/dist/tests/prop-signed-url.test.d.ts +0 -2
  155. package/dist/tests/prop-signed-url.test.d.ts.map +0 -1
  156. package/dist/tests/prop-signed-url.test.js +0 -74
  157. package/dist/tests/prop-signed-url.test.js.map +0 -1
  158. package/dist/tests/prop-streaming.test.d.ts +0 -2
  159. package/dist/tests/prop-streaming.test.d.ts.map +0 -1
  160. package/dist/tests/prop-streaming.test.js +0 -34
  161. package/dist/tests/prop-streaming.test.js.map +0 -1
  162. package/dist/tests/prop-upload-download.test.d.ts +0 -2
  163. package/dist/tests/prop-upload-download.test.d.ts.map +0 -1
  164. package/dist/tests/prop-upload-download.test.js +0 -30
  165. package/dist/tests/prop-upload-download.test.js.map +0 -1
  166. package/dist/tests/prop-validation.test.d.ts +0 -2
  167. package/dist/tests/prop-validation.test.d.ts.map +0 -1
  168. package/dist/tests/prop-validation.test.js +0 -50
  169. package/dist/tests/prop-validation.test.js.map +0 -1
  170. package/dist/tests/prop-versioning.test.d.ts +0 -2
  171. package/dist/tests/prop-versioning.test.d.ts.map +0 -1
  172. package/dist/tests/prop-versioning.test.js +0 -74
  173. package/dist/tests/prop-versioning.test.js.map +0 -1
  174. package/dist/tests/queue-bridge.test.d.ts +0 -2
  175. package/dist/tests/queue-bridge.test.d.ts.map +0 -1
  176. package/dist/tests/queue-bridge.test.js +0 -111
  177. package/dist/tests/queue-bridge.test.js.map +0 -1
  178. package/dist/tests/r2-driver.test.d.ts +0 -2
  179. package/dist/tests/r2-driver.test.d.ts.map +0 -1
  180. package/dist/tests/r2-driver.test.js +0 -143
  181. package/dist/tests/r2-driver.test.js.map +0 -1
  182. package/dist/tests/realtime-bridge.test.d.ts +0 -2
  183. package/dist/tests/realtime-bridge.test.d.ts.map +0 -1
  184. package/dist/tests/realtime-bridge.test.js +0 -106
  185. package/dist/tests/realtime-bridge.test.js.map +0 -1
  186. package/dist/tests/resumable.test.d.ts +0 -2
  187. package/dist/tests/resumable.test.d.ts.map +0 -1
  188. package/dist/tests/resumable.test.js +0 -104
  189. package/dist/tests/resumable.test.js.map +0 -1
  190. package/dist/tests/s3-base.test.d.ts +0 -2
  191. package/dist/tests/s3-base.test.d.ts.map +0 -1
  192. package/dist/tests/s3-base.test.js +0 -289
  193. package/dist/tests/s3-base.test.js.map +0 -1
  194. package/dist/tests/s3-integration.test.d.ts +0 -2
  195. package/dist/tests/s3-integration.test.d.ts.map +0 -1
  196. package/dist/tests/s3-integration.test.js +0 -270
  197. package/dist/tests/s3-integration.test.js.map +0 -1
  198. package/dist/tests/s3.test.d.ts +0 -2
  199. package/dist/tests/s3.test.d.ts.map +0 -1
  200. package/dist/tests/s3.test.js +0 -203
  201. package/dist/tests/s3.test.js.map +0 -1
  202. package/dist/tests/scaffold.test.d.ts +0 -2
  203. package/dist/tests/scaffold.test.d.ts.map +0 -1
  204. package/dist/tests/scaffold.test.js +0 -13
  205. package/dist/tests/scaffold.test.js.map +0 -1
  206. package/dist/tests/search.test.d.ts +0 -2
  207. package/dist/tests/search.test.d.ts.map +0 -1
  208. package/dist/tests/search.test.js +0 -106
  209. package/dist/tests/search.test.js.map +0 -1
  210. package/dist/tests/supabase-driver.test.d.ts +0 -2
  211. package/dist/tests/supabase-driver.test.d.ts.map +0 -1
  212. package/dist/tests/supabase-driver.test.js +0 -196
  213. package/dist/tests/supabase-driver.test.js.map +0 -1
  214. package/dist/tests/testing-utilities.test.d.ts +0 -2
  215. package/dist/tests/testing-utilities.test.d.ts.map +0 -1
  216. package/dist/tests/testing-utilities.test.js +0 -138
  217. package/dist/tests/testing-utilities.test.js.map +0 -1
  218. package/dist/tests/validation.test.d.ts +0 -2
  219. package/dist/tests/validation.test.d.ts.map +0 -1
  220. package/dist/tests/validation.test.js +0 -135
  221. package/dist/tests/validation.test.js.map +0 -1
  222. package/dist/tests/versioning.test.d.ts +0 -2
  223. package/dist/tests/versioning.test.d.ts.map +0 -1
  224. package/dist/tests/versioning.test.js +0 -128
  225. package/dist/tests/versioning.test.js.map +0 -1
@@ -1,201 +0,0 @@
1
- // Integration tests for the non-S3 cloud drivers — Supabase, Google Cloud
2
- // Storage, and Azure Blob — with **honest credential-based skipping**
3
- // (task 29.4). These mirror the honest-skip policy of the S3-compatible
4
- // integration tests (task 28.6): a live provider is only exercised when that
5
- // provider's credentials are present in the environment, and the suite never
6
- // fabricates provider success.
7
- //
8
- // ## Honest-skip policy (Requirement 27.2–27.5)
9
- //
10
- // Per provider, credential presence is detected from environment variables and
11
- // classified into one of three states, each mapped to an honest node:test
12
- // outcome:
13
- //
14
- // • absent (no provider env vars set) — the test is declared with node:test's
15
- // `test(name, { skip: reason }, ...)` option, so its body never runs and it
16
- // is reported as **skipped, never as passed** (Requirement 27.3). This is the
17
- // default state in CI/local runs with no cloud credentials, so the file loads
18
- // and `node --test dist/tests/*.test.js` stays green.
19
- //
20
- // • present (all provider env vars set) — the test runs against the live
21
- // provider (Requirement 27.2). If the driver cannot be constructed for
22
- // another reason — most commonly the optional provider SDK is not installed —
23
- // the driver's connector throws a StorageConfigError; that is caught and the
24
- // test returns normally after emitting a clear diagnostic, i.e. it is
25
- // **reported as passed with a skip message** (Requirement 27.4). Any other
26
- // unexpected construction error, or a failed assertion during the live
27
- // round-trip, propagates and **fails the build** (Requirement 27.5).
28
- //
29
- // • misconfigured (some but not all of a provider's env vars set) — the test
30
- // runner is misconfigured; the test **fails the build** with a message naming
31
- // the present and missing variables (Requirement 27.5).
32
- //
33
- // ## No provider SDKs at import time (guard/lazy)
34
- //
35
- // This file imports only the drivers' connector functions. Each connector
36
- // (`connectSupabaseStorageDriver`, `connectGoogleCloudStorageDriver`,
37
- // `connectAzureBlobDriver`) resolves its optional provider SDK through a lazy
38
- // dynamic `import()` performed inside the function — never at module top level —
39
- // so loading this test file requires no `@supabase/supabase-js`,
40
- // `@google-cloud/storage`, or `@azure/storage-blob` install. With no credentials
41
- // present the whole file simply registers skipped tests and stays green.
42
- //
43
- // Requirements: 27.2, 27.3, 27.4, 27.5
44
- import test from "node:test";
45
- import assert from "node:assert/strict";
46
- import { Buffer } from "node:buffer";
47
- import { connectSupabaseStorageDriver } from "../drivers/supabase.js";
48
- import { connectGoogleCloudStorageDriver } from "../drivers/gcs.js";
49
- import { connectAzureBlobDriver } from "../drivers/azure.js";
50
- import { StorageConfigError } from "../errors.js";
51
- // ── Credential detection ──────────────────────────────────────────────────────
52
- /**
53
- * Classify the presence of a provider's credential environment variables.
54
- *
55
- * @param {readonly string[]} vars The env var names the provider requires.
56
- * @returns {{ state: "absent" | "present" | "misconfigured", present: string[], missing: string[] }}
57
- */
58
- function classifyCredentials(vars) {
59
- const present = vars.filter((name) => {
60
- const value = process.env[name];
61
- return typeof value === "string" && value.trim() !== "";
62
- });
63
- const missing = vars.filter((name) => !present.includes(name));
64
- if (present.length === 0) {
65
- return { state: "absent", present, missing };
66
- }
67
- if (missing.length === 0) {
68
- return { state: "present", present, missing };
69
- }
70
- return { state: "misconfigured", present, missing };
71
- }
72
- // ── Shared live round-trip exercise ────────────────────────────────────────────
73
- /**
74
- * Exercise the mandatory StorageDriver primitives against a live provider
75
- * driver: put → exists → get (byte + metadata fidelity) → stat → list → delete.
76
- * Uses a unique, namespaced key and always attempts cleanup. Assertion failures
77
- * here propagate to fail the build (Requirement 27.5) — a live provider with
78
- * valid credentials and an installed SDK is expected to succeed (Requirement
79
- * 27.2).
80
- *
81
- * @param {string} provider The provider name (for key namespacing / messages).
82
- * @param {import("../driver.js").StorageDriver} driver The connected driver.
83
- */
84
- async function exerciseLiveRoundTrip(provider, driver) {
85
- const unique = `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;
86
- const prefix = `streetjs-integration/${provider}/`;
87
- const key = `${prefix}${unique}.bin`;
88
- const content = Buffer.from(`streetjs ${provider} integration payload ${unique}`);
89
- try {
90
- const written = await driver.put(key, new Uint8Array(content), {
91
- contentType: "text/plain",
92
- owner: "integration-suite",
93
- custom: { suite: "29.4", provider },
94
- });
95
- assert.equal(written.key, key, "put should return metadata for the written key");
96
- assert.equal(written.size, content.byteLength, "put should report the written byte length");
97
- assert.equal(await driver.exists(key), true, "written object should exist");
98
- const got = await driver.get(key);
99
- assert.equal(got.found, true, "get should find the written object");
100
- assert.deepEqual(Buffer.from(got.bytes), content, "get should return the exact written bytes");
101
- assert.equal(got.metadata.contentType, "text/plain", "content type should round-trip");
102
- const stat = await driver.stat(key);
103
- assert.ok(stat !== null, "stat should return metadata for an existing object");
104
- assert.equal(stat.size, content.byteLength, "stat size should match the written bytes");
105
- const listed = await driver.list(prefix);
106
- assert.ok(listed.some((item) => item.key === key), "list should include the written key under its prefix");
107
- }
108
- finally {
109
- // Best-effort cleanup so repeated runs do not accumulate objects.
110
- await driver.delete(key).catch(() => { });
111
- }
112
- assert.equal(await driver.exists(key), false, "deleted object should no longer exist");
113
- }
114
- // ── Per-provider honest-skip registration ──────────────────────────────────────
115
- /**
116
- * Register a single honest-skip integration test for a cloud provider.
117
- *
118
- * @param {object} spec
119
- * @param {string} spec.provider Provider name used in the test title / messages.
120
- * @param {readonly string[]} spec.envVars The env vars this provider requires.
121
- * @param {() => Promise<import("../driver.js").StorageDriver>} spec.connect
122
- * Builds the live driver from the environment (resolves its SDK lazily).
123
- */
124
- function registerCloudIntegration({ provider, envVars, connect }) {
125
- const title = `[integration] ${provider} driver live round-trip`;
126
- const cred = classifyCredentials(envVars);
127
- if (cred.state === "absent") {
128
- // Requirement 27.3: no credentials → skip with a clear message, never passed.
129
- test(title, {
130
- skip: `No ${provider} credentials present (expected env: ${envVars.join(", ")}). ` +
131
- `Skipping live integration — this is reported as skipped, not passed.`,
132
- }, () => { });
133
- return;
134
- }
135
- if (cred.state === "misconfigured") {
136
- // Requirement 27.5: partial credentials means the runner is misconfigured →
137
- // fail the build rather than silently half-running.
138
- test(title, () => {
139
- assert.fail(`${provider} integration is misconfigured: set ALL of [${envVars.join(", ")}] ` +
140
- `or NONE. Present: [${cred.present.join(", ")}]; missing: [${cred.missing.join(", ")}].`);
141
- });
142
- return;
143
- }
144
- // Requirement 27.2 / 27.4: credentials present → attempt the live round-trip.
145
- test(title, async (t) => {
146
- let driver;
147
- try {
148
- driver = await connect();
149
- }
150
- catch (error) {
151
- if (error instanceof StorageConfigError) {
152
- // Requirement 27.4: credentials present but the test cannot run for
153
- // another reason (typically the optional provider SDK is not installed).
154
- // Report as passed with a clear skip message.
155
- t.diagnostic(`${provider} credentials are present but the live integration cannot run: ` +
156
- `${error.message} Reporting as passed-with-skip (Requirement 27.4).`);
157
- return;
158
- }
159
- // Requirement 27.5: any other construction failure is a real error and
160
- // must fail the build.
161
- throw error;
162
- }
163
- await exerciseLiveRoundTrip(provider, driver);
164
- });
165
- }
166
- // ── Sanity: connectors import without any provider SDK ──────────────────────────
167
- test("[integration] non-S3 cloud connectors import without provider SDKs", () => {
168
- // Proves the file loads cleanly (no top-level SDK import) so the suite stays
169
- // green when no cloud credentials are configured.
170
- assert.equal(typeof connectSupabaseStorageDriver, "function");
171
- assert.equal(typeof connectGoogleCloudStorageDriver, "function");
172
- assert.equal(typeof connectAzureBlobDriver, "function");
173
- });
174
- // ── Provider registrations ──────────────────────────────────────────────────────
175
- registerCloudIntegration({
176
- provider: "supabase",
177
- envVars: ["SUPABASE_URL", "SUPABASE_KEY", "SUPABASE_BUCKET"],
178
- connect: () => connectSupabaseStorageDriver({
179
- url: process.env.SUPABASE_URL,
180
- key: process.env.SUPABASE_KEY,
181
- bucket: process.env.SUPABASE_BUCKET,
182
- }),
183
- });
184
- registerCloudIntegration({
185
- provider: "gcs",
186
- envVars: ["GCS_BUCKET", "GCS_PROJECT_ID", "GOOGLE_APPLICATION_CREDENTIALS"],
187
- connect: () => connectGoogleCloudStorageDriver({
188
- bucket: process.env.GCS_BUCKET,
189
- projectId: process.env.GCS_PROJECT_ID,
190
- keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS,
191
- }),
192
- });
193
- registerCloudIntegration({
194
- provider: "azure",
195
- envVars: ["AZURE_STORAGE_CONNECTION_STRING", "AZURE_STORAGE_CONTAINER"],
196
- connect: () => connectAzureBlobDriver({
197
- container: process.env.AZURE_STORAGE_CONTAINER,
198
- connectionString: process.env.AZURE_STORAGE_CONNECTION_STRING,
199
- }),
200
- });
201
- //# sourceMappingURL=non-s3-integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"non-s3-integration.test.js","sourceRoot":"","sources":["../../src/tests/non-s3-integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=observability.registration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.registration.test.d.ts","sourceRoot":"","sources":["../../src/tests/observability.registration.test.ts"],"names":[],"mappings":""}
@@ -1,103 +0,0 @@
1
- // Focused unit tests for storage metrics/health *registration* (task 22.2).
2
- //
3
- // Complements observability.test.js (task 22.1) — which covers live stat
4
- // tracking, metric kinds, and health up/down — by asserting the registration
5
- // contract explicitly:
6
- //
7
- // 1. Idempotent registration: calling registerStorageObservability twice
8
- // against the SAME MetricsRegistry does not throw and REUSES the existing
9
- // metrics rather than registering duplicates (Req 23.1).
10
- // 2. Every one of the ten required metrics is registered: uploads, downloads,
11
- // bytes uploaded, bytes downloaded, active uploads, failed uploads,
12
- // storage usage, latency, multipart uploads, resumable sessions (Req 23.2).
13
- // 3. The provider health check is registered against the existing
14
- // HealthCheckRegistry as the single `storage` check sourced from probe(),
15
- // surfacing connectivity / writability / readability / quota (Req 23.3).
16
- //
17
- // Uses the Node.js built-in test runner (node:test); executed via
18
- // `node --test dist/tests/*.test.js`.
19
- //
20
- // Requirements: 23.1, 23.2, 23.3
21
- import test from "node:test";
22
- import assert from "node:assert/strict";
23
- import { HealthCheckRegistry, MetricsRegistry } from "streetjs";
24
- import { createStorage, registerStorageObservability, STORAGE_HEALTH_CHECK_NAME, STORAGE_UPLOADS_METRIC, STORAGE_DOWNLOADS_METRIC, STORAGE_BYTES_UPLOADED_METRIC, STORAGE_BYTES_DOWNLOADED_METRIC, STORAGE_ACTIVE_UPLOADS_METRIC, STORAGE_FAILED_UPLOADS_METRIC, STORAGE_USAGE_METRIC, STORAGE_LATENCY_METRIC, STORAGE_MULTIPART_METRIC, STORAGE_RESUMABLE_METRIC, } from "../index.js";
25
- // The ten metrics Requirement 23.2 mandates, keyed by their exported name
26
- // constant so a missing/renamed constant fails the test at import time.
27
- const REQUIRED_METRICS = [
28
- STORAGE_UPLOADS_METRIC,
29
- STORAGE_DOWNLOADS_METRIC,
30
- STORAGE_BYTES_UPLOADED_METRIC,
31
- STORAGE_BYTES_DOWNLOADED_METRIC,
32
- STORAGE_ACTIVE_UPLOADS_METRIC,
33
- STORAGE_FAILED_UPLOADS_METRIC,
34
- STORAGE_USAGE_METRIC,
35
- STORAGE_LATENCY_METRIC,
36
- STORAGE_MULTIPART_METRIC,
37
- STORAGE_RESUMABLE_METRIC,
38
- ];
39
- test("every one of the ten required metrics is registered by name (Req 23.2)", () => {
40
- const metrics = new MetricsRegistry();
41
- registerStorageObservability({ metrics });
42
- // Each mandated metric is present individually...
43
- for (const name of REQUIRED_METRICS) {
44
- assert.ok(metrics.has(name), `expected metric '${name}' to be registered`);
45
- }
46
- // ...and the ten names are exactly what a fresh registry now holds (no
47
- // required metric is silently missing).
48
- const registered = new Set(metrics.names());
49
- for (const name of REQUIRED_METRICS) {
50
- assert.ok(registered.has(name), `names() is missing '${name}'`);
51
- }
52
- assert.equal(REQUIRED_METRICS.length, 10);
53
- });
54
- test("repeat registration against the same registry does not throw and adds no duplicates (Req 23.1)", () => {
55
- const metrics = new MetricsRegistry();
56
- registerStorageObservability({ metrics });
57
- const afterFirst = metrics.names().slice().sort();
58
- // A second registration against the SAME registry must not throw...
59
- assert.doesNotThrow(() => registerStorageObservability({ metrics }));
60
- // ...and must not register duplicate metrics — the registry's name set is
61
- // unchanged after the second call.
62
- const afterSecond = metrics.names().slice().sort();
63
- assert.deepEqual(afterSecond, afterFirst);
64
- assert.equal(afterSecond.length, REQUIRED_METRICS.length);
65
- });
66
- test("repeat registration reuses the existing metric instances (Req 23.1)", () => {
67
- const metrics = new MetricsRegistry();
68
- registerStorageObservability({ metrics });
69
- const firstInstances = REQUIRED_METRICS.map((name) => metrics.get(name));
70
- registerStorageObservability({ metrics });
71
- const secondInstances = REQUIRED_METRICS.map((name) => metrics.get(name));
72
- // Same object identity per name — the second registration reused rather than
73
- // replaced each metric.
74
- for (let i = 0; i < REQUIRED_METRICS.length; i++) {
75
- assert.strictEqual(secondInstances[i], firstInstances[i], `metric '${REQUIRED_METRICS[i]}' was replaced instead of reused`);
76
- }
77
- });
78
- test("attach registers the single 'storage' health check sourced from probe() covering all four dimensions (Req 23.3)", async () => {
79
- const health = new HealthCheckRegistry();
80
- const handle = registerStorageObservability({ health });
81
- // Before attach, no storage check exists.
82
- let live = await health.runLiveness();
83
- assert.ok(!(STORAGE_HEALTH_CHECK_NAME in live.checks));
84
- const storage = createStorage({ provider: "memory" });
85
- handle.attach(storage);
86
- live = await health.runLiveness();
87
- assert.ok(STORAGE_HEALTH_CHECK_NAME in live.checks, "expected the 'storage' health check to be registered");
88
- const check = live.checks[STORAGE_HEALTH_CHECK_NAME];
89
- // The single check surfaces every probe dimension Req 23.3 requires.
90
- assert.ok("connectivity" in check.details);
91
- assert.ok("writable" in check.details);
92
- assert.ok("readable" in check.details);
93
- assert.ok("quotaAvailable" in check.details);
94
- handle.close();
95
- await storage.close();
96
- });
97
- test("with no metrics registry, registration registers nothing and never throws (Req 23.1)", () => {
98
- const metrics = new MetricsRegistry();
99
- // A handle created without a metrics registry must not touch the registry.
100
- assert.doesNotThrow(() => registerStorageObservability({}));
101
- assert.equal(metrics.names().length, 0);
102
- });
103
- //# sourceMappingURL=observability.registration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.registration.test.js","sourceRoot":"","sources":["../../src/tests/observability.registration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=observability.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.test.d.ts","sourceRoot":"","sources":["../../src/tests/observability.test.ts"],"names":[],"mappings":""}
@@ -1,240 +0,0 @@
1
- // Unit + integration tests for the storage observability wiring (task 22.1).
2
- //
3
- // Verifies the Requirement 23 semantics over the zero-dependency `memory`
4
- // provider and the real core MetricsRegistry / HealthCheckRegistry:
5
- //
6
- // - the facade tracks live stats (uploads/downloads/bytes/active/failed/usage/
7
- // multipart/resumable) surfaced by `storage.stats()` (23.2);
8
- // - `storage.probe()` delegates to the driver's probe or returns a sensible
9
- // default when the driver has no probe (23.3);
10
- // - registerStorageObservability registers metrics idempotently against the
11
- // existing MetricsRegistry (23.1, 23.2, 23.4) and a health check against the
12
- // existing HealthCheckRegistry sourced from probe() (23.3);
13
- // - configuring config.metrics/config.health wires observability on the facade
14
- // and drives the counters/gauges as operations occur.
15
- //
16
- // Uses the Node.js built-in test runner (node:test); executed via
17
- // `node --test dist/tests/*.test.js`.
18
- //
19
- // Requirements: 23.1, 23.2, 23.3, 23.4
20
- import test from "node:test";
21
- import assert from "node:assert/strict";
22
- import { HealthCheckRegistry, MetricsRegistry, Counter, Gauge, Histogram } from "streetjs";
23
- import { createStorage, registerStorageObservability, STORAGE_HEALTH_CHECK_NAME, STORAGE_UPLOADS_METRIC, STORAGE_DOWNLOADS_METRIC, STORAGE_BYTES_UPLOADED_METRIC, STORAGE_BYTES_DOWNLOADED_METRIC, STORAGE_ACTIVE_UPLOADS_METRIC, STORAGE_FAILED_UPLOADS_METRIC, STORAGE_USAGE_METRIC, STORAGE_LATENCY_METRIC, STORAGE_MULTIPART_METRIC, STORAGE_RESUMABLE_METRIC, } from "../index.js";
24
- test("stats() starts zeroed and is available without any registry (Req 23.2)", async () => {
25
- const storage = createStorage({ provider: "memory" });
26
- assert.deepEqual(storage.stats(), {
27
- uploads: 0,
28
- downloads: 0,
29
- bytesUploaded: 0,
30
- bytesDownloaded: 0,
31
- activeUploads: 0,
32
- failedUploads: 0,
33
- storageUsage: 0,
34
- multipartUploads: 0,
35
- resumableSessions: 0,
36
- });
37
- });
38
- test("put/get advance uploads/downloads and byte counters (Req 23.2)", async () => {
39
- const storage = createStorage({ provider: "memory" });
40
- await storage.put("a.txt", "hello"); // 5 bytes
41
- await storage.put("b.txt", "worldd"); // 6 bytes
42
- const got = await storage.get("a.txt");
43
- assert.equal(got.found, true);
44
- const stats = storage.stats();
45
- assert.equal(stats.uploads, 2);
46
- assert.equal(stats.bytesUploaded, 11);
47
- assert.equal(stats.storageUsage, 11);
48
- assert.equal(stats.downloads, 1);
49
- assert.equal(stats.bytesDownloaded, 5);
50
- assert.equal(stats.failedUploads, 0);
51
- });
52
- test("a failed upload (rejected by validation) increments failedUploads (Req 23.2)", async () => {
53
- const storage = createStorage({
54
- provider: "memory",
55
- validation: { maxSize: 3 },
56
- });
57
- await assert.rejects(() => storage.put("big.txt", "too-large"));
58
- const stats = storage.stats();
59
- assert.equal(stats.failedUploads, 1);
60
- assert.equal(stats.uploads, 0);
61
- });
62
- test("multipart and resumable operations advance their counters (Req 23.2)", async () => {
63
- const storage = createStorage({ provider: "memory" });
64
- await storage.createMultipartUpload("m1");
65
- await storage.createMultipartUpload("m2");
66
- await storage.startUpload("r1");
67
- const stats = storage.stats();
68
- assert.equal(stats.multipartUploads, 2);
69
- assert.equal(stats.resumableSessions, 1);
70
- });
71
- test("activeUploads returns to zero after a stream upload completes (Req 23.2)", async () => {
72
- const storage = createStorage({ provider: "memory" });
73
- const { Readable } = await import("node:stream");
74
- await storage.putStream("s.txt", Readable.from([Buffer.from("streamed")]));
75
- const stats = storage.stats();
76
- assert.equal(stats.activeUploads, 0);
77
- assert.equal(stats.uploads, 1);
78
- assert.equal(stats.bytesUploaded, 8);
79
- });
80
- test("probe() returns an all-available default when the driver has no probe (Req 23.3)", async () => {
81
- const storage = createStorage({ provider: "memory" });
82
- const probe = await storage.probe();
83
- assert.deepEqual(probe, {
84
- connectivity: true,
85
- writable: true,
86
- readable: true,
87
- quotaAvailable: true,
88
- });
89
- });
90
- test("probe() delegates to the driver's probe when present (Req 23.3)", async () => {
91
- const driverProbe = {
92
- connectivity: true,
93
- writable: false,
94
- readable: true,
95
- quotaAvailable: true,
96
- };
97
- // A minimal driver implementing the mandatory primitives + probe.
98
- const driver = {
99
- name: "fake",
100
- async put() {
101
- return {
102
- key: "k",
103
- size: 0,
104
- contentType: "application/octet-stream",
105
- etag: "e",
106
- checksum: "c",
107
- accessLevel: "private",
108
- createdAt: 0,
109
- updatedAt: 0,
110
- custom: {},
111
- };
112
- },
113
- async get() {
114
- return { found: false };
115
- },
116
- async exists() {
117
- return false;
118
- },
119
- async delete() { },
120
- async stat() {
121
- return null;
122
- },
123
- async list() {
124
- return [];
125
- },
126
- async putStream() {
127
- throw new Error("unused");
128
- },
129
- async getStream() {
130
- throw new Error("unused");
131
- },
132
- async probe() {
133
- return driverProbe;
134
- },
135
- };
136
- const storage = createStorage({ provider: "fake", driver });
137
- assert.deepEqual(await storage.probe(), driverProbe);
138
- });
139
- test("config.metrics registers all storage metrics of the correct kind and reflects live counts (Req 23.1, 23.2)", async () => {
140
- const metrics = new MetricsRegistry();
141
- const storage = createStorage({ provider: "memory", metrics });
142
- // All metrics registered with the correct kind.
143
- assert.ok(metrics.get(STORAGE_UPLOADS_METRIC) instanceof Counter);
144
- assert.ok(metrics.get(STORAGE_DOWNLOADS_METRIC) instanceof Counter);
145
- assert.ok(metrics.get(STORAGE_BYTES_UPLOADED_METRIC) instanceof Counter);
146
- assert.ok(metrics.get(STORAGE_BYTES_DOWNLOADED_METRIC) instanceof Counter);
147
- assert.ok(metrics.get(STORAGE_FAILED_UPLOADS_METRIC) instanceof Counter);
148
- assert.ok(metrics.get(STORAGE_MULTIPART_METRIC) instanceof Counter);
149
- assert.ok(metrics.get(STORAGE_RESUMABLE_METRIC) instanceof Counter);
150
- assert.ok(metrics.get(STORAGE_ACTIVE_UPLOADS_METRIC) instanceof Gauge);
151
- assert.ok(metrics.get(STORAGE_USAGE_METRIC) instanceof Gauge);
152
- assert.ok(metrics.get(STORAGE_LATENCY_METRIC) instanceof Histogram);
153
- await storage.put("a.txt", "hello"); // 5 bytes
154
- await storage.get("a.txt");
155
- assert.match(metrics.get(STORAGE_UPLOADS_METRIC).render(), /storage_uploads_total 1/);
156
- assert.match(metrics.get(STORAGE_DOWNLOADS_METRIC).render(), /storage_downloads_total 1/);
157
- assert.match(metrics.get(STORAGE_BYTES_UPLOADED_METRIC).render(), /storage_bytes_uploaded_total 5/);
158
- assert.match(metrics.get(STORAGE_BYTES_DOWNLOADED_METRIC).render(), /storage_bytes_downloaded_total 5/);
159
- assert.match(metrics.get(STORAGE_USAGE_METRIC).render(), /storage_usage_bytes 5/);
160
- assert.match(metrics.get(STORAGE_LATENCY_METRIC).render(), /storage_operation_latency_seconds_count 2/);
161
- await storage.close();
162
- });
163
- test("config.health registers the storage health check reporting up over the memory driver (Req 23.3)", async () => {
164
- const health = new HealthCheckRegistry();
165
- const storage = createStorage({ provider: "memory", health });
166
- const live = await health.runLiveness();
167
- assert.ok(STORAGE_HEALTH_CHECK_NAME in live.checks);
168
- const check = live.checks[STORAGE_HEALTH_CHECK_NAME];
169
- assert.equal(check.status, "up");
170
- assert.equal(check.details.connectivity, true);
171
- assert.equal(check.details.writable, true);
172
- assert.equal(check.details.readable, true);
173
- assert.equal(check.details.quotaAvailable, true);
174
- await storage.close();
175
- });
176
- test("the health check reports down when the driver probe reports a failing dimension (Req 23.3)", async () => {
177
- const health = new HealthCheckRegistry();
178
- const driver = {
179
- name: "fake",
180
- async put() {
181
- throw new Error("unused");
182
- },
183
- async get() {
184
- return { found: false };
185
- },
186
- async exists() {
187
- return false;
188
- },
189
- async delete() { },
190
- async stat() {
191
- return null;
192
- },
193
- async list() {
194
- return [];
195
- },
196
- async putStream() {
197
- throw new Error("unused");
198
- },
199
- async getStream() {
200
- throw new Error("unused");
201
- },
202
- async probe() {
203
- return { connectivity: true, writable: false, readable: true, quotaAvailable: true };
204
- },
205
- };
206
- const storage = createStorage({ provider: "fake", driver, health });
207
- const live = await health.runLiveness();
208
- assert.equal(live.checks[STORAGE_HEALTH_CHECK_NAME].status, "down");
209
- assert.equal(live.checks[STORAGE_HEALTH_CHECK_NAME].details.writable, false);
210
- await storage.close();
211
- });
212
- test("registration is idempotent against a shared registry (Req 23.1)", async () => {
213
- const metrics = new MetricsRegistry();
214
- const first = registerStorageObservability({ metrics });
215
- // A second registration against the same registry must not throw.
216
- let second;
217
- assert.doesNotThrow(() => {
218
- second = registerStorageObservability({ metrics });
219
- });
220
- const storage = createStorage({ provider: "memory", metrics });
221
- first.attach(storage);
222
- second.attach(storage);
223
- await storage.put("k", "v");
224
- assert.doesNotThrow(() => {
225
- first.refresh();
226
- second.refresh();
227
- metrics.collect();
228
- });
229
- first.close();
230
- second.close();
231
- await storage.close();
232
- });
233
- test("with no registries, operations proceed and telemetry is a complete no-op (Req 23.4)", async () => {
234
- const storage = createStorage({ provider: "memory" });
235
- const metadata = await storage.put("k", "v");
236
- assert.equal(metadata.key, "k");
237
- assert.equal(storage.stats().uploads, 1);
238
- await storage.close();
239
- });
240
- //# sourceMappingURL=observability.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"observability.test.js","sourceRoot":"","sources":["../../src/tests/observability.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=plugin.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../src/tests/plugin.test.ts"],"names":[],"mappings":""}