@ibgib/node-gib 0.0.22 → 0.0.23

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 (29) hide show
  1. package/README.md +4 -0
  2. package/dist/vcs/branch-space-helper.d.mts +23 -0
  3. package/dist/vcs/branch-space-helper.d.mts.map +1 -0
  4. package/dist/vcs/branch-space-helper.mjs +78 -0
  5. package/dist/vcs/branch-space-helper.mjs.map +1 -0
  6. package/dist/vcs/workspace-space-helper.d.mts +26 -0
  7. package/dist/vcs/workspace-space-helper.d.mts.map +1 -0
  8. package/dist/vcs/workspace-space-helper.mjs +71 -0
  9. package/dist/vcs/workspace-space-helper.mjs.map +1 -0
  10. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-constants.d.mts +7 -0
  11. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-constants.d.mts.map +1 -0
  12. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-constants.mjs +7 -0
  13. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-constants.mjs.map +1 -0
  14. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-types.d.mts +15 -0
  15. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-types.d.mts.map +1 -0
  16. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-types.mjs +23 -0
  17. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-types.mjs.map +1 -0
  18. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.d.mts +66 -0
  19. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.d.mts.map +1 -0
  20. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.mjs +326 -0
  21. package/dist/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.mjs.map +1 -0
  22. package/package.json +2 -2
  23. package/src/serve-gib/handlers/api/email/email-verify.respec.mts +4 -4
  24. package/src/vcs/branch-space-helper.mts +109 -0
  25. package/src/vcs/workspace-space-helper.mts +104 -0
  26. package/src/witness/space/node-workspace-projection-space/node-workspace-projection-space-constants.mts +8 -0
  27. package/src/witness/space/node-workspace-projection-space/node-workspace-projection-space-types.mts +43 -0
  28. package/src/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.mts +416 -0
  29. package/src/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.respec.mts +212 -0
@@ -0,0 +1,326 @@
1
+ /**
2
+ * @module node-workspace-projection-space-v1
3
+ *
4
+ * Concrete Node.js workspace projection space implementation.
5
+ * Projects B2tFS items to physical OS disk and scans physical directories.
6
+ */
7
+ import fs from 'node:fs/promises';
8
+ import path from 'node:path';
9
+ import crypto from 'node:crypto';
10
+ import { clone, extractErrorMsg } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
11
+ import { GLOBAL_LOG_A_LOT } from '@ibgib/core-gib/dist/core-constants.mjs';
12
+ import { getFromSpace } from '@ibgib/core-gib/dist/witness/space/space-helper.mjs';
13
+ import { WorkspaceProjectionSpaceBase_V1 } from '@ibgib/core-gib/dist/witness/space/workspace-projection-space/workspace-projection-space-base-v1.mjs';
14
+ import { isPathFiltered, parseFilterFileContent } from '@ibgib/core-gib/dist/vcs/filter/glob-helper.mjs';
15
+ import { DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DATA_V1, } from './node-workspace-projection-space-types.mjs';
16
+ const logalot = GLOBAL_LOG_A_LOT;
17
+ /**
18
+ * Node.js Workspace Projection Space that projects B2tFS item DAGs directly onto
19
+ * the local filesystem and scans physical directories to report workspace state.
20
+ */
21
+ export class NodeWorkspaceProjectionSpace_V1 extends WorkspaceProjectionSpaceBase_V1 {
22
+ lc = `[${NodeWorkspaceProjectionSpace_V1.name}]`;
23
+ /** Backing CAS space where source BinIbGibs and child items reside */
24
+ backingSpace;
25
+ constructor(initialDataOrOpts, initialRel8ns) {
26
+ let data;
27
+ let rel8ns = initialRel8ns;
28
+ let backingSpace;
29
+ if (initialDataOrOpts && ('workspaceRoot' in initialDataOrOpts || 'name' in initialDataOrOpts)) {
30
+ data = initialDataOrOpts;
31
+ }
32
+ else if (initialDataOrOpts && typeof initialDataOrOpts === 'object') {
33
+ const opts = initialDataOrOpts;
34
+ data = opts.initialData;
35
+ rel8ns = opts.initialRel8ns ?? initialRel8ns;
36
+ backingSpace = opts.backingSpace;
37
+ }
38
+ super(data ?? clone(DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DATA_V1), rel8ns);
39
+ this.backingSpace = backingSpace;
40
+ }
41
+ // #region Implementation of Abstract Extension Hooks
42
+ /**
43
+ * Projects an item (and its recursive child hierarchy or binary payload) onto the physical workspace.
44
+ */
45
+ async putItemToWorkspaceImpl({ item, subPath, }) {
46
+ const lc = `${this.lc}[${this.putItemToWorkspaceImpl.name}]`;
47
+ try {
48
+ if (logalot) {
49
+ console.log(`${lc} projecting item to workspace...`);
50
+ }
51
+ const workspaceRoot = this.data?.workspaceRoot;
52
+ if (!workspaceRoot) {
53
+ throw new Error(`${lc} workspaceRoot is required in space data (E: 7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d)`);
54
+ }
55
+ if (!item || !item.data) {
56
+ throw new Error(`${lc} item and item.data are required (E: 8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e)`);
57
+ }
58
+ const { fsType, name } = item.data;
59
+ let itemRelPath;
60
+ if (subPath === undefined) {
61
+ itemRelPath = fsType === 'folder' ? '' : (name || '');
62
+ }
63
+ else {
64
+ itemRelPath = name ? (subPath ? path.join(subPath, name) : name) : subPath;
65
+ }
66
+ const targetPath = itemRelPath ? path.join(workspaceRoot, itemRelPath) : workspaceRoot;
67
+ if (fsType === 'folder') {
68
+ await fs.mkdir(targetPath, { recursive: true });
69
+ const childAddrs = item.rel8ns?.b2tFS_child || item.rel8ns?.b2tfs_child || [];
70
+ for (const childAddr of childAddrs) {
71
+ const childItem = (await this.fetchIbGib(childAddr));
72
+ await this.putItemToWorkspaceImpl({
73
+ item: childItem,
74
+ subPath: itemRelPath,
75
+ });
76
+ }
77
+ }
78
+ else if (fsType === 'file') {
79
+ await fs.mkdir(path.dirname(targetPath), { recursive: true });
80
+ if (!item.rel8ns) {
81
+ throw new Error(`${lc} item.rel8ns required for file item (E: 8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d)`);
82
+ }
83
+ const binAddrs = item.rel8ns.bin;
84
+ if (!binAddrs || binAddrs.length === 0) {
85
+ throw new Error(`${lc} item.rel8ns.bin required for file item ${name} (E: 9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e)`);
86
+ }
87
+ const latestBinAddr = binAddrs.at(-1);
88
+ const binIbGib = await this.fetchIbGib(latestBinAddr);
89
+ if (binIbGib.data === undefined) {
90
+ throw new Error(`${lc} BinIbGib at addr ${latestBinAddr} has undefined data (E: 1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a)`);
91
+ }
92
+ let fileData;
93
+ if (binIbGib.data instanceof Uint8Array || Buffer.isBuffer(binIbGib.data)) {
94
+ fileData = binIbGib.data;
95
+ }
96
+ else if (typeof binIbGib.data === 'string') {
97
+ fileData = binIbGib.data;
98
+ }
99
+ else if (typeof binIbGib.data === 'object') {
100
+ const vals = Object.values(binIbGib.data);
101
+ fileData = new Uint8Array(vals);
102
+ }
103
+ else {
104
+ fileData = new Uint8Array(0);
105
+ }
106
+ await fs.writeFile(targetPath, fileData);
107
+ }
108
+ }
109
+ catch (error) {
110
+ console.error(`${lc} ${extractErrorMsg(error)} (E: 9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f)`);
111
+ throw error;
112
+ }
113
+ }
114
+ /**
115
+ * Scans the physical workspace directory and returns file observations and pending companion notes.
116
+ */
117
+ async scanWorkspaceImpl({ subPath, filterPatterns, }) {
118
+ const lc = `${this.lc}[${this.scanWorkspaceImpl.name}]`;
119
+ try {
120
+ if (logalot) {
121
+ console.log(`${lc} starting physical scan...`);
122
+ }
123
+ const workspaceRoot = this.data?.workspaceRoot;
124
+ if (!workspaceRoot) {
125
+ throw new Error(`${lc} workspaceRoot is required in space data (E: 0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a)`);
126
+ }
127
+ const scanDir = subPath ? path.join(workspaceRoot, subPath) : workspaceRoot;
128
+ const vcsFolderName = this.data?.vcsFolderName || '.vcsgib';
129
+ let patterns = filterPatterns ?? this.data?.filterPatterns;
130
+ if (!patterns || patterns.length === 0) {
131
+ try {
132
+ const ignorePath = path.join(workspaceRoot, '.ibgibignore');
133
+ const ignoreContent = await fs.readFile(ignorePath, 'utf8');
134
+ patterns = parseFilterFileContent(ignoreContent);
135
+ }
136
+ catch {
137
+ patterns = [];
138
+ }
139
+ }
140
+ const files = new Map();
141
+ const pendingComments = [];
142
+ await this.scanDirRecursive({
143
+ dirPath: scanDir,
144
+ baseDir: workspaceRoot,
145
+ vcsFolderName,
146
+ filterPatterns: patterns,
147
+ outFiles: files,
148
+ outComments: pendingComments,
149
+ });
150
+ return {
151
+ files,
152
+ pendingComments,
153
+ };
154
+ }
155
+ catch (error) {
156
+ console.error(`${lc} ${extractErrorMsg(error)} (E: 1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b)`);
157
+ throw error;
158
+ }
159
+ }
160
+ /**
161
+ * Unlinks a file, folder, or comment file from disk.
162
+ */
163
+ async deleteFromWorkspaceImpl({ relPath, ibGib, }) {
164
+ const lc = `${this.lc}[${this.deleteFromWorkspaceImpl.name}]`;
165
+ try {
166
+ if (logalot) {
167
+ console.log(`${lc} deleting from workspace...`);
168
+ }
169
+ const workspaceRoot = this.data?.workspaceRoot;
170
+ if (!workspaceRoot) {
171
+ throw new Error(`${lc} workspaceRoot is required (E: 2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c)`);
172
+ }
173
+ const targetRelPath = relPath || ibGib?.data?.name;
174
+ if (!targetRelPath) {
175
+ throw new Error(`${lc} relPath or item name required for deletion (E: 3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d)`);
176
+ }
177
+ const fullPath = path.join(workspaceRoot, targetRelPath);
178
+ await fs.rm(fullPath, { recursive: true, force: true });
179
+ }
180
+ catch (error) {
181
+ console.error(`${lc} ${extractErrorMsg(error)} (E: 4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e)`);
182
+ throw error;
183
+ }
184
+ }
185
+ /**
186
+ * Reads raw bytes of a physical workspace file from disk.
187
+ */
188
+ async getFileBytesImpl({ relPath, }) {
189
+ const lc = `${this.lc}[${this.getFileBytesImpl.name}]`;
190
+ try {
191
+ const workspaceRoot = this.data?.workspaceRoot;
192
+ if (!workspaceRoot) {
193
+ return undefined;
194
+ }
195
+ const fullPath = path.isAbsolute(relPath) ? relPath : path.join(workspaceRoot, relPath);
196
+ const buf = await fs.readFile(fullPath);
197
+ return new Uint8Array(buf);
198
+ }
199
+ catch {
200
+ return undefined;
201
+ }
202
+ }
203
+ // #endregion
204
+ // #region Internal Helpers
205
+ /**
206
+ * Recursively scans physical directories on disk.
207
+ */
208
+ async scanDirRecursive({ dirPath, baseDir, vcsFolderName, filterPatterns, outFiles, outComments, }) {
209
+ const lc = `${this.lc}[${this.scanDirRecursive.name}]`;
210
+ let entries = [];
211
+ try {
212
+ entries = await fs.readdir(dirPath, { withFileTypes: true });
213
+ }
214
+ catch (error) {
215
+ console.error(`${lc} Failed to read directory ${dirPath}: ${extractErrorMsg(error)} (E: 5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e)`);
216
+ throw error;
217
+ }
218
+ for (const entry of entries) {
219
+ const fullEntryPath = path.join(dirPath, entry.name);
220
+ const relPath = path.relative(baseDir, fullEntryPath).replace(/\\/g, '/');
221
+ // Exclude VCS metadata folders, .git, and worktrees folder 'b'
222
+ if (relPath === vcsFolderName || relPath.startsWith(vcsFolderName + '/') ||
223
+ relPath === '.git' || relPath.startsWith('.git/') ||
224
+ relPath === 'b' || relPath.startsWith('b/')) {
225
+ continue;
226
+ }
227
+ if (this.isFiltered(relPath, entry.isDirectory(), filterPatterns)) {
228
+ continue;
229
+ }
230
+ if (entry.isDirectory()) {
231
+ outFiles.set(relPath, {
232
+ relPath,
233
+ fullPath: fullEntryPath,
234
+ isDirectory: true,
235
+ });
236
+ await this.scanDirRecursive({
237
+ dirPath: fullEntryPath,
238
+ baseDir,
239
+ vcsFolderName,
240
+ filterPatterns,
241
+ outFiles,
242
+ outComments,
243
+ });
244
+ }
245
+ else if (entry.isFile()) {
246
+ if (this.isCommentMetadataFilename(entry.name)) {
247
+ const parentRelPath = path.relative(baseDir, dirPath).replace(/\\/g, '/');
248
+ const normalizedParent = parentRelPath === '.' ? '' : parentRelPath;
249
+ let content = '';
250
+ try {
251
+ content = await fs.readFile(fullEntryPath, 'utf8');
252
+ }
253
+ catch (error) {
254
+ console.error(`${lc} Failed to read comment file ${fullEntryPath}: ${extractErrorMsg(error)} (E: 6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f)`);
255
+ throw error;
256
+ }
257
+ const topicName = this.extractCommentTopicName(entry.name);
258
+ const targetRelPath = normalizedParent ? `${normalizedParent}/${topicName}` : topicName;
259
+ outComments.push({
260
+ commentRelPath: relPath,
261
+ commentFullPath: fullEntryPath,
262
+ targetRelPath,
263
+ targetType: entry.name.startsWith('.ib.') ? 'file' : 'folder',
264
+ topicName,
265
+ content,
266
+ });
267
+ }
268
+ else {
269
+ let fileHash;
270
+ let size;
271
+ try {
272
+ const fileData = await fs.readFile(fullEntryPath);
273
+ fileHash = crypto.createHash('sha256').update(fileData).digest('hex');
274
+ size = fileData.length;
275
+ }
276
+ catch (error) {
277
+ console.error(`${lc} Failed to read file ${fullEntryPath}: ${extractErrorMsg(error)} (E: 7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a)`);
278
+ throw error;
279
+ }
280
+ outFiles.set(relPath, {
281
+ relPath,
282
+ fullPath: fullEntryPath,
283
+ isDirectory: false,
284
+ fileHash,
285
+ size,
286
+ });
287
+ }
288
+ }
289
+ }
290
+ }
291
+ isCommentMetadataFilename(filename) {
292
+ return filename.startsWith('.ib.') && filename.endsWith('.md') && filename.length > '.ib..md'.length;
293
+ }
294
+ extractCommentTopicName(filename) {
295
+ if (!this.isCommentMetadataFilename(filename)) {
296
+ return '';
297
+ }
298
+ return filename.slice(4, -3);
299
+ }
300
+ isFiltered(relPath, isDirectory, filterPatterns) {
301
+ return isPathFiltered({ relativePath: relPath, isDirectory, filterPatterns });
302
+ }
303
+ /**
304
+ * Helper to fetch an IbGib strictly from backingSpace with fail-fast validation.
305
+ */
306
+ async fetchIbGib(addr) {
307
+ const lc = `${this.lc}[${this.fetchIbGib.name}]`;
308
+ try {
309
+ if (!this.backingSpace) {
310
+ throw new Error(`${lc} backingSpace required to fetch IbGib at ${addr} (E: 2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b)`);
311
+ }
312
+ const resGet = await getFromSpace({ space: this.backingSpace, addrs: [addr] });
313
+ if (!resGet.success || !resGet.ibGibs || resGet.ibGibs.length === 0) {
314
+ const resIbGib = resGet.rawResultIbGib;
315
+ const addrsNotFound = resIbGib?.data?.addrsNotFound ?? 'unknown';
316
+ throw new Error(`${lc} couldn't find addr ${addr} in backingSpace. addrsNotFound: ${addrsNotFound} (E: 3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c)`);
317
+ }
318
+ return resGet.ibGibs[0];
319
+ }
320
+ catch (error) {
321
+ console.error(`${lc} ${extractErrorMsg(error)} (E: 4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d)`);
322
+ throw error;
323
+ }
324
+ }
325
+ }
326
+ //# sourceMappingURL=node-workspace-projection-space-v1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-workspace-projection-space-v1.mjs","sourceRoot":"","sources":["../../../../src/witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibgib/node-gib",
3
- "version": "0.0.22",
3
+ "version": "0.0.23",
4
4
  "description": "Node and server-specific ibGib code, i.e., things that don't run in the browser.",
5
5
  "funding": {
6
6
  "type": "individual",
@@ -26,7 +26,7 @@
26
26
  "dependencies": {
27
27
  "@ibgib/helper-gib": "^0.0.37",
28
28
  "@ibgib/ts-gib": "^0.5.34",
29
- "@ibgib/core-gib": "^0.1.77",
29
+ "@ibgib/core-gib": "^0.1.78",
30
30
  "@ibgib/encrypt-gib": "^0.3.1"
31
31
  },
32
32
  "devDependencies": {
@@ -33,7 +33,7 @@ await respecfully(sir, '6-Digit Verification Code & Server Quarantine Policy', a
33
33
  }
34
34
  mkdirSync(testDataDir, { recursive: true });
35
35
 
36
- await ifWeMight(sir, 'generate, verify, and enforce expiration & single-use rules on magic link tokens', async () => {
36
+ await ifWe(sir, 'generate, verify, and enforce expiration & single-use rules on magic link tokens', async () => {
37
37
  clearConsumedNonces();
38
38
  const email = 'alice@example.com';
39
39
  const primaryTjpAddr = 'keystone^ABC123DEF456_TJP';
@@ -69,7 +69,7 @@ await respecfully(sir, '6-Digit Verification Code & Server Quarantine Policy', a
69
69
  }
70
70
  });
71
71
 
72
- await ifWeMight(sir, 'create pending staging quarantine folder and AOT metadata files', async () => {
72
+ await ifWe(sir, 'create pending staging quarantine folder and AOT metadata files', async () => {
73
73
  clearConsumedNonces();
74
74
  const primaryTjpAddr = 'keystone^STAGING123_TJP';
75
75
  const mockKeystone = {
@@ -102,7 +102,7 @@ await respecfully(sir, '6-Digit Verification Code & Server Quarantine Policy', a
102
102
  iReckon(sir, meta1.verified).asTo('meta1 initial verified status').isGonnaBeFalse();
103
103
  });
104
104
 
105
- await ifWeMight(sir, 'handle 6-digit OTP code verification and promote identity upon verification', async () => {
105
+ await ifWe(sir, 'handle 6-digit OTP code verification and promote identity upon verification', async () => {
106
106
  clearConsumedNonces();
107
107
  const primaryTjpAddr = 'keystone^MULTIEMAIL_TJP';
108
108
  const email = 'multi1@example.com';
@@ -162,7 +162,7 @@ await respecfully(sir, '6-Digit Verification Code & Server Quarantine Policy', a
162
162
  iReckon(sir, record?.primaryTjpAddr).asTo('record primaryTjpAddr').isGonnaBe(primaryTjpAddr);
163
163
  });
164
164
 
165
- await ifWeMight(sir, 'execute atomic GC lockfile cleanup on expired staging directories', async () => {
165
+ await ifWe(sir, 'execute atomic GC lockfile cleanup on expired staging directories', async () => {
166
166
  clearConsumedNonces();
167
167
  const expiredTjpAddr = 'keystone^EXPIRED_TJP';
168
168
  const mockKeystone = { ib: expiredTjpAddr, data: { tjpAddr: expiredTjpAddr } };
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @module branch-space-helper
3
+ *
4
+ * Helper for managing dedicated Node branch spaces (`b2s_...`) in metaspace.
5
+ */
6
+
7
+ import { clone, extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
8
+ import { getGib } from '@ibgib/ts-gib/dist/V1/transforms/transform-helper.mjs';
9
+ import { Metaspace_Nodespace } from '../witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.mjs';
10
+ import { NodeFilesystemSpace_V1 } from '../witness/space/node-filesystem-space/node-filesystem-space-v1.mjs';
11
+ import { DEFAULT_NODE_FILESYSTEM_SPACE_DATA_V1 } from '../witness/space/node-filesystem-space/node-filesystem-space-types.mjs';
12
+ import { putInSpace } from '@ibgib/core-gib/dist/witness/space/space-helper.mjs';
13
+ import { GLOBAL_LOG_A_LOT } from '@ibgib/core-gib/dist/core-constants.mjs';
14
+ import { getB2tFSBranchSpaceName } from '@ibgib/core-gib/dist/vcs/branch/branch-helper.mjs';
15
+
16
+ export {
17
+ populateBranchSpaceFromGraph,
18
+ PopulateBranchSpaceFromGraphOpts,
19
+ PopulateBranchSpaceFromGraphResult,
20
+ } from '@ibgib/core-gib/dist/vcs/branch/branch-graph-helper.mjs';
21
+
22
+ const lcFile = `[branch-space-helper]`;
23
+ const logalot = GLOBAL_LOG_A_LOT;
24
+
25
+ export interface GetOrCreateBranchSpaceOpts {
26
+ metaspace: Metaspace_Nodespace;
27
+ vcsPath: string;
28
+ branchName: string;
29
+ }
30
+
31
+ export interface GetOrCreateBranchSpaceResult {
32
+ space: NodeFilesystemSpace_V1;
33
+ spaceId: string;
34
+ spaceName: string;
35
+ }
36
+
37
+ /**
38
+ * Gets an existing branch space or creates and registers a new dedicated NodeFilesystemSpace_V1 in metaspace.
39
+ */
40
+ export async function getOrCreateBranchSpace({
41
+ metaspace,
42
+ vcsPath,
43
+ branchName,
44
+ }: GetOrCreateBranchSpaceOpts): Promise<GetOrCreateBranchSpaceResult> {
45
+ const lc = `${lcFile}[${getOrCreateBranchSpace.name}]`;
46
+ try {
47
+ if (logalot) {
48
+ console.log(`${lc} starting... (I: a1b2c3d4e5f60718293a4b5c6d7e8f9a)`);
49
+ }
50
+
51
+ if (!metaspace || !vcsPath || !branchName) {
52
+ throw new Error(`metaspace, vcsPath, and branchName are required (E: b2c3d4e5f60718293a4b5c6d7e8f9a0b)`);
53
+ }
54
+
55
+ const spaceName = getB2tFSBranchSpaceName(branchName);
56
+
57
+ const localSpaces = await metaspace.getLocalUserSpaces({ lock: false });
58
+ const existingSpace = localSpaces.find(s => s.data?.name === spaceName || s.ib === spaceName);
59
+
60
+ if (existingSpace) {
61
+ const spaceId = existingSpace.data?.uuid || existingSpace.data?.spaceId || spaceName;
62
+ if (logalot) {
63
+ console.log(`${lc} Found existing branch space ${spaceName} (spaceId: ${spaceId}) (I: c3d4e5f60718293a4b5c6d7e8f9a0b1c)`);
64
+ }
65
+ return {
66
+ space: existingSpace as NodeFilesystemSpace_V1,
67
+ spaceId,
68
+ spaceName,
69
+ };
70
+ }
71
+
72
+ const spaceUuid = await getUUID();
73
+ const spaceData = {
74
+ ...clone(DEFAULT_NODE_FILESYSTEM_SPACE_DATA_V1),
75
+ uuid: spaceUuid,
76
+ isTjp: true,
77
+ name: spaceName,
78
+ baseDir: vcsPath,
79
+ spaceSubPath: spaceName,
80
+ };
81
+
82
+ const space = new NodeFilesystemSpace_V1(spaceData);
83
+ space.gib = await getGib({ ibGib: space, hasTjp: true });
84
+ await space.initialized;
85
+
86
+ await putInSpace({ space: metaspace.zeroSpace, ibGib: space });
87
+ await metaspace.registerNewIbGib({ ibGib: space });
88
+ if (metaspace.fnUpdateBootstrap) {
89
+ await metaspace.fnUpdateBootstrap(space);
90
+ }
91
+
92
+ if (logalot) {
93
+ console.log(`${lc} Created new branch space ${spaceName} (spaceId: ${spaceUuid}) (I: d4e5f60718293a4b5c6d7e8f9a0b1c2d)`);
94
+ }
95
+
96
+ return {
97
+ space,
98
+ spaceId: spaceUuid,
99
+ spaceName,
100
+ };
101
+ } catch (error) {
102
+ console.error(`${lc} ${extractErrorMsg(error)} (E: e5f60718293a4b5c6d7e8f9a0b1c2d3e)`);
103
+ throw error;
104
+ } finally {
105
+ if (logalot) {
106
+ console.log(`${lc} complete. (I: f60718293a4b5c6d7e8f9a0b1c2d3e4f)`);
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @module workspace-space-helper
3
+ *
4
+ * Helper for managing NodeWorkspaceProjectionSpace_V1 in metaspace.
5
+ */
6
+
7
+ import { clone, extractErrorMsg, getUUID } from '@ibgib/helper-gib/dist/helpers/utils-helper.mjs';
8
+ import { Metaspace_Nodespace } from '../witness/space/metaspace/metaspace-nodespace/metaspace-nodespace.mjs';
9
+ import { NodeWorkspaceProjectionSpace_V1 } from '../witness/space/node-workspace-projection-space/node-workspace-projection-space-v1.mjs';
10
+ import { IbGibSpaceAny } from '@ibgib/core-gib/dist/witness/space/space-base-v1.mjs';
11
+ import { GLOBAL_LOG_A_LOT } from '@ibgib/core-gib/dist/core-constants.mjs';
12
+
13
+ const lcFile = `[workspace-space-helper]`;
14
+ const logalot = GLOBAL_LOG_A_LOT;
15
+
16
+ export interface GetOrCreateWorkspaceProjectionSpaceOpts {
17
+ metaspace: Metaspace_Nodespace;
18
+ workspaceRoot: string;
19
+ vcsFolderName?: string;
20
+ backingSpace: IbGibSpaceAny;
21
+ branchAddr?: string;
22
+ name?: string;
23
+ }
24
+
25
+ export interface GetOrCreateWorkspaceProjectionSpaceResult {
26
+ space: NodeWorkspaceProjectionSpace_V1;
27
+ spaceId: string;
28
+ spaceName: string;
29
+ }
30
+
31
+ /**
32
+ * Gets an existing projection space for a workspace root or instantiates and returns a NodeWorkspaceProjectionSpace_V1.
33
+ */
34
+ export async function getOrCreateWorkspaceProjectionSpace({
35
+ metaspace,
36
+ workspaceRoot,
37
+ vcsFolderName = '.vcsgib',
38
+ backingSpace,
39
+ branchAddr,
40
+ name,
41
+ }: GetOrCreateWorkspaceProjectionSpaceOpts): Promise<GetOrCreateWorkspaceProjectionSpaceResult> {
42
+ const lc = `${lcFile}[${getOrCreateWorkspaceProjectionSpace.name}]`;
43
+ try {
44
+ if (logalot) {
45
+ console.log(`${lc} starting... (I: a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4)`);
46
+ }
47
+
48
+ if (!metaspace || !workspaceRoot || !backingSpace) {
49
+ throw new Error(`metaspace, workspaceRoot, and backingSpace are required (E: a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4)`);
50
+ }
51
+
52
+ const spaceName = name || `ws_${workspaceRoot.replace(/[^a-zA-Z0-9_]/g, '_')}`;
53
+
54
+ const localSpaces = (await metaspace.getLocalUserSpaces({ lock: false })) || [];
55
+ const existingSpace = localSpaces.find(s =>
56
+ (s.data?.name === spaceName || s.ib === spaceName) ||
57
+ (s.data?.classname?.includes('WorkspaceProjectionSpace') && s.data?.workspaceRoot === workspaceRoot)
58
+ );
59
+
60
+ if (existingSpace) {
61
+ const spaceId = existingSpace.data?.uuid || existingSpace.data?.spaceId || spaceName;
62
+ if (logalot) {
63
+ console.log(`${lc} Found existing workspace projection space ${spaceName} (spaceId: ${spaceId})`);
64
+ }
65
+ return {
66
+ space: existingSpace as NodeWorkspaceProjectionSpace_V1,
67
+ spaceId,
68
+ spaceName,
69
+ };
70
+ }
71
+
72
+ const spaceUuid = await getUUID();
73
+ const space = new NodeWorkspaceProjectionSpace_V1({
74
+ initialData: {
75
+ workspaceRoot,
76
+ vcsFolderName,
77
+ classname: 'NodeWorkspaceProjectionSpace_V1',
78
+ name: spaceName,
79
+ uuid: spaceUuid,
80
+ version: '1',
81
+ branchAddr,
82
+ },
83
+ backingSpace,
84
+ });
85
+ await space.initialized;
86
+
87
+ if (logalot) {
88
+ console.log(`${lc} Created new workspace projection space ${spaceName} (spaceId: ${spaceUuid})`);
89
+ }
90
+
91
+ return {
92
+ space,
93
+ spaceId: spaceUuid,
94
+ spaceName,
95
+ };
96
+ } catch (error) {
97
+ console.error(`${lc} ${extractErrorMsg(error)} (E: b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3)`);
98
+ throw error;
99
+ } finally {
100
+ if (logalot) {
101
+ console.log(`${lc} complete.`);
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @module node-workspace-projection-space-constants
3
+ *
4
+ * Constants for Node.js workspace projection spaces.
5
+ */
6
+
7
+ export const DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DESCRIPTION =
8
+ 'Node.js space witness for projecting and observing workspace hierarchies on physical disk.';
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @module node-workspace-projection-space-types
3
+ *
4
+ * Types for Node.js workspace projection spaces.
5
+ */
6
+
7
+ import {
8
+ WorkspaceProjectionSpaceData_V1,
9
+ WorkspaceProjectionSpaceRel8ns_V1
10
+ } from '@ibgib/core-gib/dist/witness/space/workspace-projection-space/workspace-projection-space-types.mjs';
11
+ import {
12
+ DEFAULT_LOCAL_SPACE_POLLING_INTERVAL_MS,
13
+ IBGIB_SPACE_NAME_DEFAULT,
14
+ ZERO_SPACE_ID
15
+ } from '@ibgib/core-gib/dist/witness/space/space-constants.mjs';
16
+ import {
17
+ DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DESCRIPTION
18
+ } from './node-workspace-projection-space-constants.mjs';
19
+
20
+ /**
21
+ * Data payload for NodeWorkspaceProjectionSpace_V1.
22
+ */
23
+ export interface NodeWorkspaceProjectionSpaceData_V1 extends WorkspaceProjectionSpaceData_V1 {
24
+ }
25
+
26
+ export const DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DATA_V1: NodeWorkspaceProjectionSpaceData_V1 = {
27
+ version: '1',
28
+ uuid: ZERO_SPACE_ID,
29
+ name: IBGIB_SPACE_NAME_DEFAULT,
30
+ classname: 'NodeWorkspaceProjectionSpace_V1',
31
+ workspaceRoot: '',
32
+ vcsFolderName: '.vcsgib',
33
+ persistOptsAndResultIbGibs: false,
34
+ validateIbGibAddrsMatchIbGibs: false,
35
+ longPollingIntervalMs: DEFAULT_LOCAL_SPACE_POLLING_INTERVAL_MS,
36
+ allowPrimitiveArgs: false,
37
+ catchAllErrors: true,
38
+ description: DEFAULT_NODE_WORKSPACE_PROJECTION_SPACE_DESCRIPTION,
39
+ trace: false,
40
+ };
41
+
42
+ export interface NodeWorkspaceProjectionSpaceRel8ns_V1 extends WorkspaceProjectionSpaceRel8ns_V1 {
43
+ }