@teambit/objects 0.0.686 → 0.0.688

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.
@@ -0,0 +1,21 @@
1
+ import type BitObject from './object';
2
+ /**
3
+ * objects that were loaded or cached, held *weakly*: an object is returned from here only while something
4
+ * else still references it, and this map never keeps an object alive.
5
+ *
6
+ * it complements the size-bounded objects cache. when that cache evicts an object that is still in use
7
+ * (or an object is too big to be cached at all), a later load returns the same instance from here
8
+ * rather than re-reading and re-parsing a duplicate copy of it.
9
+ */
10
+ export declare class LiveObjects {
11
+ private entries;
12
+ private cleanup;
13
+ set(key: string, object: BitObject, size: number | undefined, cacheable: boolean): void;
14
+ get(key: string): {
15
+ object: BitObject;
16
+ size?: number;
17
+ cacheable: boolean;
18
+ } | undefined;
19
+ delete(key: string): void;
20
+ clear(): void;
21
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LiveObjects = void 0;
7
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
9
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
+ /// <reference lib="es2021.weakref" />
11
+
12
+ /**
13
+ * objects that were loaded or cached, held *weakly*: an object is returned from here only while something
14
+ * else still references it, and this map never keeps an object alive.
15
+ *
16
+ * it complements the size-bounded objects cache. when that cache evicts an object that is still in use
17
+ * (or an object is too big to be cached at all), a later load returns the same instance from here
18
+ * rather than re-reading and re-parsing a duplicate copy of it.
19
+ */
20
+ class LiveObjects {
21
+ constructor() {
22
+ _defineProperty(this, "entries", new Map());
23
+ _defineProperty(this, "cleanup", new FinalizationRegistry(key => {
24
+ // the key may have been re-set with another object since this one was registered
25
+ if (!this.entries.get(key)?.ref.deref()) this.entries.delete(key);
26
+ }));
27
+ }
28
+ set(key, object, size, cacheable) {
29
+ const existing = this.entries.get(key);
30
+ if (existing?.ref.deref() !== object) this.cleanup.register(object, key);
31
+ this.entries.set(key, {
32
+ ref: new WeakRef(object),
33
+ size,
34
+ cacheable
35
+ });
36
+ }
37
+ get(key) {
38
+ const entry = this.entries.get(key);
39
+ const object = entry?.ref.deref();
40
+ if (!entry || !object) return undefined;
41
+ return {
42
+ object,
43
+ size: entry.size,
44
+ cacheable: entry.cacheable
45
+ };
46
+ }
47
+ delete(key) {
48
+ this.entries.delete(key);
49
+ }
50
+ clear() {
51
+ this.entries.clear();
52
+ }
53
+ }
54
+ exports.LiveObjects = LiveObjects;
55
+
56
+ //# sourceMappingURL=live-objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["LiveObjects","constructor","_defineProperty","Map","FinalizationRegistry","key","entries","get","ref","deref","delete","set","object","size","cacheable","existing","cleanup","register","WeakRef","entry","undefined","clear","exports"],"sources":["live-objects.ts"],"sourcesContent":["/// <reference lib=\"es2021.weakref\" />\nimport type BitObject from './object';\n\ntype LiveObjectEntry = {\n ref: WeakRef<BitObject>;\n size?: number;\n /**\n * whether the object may be kept in the (strong) objects cache. big objects are only tracked here.\n */\n cacheable: boolean;\n};\n\n/**\n * objects that were loaded or cached, held *weakly*: an object is returned from here only while something\n * else still references it, and this map never keeps an object alive.\n *\n * it complements the size-bounded objects cache. when that cache evicts an object that is still in use\n * (or an object is too big to be cached at all), a later load returns the same instance from here\n * rather than re-reading and re-parsing a duplicate copy of it.\n */\nexport class LiveObjects {\n private entries = new Map<string, LiveObjectEntry>();\n private cleanup = new FinalizationRegistry<string>((key) => {\n // the key may have been re-set with another object since this one was registered\n if (!this.entries.get(key)?.ref.deref()) this.entries.delete(key);\n });\n\n set(key: string, object: BitObject, size: number | undefined, cacheable: boolean) {\n const existing = this.entries.get(key);\n if (existing?.ref.deref() !== object) this.cleanup.register(object, key);\n this.entries.set(key, { ref: new WeakRef(object), size, cacheable });\n }\n\n get(key: string): { object: BitObject; size?: number; cacheable: boolean } | undefined {\n const entry = this.entries.get(key);\n const object = entry?.ref.deref();\n if (!entry || !object) return undefined;\n return { object, size: entry.size, cacheable: entry.cacheable };\n }\n\n delete(key: string) {\n this.entries.delete(key);\n }\n\n clear() {\n this.entries.clear();\n }\n}\n"],"mappings":";;;;;;;;;AAAA;;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,WAAW,CAAC;EAAAC,YAAA;IAAAC,eAAA,kBACL,IAAIC,GAAG,CAA0B,CAAC;IAAAD,eAAA,kBAClC,IAAIE,oBAAoB,CAAUC,GAAG,IAAK;MAC1D;MACA,IAAI,CAAC,IAAI,CAACC,OAAO,CAACC,GAAG,CAACF,GAAG,CAAC,EAAEG,GAAG,CAACC,KAAK,CAAC,CAAC,EAAE,IAAI,CAACH,OAAO,CAACI,MAAM,CAACL,GAAG,CAAC;IACnE,CAAC,CAAC;EAAA;EAEFM,GAAGA,CAACN,GAAW,EAAEO,MAAiB,EAAEC,IAAwB,EAAEC,SAAkB,EAAE;IAChF,MAAMC,QAAQ,GAAG,IAAI,CAACT,OAAO,CAACC,GAAG,CAACF,GAAG,CAAC;IACtC,IAAIU,QAAQ,EAAEP,GAAG,CAACC,KAAK,CAAC,CAAC,KAAKG,MAAM,EAAE,IAAI,CAACI,OAAO,CAACC,QAAQ,CAACL,MAAM,EAAEP,GAAG,CAAC;IACxE,IAAI,CAACC,OAAO,CAACK,GAAG,CAACN,GAAG,EAAE;MAAEG,GAAG,EAAE,IAAIU,OAAO,CAACN,MAAM,CAAC;MAAEC,IAAI;MAAEC;IAAU,CAAC,CAAC;EACtE;EAEAP,GAAGA,CAACF,GAAW,EAAwE;IACrF,MAAMc,KAAK,GAAG,IAAI,CAACb,OAAO,CAACC,GAAG,CAACF,GAAG,CAAC;IACnC,MAAMO,MAAM,GAAGO,KAAK,EAAEX,GAAG,CAACC,KAAK,CAAC,CAAC;IACjC,IAAI,CAACU,KAAK,IAAI,CAACP,MAAM,EAAE,OAAOQ,SAAS;IACvC,OAAO;MAAER,MAAM;MAAEC,IAAI,EAAEM,KAAK,CAACN,IAAI;MAAEC,SAAS,EAAEK,KAAK,CAACL;IAAU,CAAC;EACjE;EAEAJ,MAAMA,CAACL,GAAW,EAAE;IAClB,IAAI,CAACC,OAAO,CAACI,MAAM,CAACL,GAAG,CAAC;EAC1B;EAEAgB,KAAKA,CAAA,EAAG;IACN,IAAI,CAACf,OAAO,CAACe,KAAK,CAAC,CAAC;EACtB;AACF;AAACC,OAAA,CAAAtB,WAAA,GAAAA,WAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ function _chai() {
4
+ const data = require("chai");
5
+ _chai = function () {
6
+ return data;
7
+ };
8
+ return data;
9
+ }
10
+ function _liveObjects() {
11
+ const data = require("./live-objects");
12
+ _liveObjects = function () {
13
+ return data;
14
+ };
15
+ return data;
16
+ }
17
+ const createObject = () => ({});
18
+ describe('LiveObjects', () => {
19
+ it('should return an object that is still referenced, with its size and cacheability', () => {
20
+ const liveObjects = new (_liveObjects().LiveObjects)();
21
+ const object = createObject();
22
+ liveObjects.set('key', object, 100, false);
23
+ (0, _chai().expect)(liveObjects.get('key')).to.deep.equal({
24
+ object,
25
+ size: 100,
26
+ cacheable: false
27
+ });
28
+ });
29
+ it('should return the latest object that was set for the same key', () => {
30
+ const liveObjects = new (_liveObjects().LiveObjects)();
31
+ const older = createObject();
32
+ const newer = createObject();
33
+ liveObjects.set('key', older, 1, true);
34
+ liveObjects.set('key', newer, 2, true);
35
+ (0, _chai().expect)(liveObjects.get('key')?.object).to.equal(newer);
36
+ });
37
+ it('should not return deleted or cleared objects', () => {
38
+ const liveObjects = new (_liveObjects().LiveObjects)();
39
+ const first = createObject();
40
+ const second = createObject();
41
+ liveObjects.set('first', first, 1, true);
42
+ liveObjects.set('second', second, 1, true);
43
+ liveObjects.delete('first');
44
+ (0, _chai().expect)(liveObjects.get('first')).to.be.undefined;
45
+ liveObjects.clear();
46
+ (0, _chai().expect)(liveObjects.get('second')).to.be.undefined;
47
+ });
48
+ it('should not keep an object alive once nothing else references it', async function () {
49
+ const gc = global.gc;
50
+ if (!gc) this.skip(); // requires running node with --expose-gc
51
+ const liveObjects = new (_liveObjects().LiveObjects)();
52
+ (() => liveObjects.set('key', createObject(), 1, true))();
53
+ // a WeakRef keeps its target alive until the end of the current job, so let it end before collecting
54
+ await new Promise(resolve => setImmediate(resolve));
55
+ gc();
56
+ (0, _chai().expect)(liveObjects.get('key')).to.be.undefined;
57
+ });
58
+ });
59
+
60
+ //# sourceMappingURL=live-objects.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_chai","data","require","_liveObjects","createObject","describe","it","liveObjects","LiveObjects","object","set","expect","get","to","deep","equal","size","cacheable","older","newer","first","second","delete","be","undefined","clear","gc","global","skip","Promise","resolve","setImmediate"],"sources":["live-objects.spec.ts"],"sourcesContent":["import { expect } from 'chai';\nimport type BitObject from './object';\nimport { LiveObjects } from './live-objects';\n\nconst createObject = () => ({}) as BitObject;\n\ndescribe('LiveObjects', () => {\n it('should return an object that is still referenced, with its size and cacheability', () => {\n const liveObjects = new LiveObjects();\n const object = createObject();\n liveObjects.set('key', object, 100, false);\n expect(liveObjects.get('key')).to.deep.equal({ object, size: 100, cacheable: false });\n });\n it('should return the latest object that was set for the same key', () => {\n const liveObjects = new LiveObjects();\n const older = createObject();\n const newer = createObject();\n liveObjects.set('key', older, 1, true);\n liveObjects.set('key', newer, 2, true);\n expect(liveObjects.get('key')?.object).to.equal(newer);\n });\n it('should not return deleted or cleared objects', () => {\n const liveObjects = new LiveObjects();\n const first = createObject();\n const second = createObject();\n liveObjects.set('first', first, 1, true);\n liveObjects.set('second', second, 1, true);\n liveObjects.delete('first');\n expect(liveObjects.get('first')).to.be.undefined;\n liveObjects.clear();\n expect(liveObjects.get('second')).to.be.undefined;\n });\n it('should not keep an object alive once nothing else references it', async function () {\n const gc = (global as any).gc;\n if (!gc) this.skip(); // requires running node with --expose-gc\n const liveObjects = new LiveObjects();\n (() => liveObjects.set('key', createObject(), 1, true))();\n // a WeakRef keeps its target alive until the end of the current job, so let it end before collecting\n await new Promise((resolve) => setImmediate(resolve));\n gc();\n expect(liveObjects.get('key')).to.be.undefined;\n });\n});\n"],"mappings":"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","ignoreList":[]}
@@ -17,11 +17,25 @@ export default class BitObject {
17
17
  */
18
18
  hash(): Ref;
19
19
  compress(): Promise<Buffer>;
20
+ /**
21
+ * same as `compress`, but also returns the size of the uncompressed content.
22
+ */
23
+ compressWithSize(): Promise<{
24
+ buffer: Buffer;
25
+ inflatedSize: number;
26
+ }>;
20
27
  serialize(): Buffer;
21
28
  /**
22
29
  * see `this.parseSync` for the sync version
23
30
  */
24
31
  static parseObject(fileContents: Buffer, filePath?: string): Promise<BitObject>;
32
+ /**
33
+ * same as `parseObject`, but also returns the size of the inflated content.
34
+ */
35
+ static parseObjectWithSize(fileContents: Buffer, filePath?: string): Promise<{
36
+ object: BitObject;
37
+ inflatedSize: number;
38
+ }>;
25
39
  /**
26
40
  * same as `parseObject`, however, if the type is not one of the given "typeNames", it returns null.
27
41
  * the performance improvement is huge compare to "parseObject", as it doesn't parse the object if not needed.
@@ -143,8 +143,19 @@ path: ${err.path}`);
143
143
  // console.log(`sha ${sha1(this.id())}, id ${this.id()}`); // uncomment when debugging hash issues
144
144
  return new (_ref().default)(BitObject.makeHash(this.id()));
145
145
  }
146
- compress() {
147
- return (0, _legacy2().deflate)(this.serialize());
146
+ async compress() {
147
+ return (await this.compressWithSize()).buffer;
148
+ }
149
+
150
+ /**
151
+ * same as `compress`, but also returns the size of the uncompressed content.
152
+ */
153
+ async compressWithSize() {
154
+ const serialized = this.serialize();
155
+ return {
156
+ buffer: await (0, _legacy2().deflate)(serialized),
157
+ inflatedSize: serialized.byteLength
158
+ };
148
159
  }
149
160
  serialize() {
150
161
  const buffer = this.toBuffer();
@@ -155,8 +166,18 @@ path: ${err.path}`);
155
166
  * see `this.parseSync` for the sync version
156
167
  */
157
168
  static async parseObject(fileContents, filePath) {
169
+ return (await BitObject.parseObjectWithSize(fileContents, filePath)).object;
170
+ }
171
+
172
+ /**
173
+ * same as `parseObject`, but also returns the size of the inflated content.
174
+ */
175
+ static async parseObjectWithSize(fileContents, filePath) {
158
176
  const buffer = await (0, _legacy2().inflate)(fileContents, filePath);
159
- return parse(buffer);
177
+ return {
178
+ object: parse(buffer),
179
+ inflatedSize: buffer.byteLength
180
+ };
160
181
  }
161
182
 
162
183
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_zlib","data","require","_legacy","_legacy2","_toolboxCrypto","_legacy3","_ref","_interopRequireDefault","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","parse","buffer","type","hash","contents","extractHeaderAndContent","types","UnknownObjectType","firstNullByteLocation","indexOf","NULL_BYTE","headers","slice","toString","split","SPACE_DELIMITER","length","BitObject","constructor","id","Error","toBuffer","pretty","refs","getType","name","getHeader","collectRefs","repo","refsCollection","objectType","objectId","addRefs","object","objs","Promise","all","map","ref","load","err","code","path","push","obj","collectRaw","loadManyRaw","asRaw","loadRaw","collect","objects","loadSync","forEach","Ref","makeHash","compress","deflate","serialize","Buffer","concat","from","parseObject","fileContents","filePath","inflate","parseObjectOnlyIfType","typeNames","includes","parseObjectTypeFromChunk","chunk","inflateSync","finishFlush","constants","Z_SYNC_FLUSH","parseObjectType","parseSync","str","sha1","exports"],"sources":["object.ts"],"sourcesContent":["import { constants, inflateSync } from 'zlib';\n\nimport { NULL_BYTE, SPACE_DELIMITER } from '@teambit/legacy.constants';\nimport { deflate, inflate } from '@teambit/legacy.utils';\nimport { sha1 } from '@teambit/toolbox.crypto.sha1';\nimport { UnknownObjectType, typesObj as types } from '@teambit/legacy.scope';\nimport type { ObjectItem } from './object-list';\nimport Ref from './ref';\nimport type Repository from './repository';\n\nfunction parse(buffer: Buffer): BitObject {\n const { type, hash, contents } = extractHeaderAndContent(buffer);\n if (!types[type]) throw new UnknownObjectType(type);\n return types[type].parse(contents, hash);\n}\n\nfunction extractHeaderAndContent(buffer: Buffer): { type: string; hash: string; contents: Buffer } {\n const firstNullByteLocation = buffer.indexOf(NULL_BYTE);\n const headers = buffer.slice(0, firstNullByteLocation).toString();\n const [type, hash] = headers.split(SPACE_DELIMITER);\n const contents = buffer.slice(firstNullByteLocation + 1, buffer.length);\n return { type, hash, contents };\n}\n\nexport default class BitObject {\n validateBeforePersist = true; // validate the object before persisting\n id(): string | Buffer {\n throw new Error('id() was not implemented...');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n toBuffer(pretty?: boolean): Buffer {\n throw new Error('toBuffer() was not implemented...');\n }\n\n refs(): Ref[] {\n return [];\n }\n\n getType(): string {\n return this.constructor.name;\n }\n\n getHeader(buffer: Buffer): string {\n return `${this.getType()} ${this.hash().toString()} ${buffer.toString().length}${NULL_BYTE}`;\n }\n\n async collectRefs(repo: Repository): Promise<Ref[]> {\n const refsCollection = [];\n const objectType = this.getType();\n const objectId = objectType === 'Component' ? `Component ${this.id()}` : objectType;\n\n async function addRefs(object: BitObject) {\n const refs = object.refs();\n let objs;\n try {\n objs = await Promise.all(refs.map((ref) => ref.load(repo, true)));\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(`failed finding an object file required by ${object.constructor.name} object, originated from ${objectId}\npath: ${err.path}`);\n }\n throw err;\n }\n\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n refsCollection.push(...refs);\n await Promise.all(objs.map((obj) => addRefs(obj)));\n }\n\n await addRefs(this);\n return refsCollection;\n }\n\n async collectRaw(repo: Repository): Promise<ObjectItem[]> {\n const refs = await this.collectRefs(repo);\n return repo.loadManyRaw(refs);\n }\n\n asRaw(repo: Repository): Promise<Buffer> {\n return repo.loadRaw(this.hash());\n }\n\n collect(repo: Repository): BitObject[] {\n const objects: BitObject[] = [];\n\n function addRefs(object: BitObject) {\n const objs = object.refs().map((ref) => {\n return ref.loadSync(repo);\n });\n\n objects.push(...objs);\n objs.forEach((obj) => addRefs(obj));\n }\n\n addRefs(this);\n return objects;\n }\n\n /**\n * indexing method\n */\n hash(): Ref {\n // console.log(`sha ${sha1(this.id())}, id ${this.id()}`); // uncomment when debugging hash issues\n return new Ref(BitObject.makeHash(this.id()));\n }\n\n compress(): Promise<Buffer> {\n return deflate(this.serialize());\n }\n\n serialize(): Buffer {\n const buffer = this.toBuffer();\n return Buffer.concat([Buffer.from(this.getHeader(buffer)), buffer] as unknown as Uint8Array[]);\n }\n\n /**\n * see `this.parseSync` for the sync version\n */\n static async parseObject(fileContents: Buffer, filePath?: string): Promise<BitObject> {\n const buffer = await inflate(fileContents, filePath);\n return parse(buffer);\n }\n\n /**\n * same as `parseObject`, however, if the type is not one of the given \"typeNames\", it returns null.\n * the performance improvement is huge compare to \"parseObject\", as it doesn't parse the object if not needed.\n */\n static async parseObjectOnlyIfType(\n fileContents: Buffer,\n typeNames: string[],\n filePath?: string\n ): Promise<BitObject | null> {\n const buffer = await inflate(fileContents, filePath);\n const { type } = extractHeaderAndContent(buffer);\n if (typeNames.includes(type)) return parse(buffer);\n return null;\n }\n\n /**\n * extract only the object type out of the first chunk of a compressed object file.\n *\n * the type is the first token of the header, which sits at the very beginning of the inflated\n * buffer, so there's no need to inflate the entire object. `Z_SYNC_FLUSH` tells zlib to return\n * whatever it managed to inflate instead of throwing on the truncated input.\n * returns null when the header is not fully contained in the given chunk, in which case the\n * caller should fall back to inflating the whole file. a header that is there but names a type\n * nothing is registered under throws instead: reading it as a type of its own would let a\n * damaged object pass for classified, and the caller acts on the inventory being complete.\n *\n * the chunk is a `Uint8Array` rather than a `Buffer` because newer `@types/node` make `Buffer`\n * generic, which no longer matches zlib's `InputType` under the typescript version our envs ship.\n */\n static parseObjectTypeFromChunk(chunk: Uint8Array): string | null {\n let buffer: Buffer;\n try {\n buffer = inflateSync(chunk, { finishFlush: constants.Z_SYNC_FLUSH });\n } catch {\n return null;\n }\n const firstNullByteLocation = buffer.indexOf(NULL_BYTE);\n if (firstNullByteLocation === -1) return null;\n const [type] = buffer.slice(0, firstNullByteLocation).toString().split(SPACE_DELIMITER);\n if (!type) return null;\n if (!types[type]) throw new UnknownObjectType(type);\n return type;\n }\n\n /**\n * same as `parseObjectTypeFromChunk`, only it gets the entire (inflated) object.\n */\n static async parseObjectType(fileContents: Buffer, filePath?: string): Promise<string> {\n const buffer = await inflate(fileContents, filePath);\n const { type } = extractHeaderAndContent(buffer);\n if (!types[type]) throw new UnknownObjectType(type);\n return type;\n }\n\n /**\n * prefer using `this.parseObject()`, unless it must be sync.\n */\n static parseSync(fileContents: Buffer): BitObject {\n // @ts-ignore todo: fix after merging #9359\n const buffer = inflateSync(fileContents);\n return parse(buffer);\n }\n\n static makeHash(str: string | Buffer): string {\n return sha1(str);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_zlib","data","require","_legacy","_legacy2","_toolboxCrypto","_legacy3","_ref","_interopRequireDefault","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","parse","buffer","type","hash","contents","extractHeaderAndContent","types","UnknownObjectType","firstNullByteLocation","indexOf","NULL_BYTE","headers","slice","toString","split","SPACE_DELIMITER","length","BitObject","constructor","id","Error","toBuffer","pretty","refs","getType","name","getHeader","collectRefs","repo","refsCollection","objectType","objectId","addRefs","object","objs","Promise","all","map","ref","load","err","code","path","push","obj","collectRaw","loadManyRaw","asRaw","loadRaw","collect","objects","loadSync","forEach","Ref","makeHash","compress","compressWithSize","serialized","serialize","deflate","inflatedSize","byteLength","Buffer","concat","from","parseObject","fileContents","filePath","parseObjectWithSize","inflate","parseObjectOnlyIfType","typeNames","includes","parseObjectTypeFromChunk","chunk","inflateSync","finishFlush","constants","Z_SYNC_FLUSH","parseObjectType","parseSync","str","sha1","exports"],"sources":["object.ts"],"sourcesContent":["import { constants, inflateSync } from 'zlib';\n\nimport { NULL_BYTE, SPACE_DELIMITER } from '@teambit/legacy.constants';\nimport { deflate, inflate } from '@teambit/legacy.utils';\nimport { sha1 } from '@teambit/toolbox.crypto.sha1';\nimport { UnknownObjectType, typesObj as types } from '@teambit/legacy.scope';\nimport type { ObjectItem } from './object-list';\nimport Ref from './ref';\nimport type Repository from './repository';\n\nfunction parse(buffer: Buffer): BitObject {\n const { type, hash, contents } = extractHeaderAndContent(buffer);\n if (!types[type]) throw new UnknownObjectType(type);\n return types[type].parse(contents, hash);\n}\n\nfunction extractHeaderAndContent(buffer: Buffer): { type: string; hash: string; contents: Buffer } {\n const firstNullByteLocation = buffer.indexOf(NULL_BYTE);\n const headers = buffer.slice(0, firstNullByteLocation).toString();\n const [type, hash] = headers.split(SPACE_DELIMITER);\n const contents = buffer.slice(firstNullByteLocation + 1, buffer.length);\n return { type, hash, contents };\n}\n\nexport default class BitObject {\n validateBeforePersist = true; // validate the object before persisting\n id(): string | Buffer {\n throw new Error('id() was not implemented...');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n toBuffer(pretty?: boolean): Buffer {\n throw new Error('toBuffer() was not implemented...');\n }\n\n refs(): Ref[] {\n return [];\n }\n\n getType(): string {\n return this.constructor.name;\n }\n\n getHeader(buffer: Buffer): string {\n return `${this.getType()} ${this.hash().toString()} ${buffer.toString().length}${NULL_BYTE}`;\n }\n\n async collectRefs(repo: Repository): Promise<Ref[]> {\n const refsCollection = [];\n const objectType = this.getType();\n const objectId = objectType === 'Component' ? `Component ${this.id()}` : objectType;\n\n async function addRefs(object: BitObject) {\n const refs = object.refs();\n let objs;\n try {\n objs = await Promise.all(refs.map((ref) => ref.load(repo, true)));\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new Error(`failed finding an object file required by ${object.constructor.name} object, originated from ${objectId}\npath: ${err.path}`);\n }\n throw err;\n }\n\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n refsCollection.push(...refs);\n await Promise.all(objs.map((obj) => addRefs(obj)));\n }\n\n await addRefs(this);\n return refsCollection;\n }\n\n async collectRaw(repo: Repository): Promise<ObjectItem[]> {\n const refs = await this.collectRefs(repo);\n return repo.loadManyRaw(refs);\n }\n\n asRaw(repo: Repository): Promise<Buffer> {\n return repo.loadRaw(this.hash());\n }\n\n collect(repo: Repository): BitObject[] {\n const objects: BitObject[] = [];\n\n function addRefs(object: BitObject) {\n const objs = object.refs().map((ref) => {\n return ref.loadSync(repo);\n });\n\n objects.push(...objs);\n objs.forEach((obj) => addRefs(obj));\n }\n\n addRefs(this);\n return objects;\n }\n\n /**\n * indexing method\n */\n hash(): Ref {\n // console.log(`sha ${sha1(this.id())}, id ${this.id()}`); // uncomment when debugging hash issues\n return new Ref(BitObject.makeHash(this.id()));\n }\n\n async compress(): Promise<Buffer> {\n return (await this.compressWithSize()).buffer;\n }\n\n /**\n * same as `compress`, but also returns the size of the uncompressed content.\n */\n async compressWithSize(): Promise<{ buffer: Buffer; inflatedSize: number }> {\n const serialized = this.serialize();\n return { buffer: await deflate(serialized), inflatedSize: serialized.byteLength };\n }\n\n serialize(): Buffer {\n const buffer = this.toBuffer();\n return Buffer.concat([Buffer.from(this.getHeader(buffer)), buffer] as unknown as Uint8Array[]);\n }\n\n /**\n * see `this.parseSync` for the sync version\n */\n static async parseObject(fileContents: Buffer, filePath?: string): Promise<BitObject> {\n return (await BitObject.parseObjectWithSize(fileContents, filePath)).object;\n }\n\n /**\n * same as `parseObject`, but also returns the size of the inflated content.\n */\n static async parseObjectWithSize(\n fileContents: Buffer,\n filePath?: string\n ): Promise<{ object: BitObject; inflatedSize: number }> {\n const buffer = await inflate(fileContents, filePath);\n return { object: parse(buffer), inflatedSize: buffer.byteLength };\n }\n\n /**\n * same as `parseObject`, however, if the type is not one of the given \"typeNames\", it returns null.\n * the performance improvement is huge compare to \"parseObject\", as it doesn't parse the object if not needed.\n */\n static async parseObjectOnlyIfType(\n fileContents: Buffer,\n typeNames: string[],\n filePath?: string\n ): Promise<BitObject | null> {\n const buffer = await inflate(fileContents, filePath);\n const { type } = extractHeaderAndContent(buffer);\n if (typeNames.includes(type)) return parse(buffer);\n return null;\n }\n\n /**\n * extract only the object type out of the first chunk of a compressed object file.\n *\n * the type is the first token of the header, which sits at the very beginning of the inflated\n * buffer, so there's no need to inflate the entire object. `Z_SYNC_FLUSH` tells zlib to return\n * whatever it managed to inflate instead of throwing on the truncated input.\n * returns null when the header is not fully contained in the given chunk, in which case the\n * caller should fall back to inflating the whole file. a header that is there but names a type\n * nothing is registered under throws instead: reading it as a type of its own would let a\n * damaged object pass for classified, and the caller acts on the inventory being complete.\n *\n * the chunk is a `Uint8Array` rather than a `Buffer` because newer `@types/node` make `Buffer`\n * generic, which no longer matches zlib's `InputType` under the typescript version our envs ship.\n */\n static parseObjectTypeFromChunk(chunk: Uint8Array): string | null {\n let buffer: Buffer;\n try {\n buffer = inflateSync(chunk, { finishFlush: constants.Z_SYNC_FLUSH });\n } catch {\n return null;\n }\n const firstNullByteLocation = buffer.indexOf(NULL_BYTE);\n if (firstNullByteLocation === -1) return null;\n const [type] = buffer.slice(0, firstNullByteLocation).toString().split(SPACE_DELIMITER);\n if (!type) return null;\n if (!types[type]) throw new UnknownObjectType(type);\n return type;\n }\n\n /**\n * same as `parseObjectTypeFromChunk`, only it gets the entire (inflated) object.\n */\n static async parseObjectType(fileContents: Buffer, filePath?: string): Promise<string> {\n const buffer = await inflate(fileContents, filePath);\n const { type } = extractHeaderAndContent(buffer);\n if (!types[type]) throw new UnknownObjectType(type);\n return type;\n }\n\n /**\n * prefer using `this.parseObject()`, unless it must be sync.\n */\n static parseSync(fileContents: Buffer): BitObject {\n // @ts-ignore todo: fix after merging #9359\n const buffer = inflateSync(fileContents);\n return parse(buffer);\n }\n\n static makeHash(str: string | Buffer): string {\n return sha1(str);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -35,6 +35,7 @@ export default class Repository {
35
35
  scopePath: string;
36
36
  scopeIndex: ScopeIndex;
37
37
  protected cache: InMemoryCache<BitObject>;
38
+ private liveObjects;
38
39
  remoteLanes: RemoteLanes;
39
40
  unmergedComponents: UnmergedComponents;
40
41
  _persistMutex?: Mutex;
@@ -139,7 +140,13 @@ export default class Repository {
139
140
  * prefer using `this.load()` for an async version, which also writes to the cache
140
141
  */
141
142
  loadSync(ref: Ref, throws?: boolean): BitObject;
142
- setCache(object: BitObject): this;
143
+ /**
144
+ * `size` is the object's inflated content size (see `InMemoryCache.set`).
145
+ */
146
+ setCache(object: BitObject, size?: number): this;
147
+ /**
148
+ * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).
149
+ */
143
150
  getCache(ref: Ref): BitObject | undefined;
144
151
  removeFromCache(ref: Ref): void;
145
152
  clearCache(): Promise<void>;
@@ -205,7 +212,7 @@ export default class Repository {
205
212
  * this method doesn't write to scopeIndex. so using this method for ModelComponent or
206
213
  * Symlink makes the index outdated.
207
214
  */
208
- _writeOne(object: BitObject): Promise<boolean>;
215
+ _writeOne(object: BitObject): Promise<void>;
209
216
  writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute): Promise<void>;
210
217
  readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute): Promise<ObjectList>;
211
218
  private hashPath;
@@ -137,6 +137,13 @@ function _ref() {
137
137
  };
138
138
  return data;
139
139
  }
140
+ function _liveObjects() {
141
+ const data = require("./live-objects");
142
+ _liveObjects = function () {
143
+ return data;
144
+ };
145
+ return data;
146
+ }
140
147
  function _harmonyModules2() {
141
148
  const data = require("@teambit/harmony.modules.in-memory-cache");
142
149
  _harmonyModules2 = function () {
@@ -158,6 +165,7 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
158
165
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
159
166
  const OBJECTS_BACKUP_DIR = `${_legacy().OBJECTS_DIR}.bak`;
160
167
  const TRASH_DIR = 'trash';
168
+ const MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory
161
169
  /**
162
170
  * how much of an object file to read when all that's needed is its header. the header holds the
163
171
  * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it
@@ -180,6 +188,7 @@ class Repository {
180
188
  _defineProperty(this, "scopePath", void 0);
181
189
  _defineProperty(this, "scopeIndex", void 0);
182
190
  _defineProperty(this, "cache", void 0);
191
+ _defineProperty(this, "liveObjects", new (_liveObjects().LiveObjects)());
183
192
  _defineProperty(this, "remoteLanes", void 0);
184
193
  _defineProperty(this, "unmergedComponents", void 0);
185
194
  _defineProperty(this, "_persistMutex", void 0);
@@ -187,9 +196,7 @@ class Repository {
187
196
  this.scopeJson = scopeJson;
188
197
  this.onRead = content => Repository.onPostObjectRead?.(content) || content;
189
198
  this.onPersist = content => Repository.onPreObjectPersist?.(content) || content;
190
- this.cache = (0, _harmonyModules2().createInMemoryCache)({
191
- maxSize: (0, _harmonyModules2().getMaxSizeForObjects)()
192
- });
199
+ this.cache = (0, _harmonyModules2().createInMemoryCache)((0, _harmonyModules2().getCacheOptionsForObjects)());
193
200
  }
194
201
  get persistMutex() {
195
202
  if (!this._persistMutex) {
@@ -331,15 +338,18 @@ class Repository {
331
338
  // @ts-ignore @todo: fix! it should return BitObject | null.
332
339
  return null;
333
340
  }
334
- const size = fileContentsRaw.byteLength;
341
+ const compressedSize = fileContentsRaw.byteLength;
335
342
  const fileContents = this.onRead(fileContentsRaw);
336
343
  // uncomment to debug the transformed objects by onRead
337
344
  // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());
338
- const parsedObject = await _object().default.parseObject(fileContents, objectPath);
339
- const maxSizeToCache = 100 * 1024; // 100KB
340
- if (size < maxSizeToCache) {
341
- // don't cache big files (mainly artifacts) to prevent out-of-memory
342
- this.setCache(parsedObject);
345
+ const {
346
+ object: parsedObject,
347
+ inflatedSize
348
+ } = await _object().default.parseObjectWithSize(fileContents, objectPath);
349
+ if (compressedSize < MAX_COMPRESSED_SIZE_TO_CACHE) {
350
+ this.setCache(parsedObject, inflatedSize);
351
+ } else {
352
+ this.liveObjects.set(ref.toString(), parsedObject, inflatedSize, false);
343
353
  }
344
354
  return parsedObject;
345
355
  }
@@ -649,24 +659,42 @@ class Repository {
649
659
  return null;
650
660
  }
651
661
  }
652
- setCache(object) {
653
- this.cache.set(object.hash().toString(), object);
662
+
663
+ /**
664
+ * `size` is the object's inflated content size (see `InMemoryCache.set`).
665
+ */
666
+ setCache(object, size) {
667
+ const key = object.hash().toString();
668
+ this.cache.set(key, object, size);
669
+ this.liveObjects.set(key, object, size, true);
654
670
  return this;
655
671
  }
672
+
673
+ /**
674
+ * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).
675
+ */
656
676
  getCache(ref) {
657
- return this.cache.get(ref.toString());
677
+ const key = ref.toString();
678
+ const cached = this.cache.get(key);
679
+ if (cached) return cached;
680
+ const live = this.liveObjects.get(key);
681
+ if (!live) return undefined;
682
+ if (live.cacheable) this.cache.set(key, live.object, live.size); // it's in use again
683
+ return live.object;
658
684
  }
659
685
  removeFromCache(ref) {
660
686
  this.cache.delete(ref.toString());
687
+ this.liveObjects.delete(ref.toString());
661
688
  }
662
689
  async clearCache() {
663
690
  _legacy2().logger.debug('repository.clearCache');
664
- this.cache.deleteAll();
691
+ this.clearObjectsFromCache();
665
692
  await this.init();
666
693
  }
667
694
  clearObjectsFromCache() {
668
695
  _legacy2().logger.debug('repository.clearObjectsFromCache');
669
696
  this.cache.deleteAll();
697
+ this.liveObjects.clear();
670
698
  }
671
699
  backup(dirName) {
672
700
  const backupDir = this.getBackupPath(dirName);
@@ -872,17 +900,22 @@ class Repository {
872
900
  * Symlink makes the index outdated.
873
901
  */
874
902
  async _writeOne(object) {
875
- const contents = await object.compress();
903
+ const {
904
+ buffer: contents,
905
+ inflatedSize
906
+ } = await object.compressWithSize();
876
907
  const options = {};
877
908
  if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);
878
909
  const hash = object.hash();
879
- if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object); // update the cache
880
910
  const objectPath = this.objectPath(hash);
881
911
  _legacy2().logger.trace(`repository._writeOne: ${objectPath}`);
882
912
  // Run hook to transform content pre persisting
883
913
  const transformedContent = this.onPersist(contents);
884
- // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
885
- return (0, _legacy3().writeFile)(objectPath, transformedContent, options);
914
+ await (0, _legacy3().writeFile)(objectPath, transformedContent, options);
915
+ // once written, the object is the up-to-date one. this also replaces the size-estimate of objects that
916
+ // were cached by `add()`.
917
+ if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);
918
+ this.liveObjects.set(hash.toString(), object, inflatedSize, transformedContent.byteLength < MAX_COMPRESSED_SIZE_TO_CACHE);
886
919
  }
887
920
  async writeObjectsToPendingDir(objectList, pendingDir) {
888
921
  // Refs come from client-supplied tar entry names. Validate the whole batch
@@ -1 +1 @@
1
- {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_asyncMutex","_lodash","_bitError","_componentVersion","path","_interopRequireWildcard","_toolboxPromise","_legacy","_legacy2","_legacy3","_glob","_toolboxFs","_harmonyModules","_legacy4","_scopeIndex","_object","_objectList","_rawObject","_ref","_harmonyModules2","_models","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","OBJECTS_BACKUP_DIR","OBJECTS_DIR","TRASH_DIR","OBJECT_HEADER_CHUNK_SIZE","Repository","constructor","scopePath","scopeJson","onRead","content","onPostObjectRead","onPersist","onPreObjectPersist","cache","createInMemoryCache","maxSize","getMaxSizeForObjects","persistMutex","_persistMutex","Mutex","load","repository","init","scopeIndex","loadOptionallyCreateScopeIndex","remoteLanes","RemoteLanes","unmergedComponents","UnmergedComponents","create","ScopeIndex","reset","getPathByScopePath","join","reLoadScopeIndex","reloadScopeIndexIfNeed","force","latestScopeIndex","currentAllScopeIndexItems","getAll","latestAllScopeIndexItems","length","differenceWith","isEqual","ensureDir","fs","getPath","getBackupPath","dirName","backupPath","getTrashDir","getLicense","getPopulatedLicense","getScopeMetaObject","license","object","ScopeMeta","fromObject","name","ref","hash","buffer","compress","objectPath","hashPath","pathExists","hasMultiple","refs","concurrency","concurrentIOLimit","existingRefs","pMapPool","compact","throws","inMemoryObjects","objects","toString","HASH_SIZE","getFullRefFromShortHash","cached","getCache","fileContentsRaw","readFile","err","code","logger","error","message","trace","msg","assign","stack","Error","size","byteLength","fileContents","parsedObject","BitObject","parseObject","maxSizeToCache","setCache","list","types","listRefs","debug","map","loadGracefully","process","argv","includes","isTypeIncluded","obj","some","type","loadRefDeleteIfInvalid","loadRefOnlyIfType","push","onCompletedChunk","completed","listObjectsWithType","results","getObjectTypeGracefully","result","unreadable","warn","stat","readObjectType","mtimeMs","readInFull","parseObjectType","isContentTransformed","readTypeFromHeader","hasPostObjectReadTransformer","Boolean","chunk","Uint8Array","fileDescriptor","open","bytesRead","read","close","parseObjectTypeFromChunk","subarray","moveOneObjectToTrash","undefined","typeNames","UnknownObjectType","parseObjectOnlyIfType","cwd","matches","glob","str","replace","sep","isSnap","Ref","listRefsStartWith","shortHash","pathPrefix","listRawObjects","loadRaw","bitRawObject","BitRawObject","fromDeflatedBuffer","listObjectsFromIndex","indexType","filter","hashes","getHashesByQuery","getHashes","_getBitObjectsByHashes","getHashFromIndex","missingIndexItems","bitObjects","Promise","all","bitObject","indexItem","find","removeMany","item","write","missingStringified","toIdentifierString","OutdatedIndexJson","ModelComponent","Lane","added","addMany","raw","transformedContent","loadManyRaw","uniqRefs","uniqBy","loadManyRawIgnoreMissing","loadRawObject","loadSync","objectFile","readFileSync","parseSync","HashNotFound","removeFromCache","delete","clearCache","deleteAll","clearObjectsFromCache","backup","backupDir","objectsDir","emptyDirSync","copySync","add","forEach","removeObject","objectsToRemove","removeManyObjects","findMany","persist","validate","runExclusive","deleteObjectsFromFS","validateObjects","values","writeObjectsToTheFS","writeRemoteLanes","clearObjects","onPostObjectsPersist","catch","validateBeforePersist","_deleteOne","removed","moveObjectsToDir","dir","moveOneObjectToDir","moveObjectsToTrash","listTrash","getFromTrash","objectsFromTrash","trashObjPath","BitError","restoreFromTrash","restoreFromDir","overwrite","copy","currentPath","absDir","fullPath","move","deleteRecordsFromUnmergedComponents","compIds","removeMultipleComponents","count","_writeOne","pathToDelete","removeFile","contents","options","groupName","gid","resolveGroupId","writeFile","writeObjectsToPendingDir","objectList","pendingDir","JSON","stringify","objPath","readObjectsFromPendingDir","ObjectList","slice","exports","filePath","propagateDirs","unlink","parse","removeEmptyDir","getgid","groupFileContent","groupLine","split","line","isNaN"],"sources":["repository.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { Mutex } from 'async-mutex';\nimport { compact, uniqBy, differenceWith, isEqual } from 'lodash';\nimport { BitError } from '@teambit/bit-error';\nimport type { ComponentID } from '@teambit/component-id';\nimport { HASH_SIZE, isSnap } from '@teambit/component-version';\nimport * as path from 'path';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { OBJECTS_DIR } from '@teambit/legacy.constants';\nimport { logger } from '@teambit/legacy.logger';\nimport type { ChownOptions, PathOsBasedAbsolute } from '@teambit/legacy.utils';\nimport { writeFile } from '@teambit/legacy.utils';\nimport { glob } from 'glob';\nimport { removeEmptyDir } from '@teambit/toolbox.fs.remove-empty-dir';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport type { Types, ScopeJson } from '@teambit/legacy.scope';\nimport {\n HashNotFound,\n OutdatedIndexJson,\n UnknownObjectType,\n UnmergedComponents,\n RemoteLanes,\n} from '@teambit/legacy.scope';\nimport type { IndexType, IndexItem } from './scope-index';\nimport { ScopeIndex } from './scope-index';\nimport BitObject from './object';\nimport type { ObjectItem } from './object-list';\nimport { ObjectList } from './object-list';\nimport BitRawObject from './raw-object';\nimport Ref from './ref';\nimport type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { getMaxSizeForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { ScopeMeta, Lane, ModelComponent } from '../models';\n\ntype ContentTransformer = (content: Buffer) => Buffer;\nconst OBJECTS_BACKUP_DIR = `${OBJECTS_DIR}.bak`;\nconst TRASH_DIR = 'trash';\n/**\n * how much of an object file to read when all that's needed is its header. the header holds the\n * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it\n * is inflated for nothing (4KB inflates ten times as much, across every object in the scope). a\n * chunk that falls short anyway is read in full.\n */\nconst OBJECT_HEADER_CHUNK_SIZE = 512;\n\n/** `mtimeMs` lets a caller tell an object that has been here a while from one just written */\nexport type ObjectWithType = { ref: Ref; type: string; size: number; mtimeMs: number };\n/** `unreadable` holds the objects that couldn't be classified, so a caller can refuse to act on a partial inventory */\nexport type ObjectsWithType = { objects: ObjectWithType[]; unreadable: Ref[] };\n\nexport default class Repository {\n objects: { [key: string]: BitObject } = {};\n objectsToRemove: Ref[] = [];\n scopeJson: ScopeJson;\n onRead: ContentTransformer;\n onPersist: ContentTransformer;\n scopePath: string;\n scopeIndex: ScopeIndex;\n protected cache: InMemoryCache<BitObject>;\n remoteLanes!: RemoteLanes;\n unmergedComponents!: UnmergedComponents;\n _persistMutex?: Mutex;\n constructor(scopePath: string, scopeJson: ScopeJson) {\n this.scopePath = scopePath;\n this.scopeJson = scopeJson;\n this.onRead = (content: Buffer) => Repository.onPostObjectRead?.(content) || content;\n this.onPersist = (content: Buffer) => Repository.onPreObjectPersist?.(content) || content;\n this.cache = createInMemoryCache({ maxSize: getMaxSizeForObjects() });\n }\n\n get persistMutex() {\n if (!this._persistMutex) {\n this._persistMutex = new Mutex();\n }\n return this._persistMutex;\n }\n\n static async load({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n await repository.init();\n return repository;\n }\n\n async init() {\n const scopeIndex = await this.loadOptionallyCreateScopeIndex();\n this.scopeIndex = scopeIndex;\n this.remoteLanes = new RemoteLanes(this.scopePath);\n this.unmergedComponents = await UnmergedComponents.load(this.scopePath);\n }\n\n static async create({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n const scopeIndex = ScopeIndex.create(scopePath);\n repository.scopeIndex = scopeIndex;\n repository.unmergedComponents = await UnmergedComponents.load(scopePath);\n repository.remoteLanes = new RemoteLanes(scopePath);\n return repository;\n }\n\n static reset(scopePath: string): Promise<void> {\n return ScopeIndex.reset(scopePath);\n }\n\n static getPathByScopePath(scopePath: string) {\n return path.join(scopePath, OBJECTS_DIR);\n }\n\n static onPostObjectsPersist: () => Promise<void>;\n\n /**\n * Hook for transforming content before objects are persisted to the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPreObjectPersist?: (content: Buffer) => Buffer;\n\n /**\n * Hook for transforming content after objects are read from the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPostObjectRead?: (content: Buffer) => Buffer;\n\n /**\n * whether `onPostObjectRead` actually transforms anything.\n *\n * the scope aspect installs the hook above unconditionally - it's a reduce over a slot that is\n * usually empty - so the hook being set says nothing about whether object content is transformed.\n * only a caller that can skip reading content altogether needs to tell the two apart.\n */\n static hasPostObjectReadTransformer?: () => boolean;\n\n async reLoadScopeIndex() {\n this.scopeIndex = await this.loadOptionallyCreateScopeIndex();\n }\n\n /**\n * current scope index difference with <scope_folder>/index.json content, reload it\n * @deprecated use Scope aspect `watchSystemFiles` instead, it's way more efficient.\n */\n public async reloadScopeIndexIfNeed(force = false) {\n const latestScopeIndex = await this.loadOptionallyCreateScopeIndex();\n if (force) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n const currentAllScopeIndexItems = this.scopeIndex.getAll();\n const latestAllScopeIndexItems = latestScopeIndex.getAll();\n\n if (currentAllScopeIndexItems.length !== latestAllScopeIndexItems.length) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n if (differenceWith(currentAllScopeIndexItems, latestAllScopeIndexItems, isEqual).length) {\n this.scopeIndex = latestScopeIndex;\n }\n }\n\n ensureDir() {\n return fs.ensureDir(this.getPath());\n }\n\n getPath() {\n return Repository.getPathByScopePath(this.scopePath);\n }\n\n getBackupPath(dirName?: string): string {\n const backupPath = path.join(this.scopePath, OBJECTS_BACKUP_DIR);\n return dirName ? path.join(backupPath, dirName) : backupPath;\n }\n\n getTrashDir() {\n return path.join(this.scopePath, TRASH_DIR);\n }\n\n getLicense(): Promise<string> {\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return this.scopeJson.getPopulatedLicense();\n }\n\n async getScopeMetaObject(): Promise<ObjectItem> {\n const license = await this.getLicense();\n const object = ScopeMeta.fromObject({ license, name: this.scopeJson.name });\n return { ref: object.hash(), buffer: await object.compress() };\n }\n\n objectPath(ref: Ref): string {\n return path.join(this.getPath(), this.hashPath(ref));\n }\n\n async has(ref: Ref): Promise<boolean> {\n const objectPath = this.objectPath(ref);\n return fs.pathExists(objectPath);\n }\n\n async hasMultiple(refs: Ref[]): Promise<Ref[]> {\n const concurrency = concurrentIOLimit();\n const existingRefs = await pMapPool(\n refs,\n async (ref) => {\n const pathExists = await this.has(ref);\n return pathExists ? ref : null;\n },\n { concurrency }\n );\n return compact(existingRefs);\n }\n\n async load(ref: Ref, throws = false): Promise<BitObject> {\n // during tag, the updated objects are in `this.objects`.\n // `this.cache` is less reliable, because if it reaches its max, then it loads from the filesystem, which may not\n // be there yet (in case of \"version\" object), or may be out-of-date (in case of \"component\" object).\n const inMemoryObjects = this.objects[ref.hash.toString()];\n if (inMemoryObjects) return inMemoryObjects;\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const cached = this.getCache(ref);\n if (cached) {\n return cached;\n }\n let fileContentsRaw: Buffer;\n const objectPath = this.objectPath(ref);\n try {\n fileContentsRaw = await fs.readFile(objectPath);\n } catch (err: any) {\n if (err.code !== 'ENOENT') {\n logger.error(`Failed reading a ref file ${objectPath}. Error: ${err.message}`);\n throw err;\n }\n logger.trace(`Failed finding a ref file ${objectPath}.`);\n if (throws) {\n // if we just `throw err` we loose the stack trace.\n // see https://stackoverflow.com/questions/68022123/no-stack-in-fs-promises-readfile-enoent-error\n const msg = `fatal: failed finding an object file ${objectPath} in the filesystem at ${err.path}`;\n throw Object.assign(err, { stack: new Error(msg).stack });\n }\n // @ts-ignore @todo: fix! it should return BitObject | null.\n return null;\n }\n const size = fileContentsRaw.byteLength;\n const fileContents = this.onRead(fileContentsRaw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());\n const parsedObject = await BitObject.parseObject(fileContents, objectPath);\n const maxSizeToCache = 100 * 1024; // 100KB\n if (size < maxSizeToCache) {\n // don't cache big files (mainly artifacts) to prevent out-of-memory\n this.setCache(parsedObject);\n }\n return parsedObject;\n }\n\n /**\n * this is restricted to provide objects according to the given types. Otherwise, big scopes (>1GB) could crush.\n * example usage: `this.list([ModelComponent, Symlink, Lane])`\n */\n async list(types: Types): Promise<BitObject[]> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(\n `Repository.list, ${refs.length} refs are going to be loaded, searching for types: ${types.map((t) => t.name).join(', ')}`\n );\n const objects: BitObject[] = [];\n const loadGracefully = process.argv.includes('--never-exported');\n const isTypeIncluded = (obj: BitObject) => types.some((type) => type.name === obj.constructor.name); // avoid using \"obj instanceof type\" for Harmony to call this function successfully\n await pMapPool(\n refs,\n async (ref) => {\n const object = loadGracefully\n ? await this.loadRefDeleteIfInvalid(ref)\n : await this.loadRefOnlyIfType(ref, types);\n if (!object) return;\n if (loadGracefully && !isTypeIncluded(object)) return;\n objects.push(object);\n },\n {\n concurrency,\n onCompletedChunk: (completed) => {\n if (completed % 1000 === 0) logger.debug(`Repository.list, completed ${completed} out of ${refs.length}`);\n },\n }\n );\n return objects;\n }\n\n /**\n * classify every object in the scope by its type, along with its size on the filesystem.\n *\n * needed by the garbage collector, which must know the type of each object but has no use for\n * its content. inflating every object would mean inflating gigabytes of file-content (`Source`)\n * objects, so only the first chunk of each file is read - enough to hold the header, which is\n * where the type is. when a content transformer is registered (`onPostObjectRead`), it applies\n * to the whole buffer, so in that case the file is read in full.\n */\n async listObjectsWithType(): Promise<ObjectsWithType> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(`Repository.listObjectsWithType, classifying ${refs.length} objects`);\n const results = await pMapPool(refs, (ref) => this.getObjectTypeGracefully(ref), { concurrency });\n const objects = compact(results.map((result) => result.object));\n const unreadable = compact(results.map((result) => result.unreadable));\n if (unreadable.length) {\n logger.warn(`Repository.listObjectsWithType, unable to classify ${unreadable.length} objects`);\n }\n return { objects, unreadable };\n }\n\n /**\n * the objects that couldn't be classified are reported rather than skipped. a caller that acts on\n * this inventory (the garbage collector) has to know that it's incomplete, because an object it\n * can't see is one it can't reason about.\n */\n private async getObjectTypeGracefully(ref: Ref): Promise<{ object?: ObjectWithType; unreadable?: Ref }> {\n const objectPath = this.objectPath(ref);\n try {\n const stat = await fs.stat(objectPath);\n const type = await this.readObjectType(objectPath);\n return { object: { ref, type, size: stat.size, mtimeMs: stat.mtimeMs } };\n } catch (err: any) {\n logger.warn(`Repository.listObjectsWithType, failed reading ${objectPath}. Error: ${err.message}`);\n return { unreadable: ref };\n }\n }\n\n private async readObjectType(objectPath: string): Promise<string> {\n const readInFull = async () => BitObject.parseObjectType(this.onRead(await fs.readFile(objectPath)), objectPath);\n if (this.isContentTransformed()) return readInFull();\n return (await this.readTypeFromHeader(objectPath)) || readInFull();\n }\n\n /**\n * whether object files have to go through `onPostObjectRead` before their header can be read.\n * when there's no way to tell, assume they do. it's the slow answer, never the wrong one.\n */\n private isContentTransformed(): boolean {\n return Repository.hasPostObjectReadTransformer\n ? Repository.hasPostObjectReadTransformer()\n : Boolean(Repository.onPostObjectRead);\n }\n\n /**\n * the type an object file names in its header, read from the first chunk of the file only.\n * null when that chunk doesn't hold the whole header, in which case the file has to be read in\n * full. throws `UnknownObjectType` when the header names a type nothing is registered under.\n */\n private async readTypeFromHeader(objectPath: string): Promise<string | null> {\n // `Uint8Array` rather than `Buffer` - see `parseObjectTypeFromChunk`\n const chunk = new Uint8Array(OBJECT_HEADER_CHUNK_SIZE);\n const fileDescriptor = await fs.open(objectPath, 'r');\n let bytesRead: number;\n try {\n ({ bytesRead } = await fs.read(fileDescriptor, chunk, 0, chunk.length, 0));\n } finally {\n await fs.close(fileDescriptor);\n }\n return BitObject.parseObjectTypeFromChunk(chunk.subarray(0, bytesRead));\n }\n\n async loadRefDeleteIfInvalid(ref: Ref) {\n try {\n return await this.load(ref, true);\n } catch (err: any) {\n // this is needed temporarily to allow `bit reset --never-exported` to fix the bit-id-comp-id error.\n // in a few months, we can remove this condition (around min 2024)\n if (err.constructor.name === 'BitIdCompIdError' || err.constructor.name === 'MissingScope') {\n logger.debug(`bit-id-comp-id error, moving an object to trash ${ref.toString()}`);\n await this.moveOneObjectToTrash(ref);\n return undefined;\n }\n throw err;\n }\n }\n\n async loadRefOnlyIfType(ref: Ref, types: Types): Promise<BitObject | null> {\n const objectPath = this.objectPath(ref);\n const typeNames = types.map((type) => type.name);\n // most of a scope is file contents, which callers of this never ask for. the header says\n // whether an object is wanted, so the rest of the file is only read and inflated when it is.\n // transformed content has no header to read on its own, so it keeps to the single full read.\n if (!this.isContentTransformed()) {\n let type: string | null;\n try {\n type = await this.readTypeFromHeader(objectPath);\n } catch (err: any) {\n // an unregistered type is not one of the types asked for - the same answer the full read gives\n if (err instanceof UnknownObjectType) return null;\n throw err;\n }\n if (type && !typeNames.includes(type)) return null;\n }\n const fileContents = this.onRead(await fs.readFile(objectPath));\n return BitObject.parseObjectOnlyIfType(fileContents, typeNames, objectPath);\n }\n\n async listRefs(cwd = this.getPath()): Promise<Array<Ref>> {\n const matches = await glob(path.join('*', '*'), { cwd });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRefsStartWith(shortHash: Ref): Promise<Array<Ref>> {\n const pathPrefix = this.hashPath(shortHash);\n const matches = await glob(`${pathPrefix}*`, { cwd: this.getPath() });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRawObjects(): Promise<any> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n return pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject;\n } catch {\n logger.error(`Couldn't load the ref ${ref} this object is probably corrupted and should be delete`);\n return null;\n }\n },\n { concurrency }\n );\n }\n\n async listObjectsFromIndex(indexType: IndexType, filter?: Function): Promise<BitObject[]> {\n const hashes = filter ? this.scopeIndex.getHashesByQuery(indexType, filter) : this.scopeIndex.getHashes(indexType);\n return this._getBitObjectsByHashes(hashes);\n }\n\n getHashFromIndex(indexType: IndexType, filter: Function): string | null {\n const hashes = this.scopeIndex.getHashesByQuery(indexType, filter);\n if (hashes.length > 2) throw new Error('getHashFromIndex expect to get zero or one result');\n return hashes.length ? hashes[0] : null;\n }\n\n async _getBitObjectsByHashes(hashes: string[]): Promise<BitObject[]> {\n const missingIndexItems: IndexItem[] = [];\n const bitObjects = await Promise.all(\n hashes.map(async (hash) => {\n const bitObject = await this.load(new Ref(hash));\n if (!bitObject) {\n const indexItem = this.scopeIndex.find(hash);\n if (!indexItem) throw new Error(`_getBitObjectsByHashes failed finding ${hash}`);\n missingIndexItems.push(indexItem);\n return;\n }\n return bitObject;\n })\n );\n if (missingIndexItems.length) {\n this.scopeIndex.removeMany(missingIndexItems.map((item) => new Ref(item.hash)));\n await this.scopeIndex.write();\n const missingStringified = missingIndexItems.map((item) => item.toIdentifierString());\n throw new OutdatedIndexJson(missingStringified);\n }\n return compact(bitObjects);\n }\n\n async loadOptionallyCreateScopeIndex(): Promise<ScopeIndex> {\n try {\n const scopeIndex = await ScopeIndex.load(this.scopePath);\n return scopeIndex;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n const bitObjects: BitObject[] = await this.list([ModelComponent, Lane]);\n const scopeIndex = ScopeIndex.create(this.scopePath);\n const added = scopeIndex.addMany(bitObjects);\n if (added) await scopeIndex.write();\n return scopeIndex;\n }\n throw err;\n }\n }\n\n async loadRaw(ref: Ref): Promise<Buffer> {\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const raw = await fs.readFile(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(raw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent loadRaw', ref.toString(), BitObject.parseSync(transformedContent).getType());\n return transformedContent;\n }\n\n async getFullRefFromShortHash(ref: Ref): Promise<Ref> {\n const refs = await this.listRefsStartWith(ref);\n if (refs.length > 1) {\n throw new Error(\n `found ${refs.length} objects with the same short hash ${ref.toString()}, please use longer hash`\n );\n }\n if (refs.length === 0) {\n throw new Error(`failed finding an object with the short hash ${ref.toString()}`);\n }\n return refs[0];\n }\n\n async loadManyRaw(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const uniqRefs = uniqBy(refs, 'hash');\n return pMapPool(uniqRefs, async (ref) => ({ ref, buffer: await this.loadRaw(ref) }), { concurrency });\n }\n\n async loadManyRawIgnoreMissing(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const results = await pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n return { ref, buffer };\n } catch (err: any) {\n if (err.code === 'ENOENT') return null;\n throw err;\n }\n },\n { concurrency }\n );\n return compact(results);\n }\n\n async loadRawObject(ref: Ref): Promise<BitRawObject> {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject as any as BitRawObject;\n }\n\n /**\n * prefer using `this.load()` for an async version, which also writes to the cache\n */\n loadSync(ref: Ref, throws = true): BitObject {\n try {\n const objectFile = fs.readFileSync(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(objectFile);\n return BitObject.parseSync(transformedContent);\n } catch {\n if (throws) {\n throw new HashNotFound(ref.toString());\n }\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return null;\n }\n }\n\n setCache(object: BitObject) {\n this.cache.set(object.hash().toString(), object);\n return this;\n }\n\n getCache(ref: Ref): BitObject | undefined {\n return this.cache.get(ref.toString());\n }\n\n removeFromCache(ref: Ref) {\n this.cache.delete(ref.toString());\n }\n\n async clearCache() {\n logger.debug('repository.clearCache');\n this.cache.deleteAll();\n await this.init();\n }\n clearObjectsFromCache() {\n logger.debug('repository.clearObjectsFromCache');\n this.cache.deleteAll();\n }\n\n backup(dirName?: string) {\n const backupDir = this.getBackupPath(dirName);\n const objectsDir = this.getPath();\n logger.debug(`making a backup of all objects from ${objectsDir} to ${backupDir}`);\n fs.emptyDirSync(backupDir);\n fs.copySync(objectsDir, backupDir);\n }\n\n add(object: BitObject | null | undefined): Repository {\n // console.trace(`repository: adding object ${object?.hash().toString()}`);\n if (!object) return this;\n // leave the following commented log message, it is very useful for debugging but too verbose when not needed.\n // logger.debug(`repository: adding object ${object.hash().toString()} which consist of the following id: ${object.id()}`);\n this.objects[object.hash().toString()] = object;\n this.setCache(object);\n return this;\n }\n\n addMany(objects: BitObject[]): Repository {\n if (!objects || !objects.length) return this;\n objects.forEach((obj) => this.add(obj));\n return this;\n }\n\n removeObject(ref: Ref) {\n this.objectsToRemove.push(ref);\n }\n\n removeManyObjects(refs: Ref[]) {\n if (!refs || !refs.length) return;\n refs.forEach((ref) => this.removeObject(ref));\n }\n\n findMany(refs: Ref[]): Promise<BitObject[]> {\n return Promise.all(refs.map((ref) => this.load(ref)));\n }\n\n /**\n * important! use this method only for commands that are non running on an http server.\n *\n * it's better to remove/delete objects directly and not using the `objects` member.\n * it helps to avoid multiple processes running concurrently on an http server.\n *\n * persist objects changes (added and removed) into the filesystem\n * do not call this function multiple times in parallel, otherwise, it'll damage the index.json file.\n * call this function only once after you added and removed all applicable objects.\n */\n async persist(validate = true): Promise<void> {\n // do not let two requests enter this critical area, otherwise, refs/index.json/objects could\n // be corrupted\n logger.debug(`Repository.persist, going to acquire a lock`);\n await this.persistMutex.runExclusive(async () => {\n logger.debug(`Repository.persist, validate = ${validate.toString()}, a lock has been acquired`);\n await this.deleteObjectsFromFS(this.objectsToRemove);\n this.validateObjects(validate, Object.values(this.objects));\n await this.writeObjectsToTheFS(Object.values(this.objects));\n await this.writeRemoteLanes();\n await this.unmergedComponents.write();\n });\n logger.debug(`Repository.persist, completed. the lock has been released`);\n this.clearObjects();\n if (Repository.onPostObjectsPersist) {\n Repository.onPostObjectsPersist().catch((err) => {\n logger.error('fatal: onPostObjectsPersist encountered an error (this error does not stop the process)', err);\n });\n }\n }\n\n async writeRemoteLanes() {\n await this.remoteLanes.write();\n }\n\n /**\n * this is especially critical for http server, where one process lives long and serves multiple\n * exports. without this, the objects get accumulated over time and being rewritten over and over\n * again.\n */\n private clearObjects() {\n this.objects = {};\n this.objectsToRemove = [];\n }\n\n /**\n * normally, the validation step takes place just before the acutal writing of the file.\n * however, this can be an issue where a component has an invalid version. the component could\n * be saved before validating the version (see #1727). that's why we validate here before writing\n * anything to the filesystem.\n * the open question here is whether should we validate again before the actual writing or it\n * should be enough to validate here?\n * for now, it does validate again before saving, only to be 100% sure nothing happens in a few\n * lines of code until the actual writing. however, if the performance penalty is noticeable, we\n * can easily revert it by changing `bitObject.validateBeforePersist = false` line run regardless\n * the `validate` argument.\n */\n validateObjects(validate: boolean, objects: BitObject[]) {\n objects.forEach((bitObject) => {\n // @ts-ignore some BitObject classes have validate() method\n if (validate && bitObject.validate) {\n // @ts-ignore\n bitObject.validate();\n }\n if (!validate) {\n bitObject.validateBeforePersist = false;\n }\n });\n }\n\n async deleteObjectsFromFS(refs: Ref[]): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository._deleteMany: deleting ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this._deleteOne(ref), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToDir(refs: Ref[], dir: string): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository.moveObjectsToDir: ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this.moveOneObjectToDir(ref, dir), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToTrash(refs: Ref[]): Promise<void> {\n await this.moveObjectsToDir(refs, TRASH_DIR);\n }\n\n async listTrash(): Promise<Ref[]> {\n return this.listRefs(this.getTrashDir());\n }\n\n async getFromTrash(refs: Ref[]): Promise<BitObject[]> {\n const objectsFromTrash = await Promise.all(\n refs.map(async (ref) => {\n const trashObjPath = path.join(this.getTrashDir(), this.hashPath(ref));\n let buffer: Buffer;\n try {\n buffer = await fs.readFile(trashObjPath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new BitError(`unable to find the object ${ref.toString()} in the trash`);\n }\n throw err;\n }\n return BitObject.parseObject(buffer, trashObjPath);\n })\n );\n return objectsFromTrash;\n }\n\n async restoreFromTrash(refs: Ref[]) {\n logger.debug(`Repository.restoreFromTrash: ${refs.length} objects`);\n const objectsFromTrash = await this.getFromTrash(refs);\n await this.writeObjectsToTheFS(objectsFromTrash);\n }\n\n async restoreFromDir(dir: string, overwrite = false) {\n await fs.copy(path.join(this.scopePath, dir), this.getPath(), { overwrite });\n }\n\n private async moveOneObjectToDir(ref: Ref, dir: string) {\n const currentPath = this.objectPath(ref);\n const absDir = path.join(this.scopePath, dir);\n const fullPath = path.join(absDir, this.hashPath(ref));\n await fs.move(currentPath, fullPath, { overwrite: true });\n this.removeFromCache(ref);\n }\n\n private async moveOneObjectToTrash(ref: Ref) {\n await this.moveOneObjectToDir(ref, TRASH_DIR);\n }\n\n async deleteRecordsFromUnmergedComponents(compIds: ComponentID[]) {\n this.unmergedComponents.removeMultipleComponents(compIds);\n await this.unmergedComponents.write();\n }\n\n /**\n * write all objects to the FS and index the components/lanes/symlink objects\n */\n async writeObjectsToTheFS(objects: BitObject[]): Promise<void> {\n const count = objects.length;\n if (!count) return;\n logger.trace(`Repository.writeObjectsToTheFS: started writing ${count} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(objects, (obj) => this._writeOne(obj), {\n concurrency,\n });\n logger.trace(`Repository.writeObjectsToTheFS: completed writing ${count} objects`);\n\n const added = this.scopeIndex.addMany(objects);\n if (added) await this.scopeIndex.write();\n }\n\n /**\n * do not call this method directly. always call this.removeObject() and once done with all objects,\n * call this.persist()\n */\n _deleteOne(ref: Ref): Promise<boolean> {\n this.removeFromCache(ref);\n const pathToDelete = this.objectPath(ref);\n logger.trace(`repository._deleteOne: deleting ${pathToDelete}`);\n return removeFile(pathToDelete, true);\n }\n\n /**\n * always prefer this.persist() or this.writeObjectsToTheFS()\n * this method doesn't write to scopeIndex. so using this method for ModelComponent or\n * Symlink makes the index outdated.\n */\n async _writeOne(object: BitObject): Promise<boolean> {\n const contents = await object.compress();\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n const hash = object.hash();\n if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object); // update the cache\n const objectPath = this.objectPath(hash);\n logger.trace(`repository._writeOne: ${objectPath}`);\n // Run hook to transform content pre persisting\n const transformedContent = this.onPersist(contents);\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return writeFile(objectPath, transformedContent, options);\n }\n\n async writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute) {\n // Refs come from client-supplied tar entry names. Validate the whole batch\n // before any writes so a crafted ref can't escape pendingDir AND so we\n // don't leave orphan files in pendingDir when one entry is rejected mid-batch.\n // Mirrors the isSnap check listRefs already applies on the read path.\n for (const object of objectList.objects) {\n const ref = object.ref.toString();\n if (!isSnap(ref)) throw new BitError(`invalid object ref: ${JSON.stringify(ref)}`);\n }\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n await Promise.all(\n objectList.objects.map(async (object) => {\n const objPath = path.join(pendingDir, this.hashPath(object.ref));\n await writeFile(objPath, object.buffer, options);\n })\n );\n }\n\n async readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute) {\n const refs = await this.listRefs(pendingDir);\n const objects = await Promise.all(\n refs.map(async (ref) => {\n const buffer = await fs.readFile(path.join(pendingDir, this.hashPath(ref)));\n return { ref, buffer };\n })\n );\n return new ObjectList(objects);\n }\n\n private hashPath(ref: Ref) {\n const hash = ref.toString();\n return path.join(hash.slice(0, 2), hash.slice(2));\n }\n}\n\nasync function removeFile(filePath: string, propagateDirs = false): Promise<boolean> {\n try {\n await fs.unlink(filePath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n // the file doesn't exist, that's fine, no need to do anything\n return false;\n }\n throw err;\n }\n if (!propagateDirs) return true;\n const { dir } = path.parse(filePath);\n await removeEmptyDir(dir);\n return true;\n}\n\nasync function resolveGroupId(groupName: string): Promise<number | null | undefined> {\n // unix group ids are meaningless on Windows, which has no /etc/group and no process.getgid\n if (!process.getgid) return null;\n let groupFileContent: string;\n try {\n groupFileContent = await fs.readFile('/etc/group', 'utf8');\n } catch (err: any) {\n logger.error('resolveGroupId', err);\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error ${err.message}`);\n }\n const groupLine = groupFileContent.split('\\n').find((line) => line.split(':')[0] === groupName);\n if (!groupLine) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", the group does not exist`);\n }\n const gid = Number(groupLine.split(':')[2]);\n if (Number.isNaN(gid)) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error parsing /etc/group`);\n }\n return gid;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_asyncMutex","_lodash","_bitError","_componentVersion","path","_interopRequireWildcard","_toolboxPromise","_legacy","_legacy2","_legacy3","_glob","_toolboxFs","_harmonyModules","_legacy4","_scopeIndex","_object","_objectList","_rawObject","_ref","_liveObjects","_harmonyModules2","_models","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","OBJECTS_BACKUP_DIR","OBJECTS_DIR","TRASH_DIR","MAX_COMPRESSED_SIZE_TO_CACHE","OBJECT_HEADER_CHUNK_SIZE","Repository","constructor","scopePath","scopeJson","LiveObjects","onRead","content","onPostObjectRead","onPersist","onPreObjectPersist","cache","createInMemoryCache","getCacheOptionsForObjects","persistMutex","_persistMutex","Mutex","load","repository","init","scopeIndex","loadOptionallyCreateScopeIndex","remoteLanes","RemoteLanes","unmergedComponents","UnmergedComponents","create","ScopeIndex","reset","getPathByScopePath","join","reLoadScopeIndex","reloadScopeIndexIfNeed","force","latestScopeIndex","currentAllScopeIndexItems","getAll","latestAllScopeIndexItems","length","differenceWith","isEqual","ensureDir","fs","getPath","getBackupPath","dirName","backupPath","getTrashDir","getLicense","getPopulatedLicense","getScopeMetaObject","license","object","ScopeMeta","fromObject","name","ref","hash","buffer","compress","objectPath","hashPath","pathExists","hasMultiple","refs","concurrency","concurrentIOLimit","existingRefs","pMapPool","compact","throws","inMemoryObjects","objects","toString","HASH_SIZE","getFullRefFromShortHash","cached","getCache","fileContentsRaw","readFile","err","code","logger","error","message","trace","msg","assign","stack","Error","compressedSize","byteLength","fileContents","parsedObject","inflatedSize","BitObject","parseObjectWithSize","setCache","liveObjects","list","types","listRefs","debug","map","loadGracefully","process","argv","includes","isTypeIncluded","obj","some","type","loadRefDeleteIfInvalid","loadRefOnlyIfType","push","onCompletedChunk","completed","listObjectsWithType","results","getObjectTypeGracefully","result","unreadable","warn","stat","readObjectType","size","mtimeMs","readInFull","parseObjectType","isContentTransformed","readTypeFromHeader","hasPostObjectReadTransformer","Boolean","chunk","Uint8Array","fileDescriptor","open","bytesRead","read","close","parseObjectTypeFromChunk","subarray","moveOneObjectToTrash","undefined","typeNames","UnknownObjectType","parseObjectOnlyIfType","cwd","matches","glob","str","replace","sep","isSnap","Ref","listRefsStartWith","shortHash","pathPrefix","listRawObjects","loadRaw","bitRawObject","BitRawObject","fromDeflatedBuffer","listObjectsFromIndex","indexType","filter","hashes","getHashesByQuery","getHashes","_getBitObjectsByHashes","getHashFromIndex","missingIndexItems","bitObjects","Promise","all","bitObject","indexItem","find","removeMany","item","write","missingStringified","toIdentifierString","OutdatedIndexJson","ModelComponent","Lane","added","addMany","raw","transformedContent","loadManyRaw","uniqRefs","uniqBy","loadManyRawIgnoreMissing","loadRawObject","loadSync","objectFile","readFileSync","parseSync","HashNotFound","key","live","cacheable","removeFromCache","delete","clearCache","clearObjectsFromCache","deleteAll","clear","backup","backupDir","objectsDir","emptyDirSync","copySync","add","forEach","removeObject","objectsToRemove","removeManyObjects","findMany","persist","validate","runExclusive","deleteObjectsFromFS","validateObjects","values","writeObjectsToTheFS","writeRemoteLanes","clearObjects","onPostObjectsPersist","catch","validateBeforePersist","_deleteOne","removed","moveObjectsToDir","dir","moveOneObjectToDir","moveObjectsToTrash","listTrash","getFromTrash","objectsFromTrash","trashObjPath","BitError","parseObject","restoreFromTrash","restoreFromDir","overwrite","copy","currentPath","absDir","fullPath","move","deleteRecordsFromUnmergedComponents","compIds","removeMultipleComponents","count","_writeOne","pathToDelete","removeFile","contents","compressWithSize","options","groupName","gid","resolveGroupId","writeFile","writeObjectsToPendingDir","objectList","pendingDir","JSON","stringify","objPath","readObjectsFromPendingDir","ObjectList","slice","exports","filePath","propagateDirs","unlink","parse","removeEmptyDir","getgid","groupFileContent","groupLine","split","line","isNaN"],"sources":["repository.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { Mutex } from 'async-mutex';\nimport { compact, uniqBy, differenceWith, isEqual } from 'lodash';\nimport { BitError } from '@teambit/bit-error';\nimport type { ComponentID } from '@teambit/component-id';\nimport { HASH_SIZE, isSnap } from '@teambit/component-version';\nimport * as path from 'path';\nimport { pMapPool } from '@teambit/toolbox.promise.map-pool';\nimport { OBJECTS_DIR } from '@teambit/legacy.constants';\nimport { logger } from '@teambit/legacy.logger';\nimport type { ChownOptions, PathOsBasedAbsolute } from '@teambit/legacy.utils';\nimport { writeFile } from '@teambit/legacy.utils';\nimport { glob } from 'glob';\nimport { removeEmptyDir } from '@teambit/toolbox.fs.remove-empty-dir';\nimport { concurrentIOLimit } from '@teambit/harmony.modules.concurrency';\nimport type { Types, ScopeJson } from '@teambit/legacy.scope';\nimport {\n HashNotFound,\n OutdatedIndexJson,\n UnknownObjectType,\n UnmergedComponents,\n RemoteLanes,\n} from '@teambit/legacy.scope';\nimport type { IndexType, IndexItem } from './scope-index';\nimport { ScopeIndex } from './scope-index';\nimport BitObject from './object';\nimport type { ObjectItem } from './object-list';\nimport { ObjectList } from './object-list';\nimport BitRawObject from './raw-object';\nimport Ref from './ref';\nimport { LiveObjects } from './live-objects';\nimport type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { getCacheOptionsForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';\nimport { ScopeMeta, Lane, ModelComponent } from '../models';\n\ntype ContentTransformer = (content: Buffer) => Buffer;\nconst OBJECTS_BACKUP_DIR = `${OBJECTS_DIR}.bak`;\nconst TRASH_DIR = 'trash';\nconst MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory\n/**\n * how much of an object file to read when all that's needed is its header. the header holds the\n * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it\n * is inflated for nothing (4KB inflates ten times as much, across every object in the scope). a\n * chunk that falls short anyway is read in full.\n */\nconst OBJECT_HEADER_CHUNK_SIZE = 512;\n\n/** `mtimeMs` lets a caller tell an object that has been here a while from one just written */\nexport type ObjectWithType = { ref: Ref; type: string; size: number; mtimeMs: number };\n/** `unreadable` holds the objects that couldn't be classified, so a caller can refuse to act on a partial inventory */\nexport type ObjectsWithType = { objects: ObjectWithType[]; unreadable: Ref[] };\n\nexport default class Repository {\n objects: { [key: string]: BitObject } = {};\n objectsToRemove: Ref[] = [];\n scopeJson: ScopeJson;\n onRead: ContentTransformer;\n onPersist: ContentTransformer;\n scopePath: string;\n scopeIndex: ScopeIndex;\n protected cache: InMemoryCache<BitObject>;\n private liveObjects = new LiveObjects();\n remoteLanes!: RemoteLanes;\n unmergedComponents!: UnmergedComponents;\n _persistMutex?: Mutex;\n constructor(scopePath: string, scopeJson: ScopeJson) {\n this.scopePath = scopePath;\n this.scopeJson = scopeJson;\n this.onRead = (content: Buffer) => Repository.onPostObjectRead?.(content) || content;\n this.onPersist = (content: Buffer) => Repository.onPreObjectPersist?.(content) || content;\n this.cache = createInMemoryCache(getCacheOptionsForObjects());\n }\n\n get persistMutex() {\n if (!this._persistMutex) {\n this._persistMutex = new Mutex();\n }\n return this._persistMutex;\n }\n\n static async load({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n await repository.init();\n return repository;\n }\n\n async init() {\n const scopeIndex = await this.loadOptionallyCreateScopeIndex();\n this.scopeIndex = scopeIndex;\n this.remoteLanes = new RemoteLanes(this.scopePath);\n this.unmergedComponents = await UnmergedComponents.load(this.scopePath);\n }\n\n static async create({ scopePath, scopeJson }: { scopePath: string; scopeJson: ScopeJson }): Promise<Repository> {\n const repository = new Repository(scopePath, scopeJson);\n const scopeIndex = ScopeIndex.create(scopePath);\n repository.scopeIndex = scopeIndex;\n repository.unmergedComponents = await UnmergedComponents.load(scopePath);\n repository.remoteLanes = new RemoteLanes(scopePath);\n return repository;\n }\n\n static reset(scopePath: string): Promise<void> {\n return ScopeIndex.reset(scopePath);\n }\n\n static getPathByScopePath(scopePath: string) {\n return path.join(scopePath, OBJECTS_DIR);\n }\n\n static onPostObjectsPersist: () => Promise<void>;\n\n /**\n * Hook for transforming content before objects are persisted to the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPreObjectPersist?: (content: Buffer) => Buffer;\n\n /**\n * Hook for transforming content after objects are read from the filesystem.\n * Note: This function cannot be async because it's used by the synchronous `loadSync` method\n * which needs to maintain sync behavior for compatibility with existing code.\n */\n static onPostObjectRead?: (content: Buffer) => Buffer;\n\n /**\n * whether `onPostObjectRead` actually transforms anything.\n *\n * the scope aspect installs the hook above unconditionally - it's a reduce over a slot that is\n * usually empty - so the hook being set says nothing about whether object content is transformed.\n * only a caller that can skip reading content altogether needs to tell the two apart.\n */\n static hasPostObjectReadTransformer?: () => boolean;\n\n async reLoadScopeIndex() {\n this.scopeIndex = await this.loadOptionallyCreateScopeIndex();\n }\n\n /**\n * current scope index difference with <scope_folder>/index.json content, reload it\n * @deprecated use Scope aspect `watchSystemFiles` instead, it's way more efficient.\n */\n public async reloadScopeIndexIfNeed(force = false) {\n const latestScopeIndex = await this.loadOptionallyCreateScopeIndex();\n if (force) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n const currentAllScopeIndexItems = this.scopeIndex.getAll();\n const latestAllScopeIndexItems = latestScopeIndex.getAll();\n\n if (currentAllScopeIndexItems.length !== latestAllScopeIndexItems.length) {\n this.scopeIndex = latestScopeIndex;\n return;\n }\n\n if (differenceWith(currentAllScopeIndexItems, latestAllScopeIndexItems, isEqual).length) {\n this.scopeIndex = latestScopeIndex;\n }\n }\n\n ensureDir() {\n return fs.ensureDir(this.getPath());\n }\n\n getPath() {\n return Repository.getPathByScopePath(this.scopePath);\n }\n\n getBackupPath(dirName?: string): string {\n const backupPath = path.join(this.scopePath, OBJECTS_BACKUP_DIR);\n return dirName ? path.join(backupPath, dirName) : backupPath;\n }\n\n getTrashDir() {\n return path.join(this.scopePath, TRASH_DIR);\n }\n\n getLicense(): Promise<string> {\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return this.scopeJson.getPopulatedLicense();\n }\n\n async getScopeMetaObject(): Promise<ObjectItem> {\n const license = await this.getLicense();\n const object = ScopeMeta.fromObject({ license, name: this.scopeJson.name });\n return { ref: object.hash(), buffer: await object.compress() };\n }\n\n objectPath(ref: Ref): string {\n return path.join(this.getPath(), this.hashPath(ref));\n }\n\n async has(ref: Ref): Promise<boolean> {\n const objectPath = this.objectPath(ref);\n return fs.pathExists(objectPath);\n }\n\n async hasMultiple(refs: Ref[]): Promise<Ref[]> {\n const concurrency = concurrentIOLimit();\n const existingRefs = await pMapPool(\n refs,\n async (ref) => {\n const pathExists = await this.has(ref);\n return pathExists ? ref : null;\n },\n { concurrency }\n );\n return compact(existingRefs);\n }\n\n async load(ref: Ref, throws = false): Promise<BitObject> {\n // during tag, the updated objects are in `this.objects`.\n // `this.cache` is less reliable, because if it reaches its max, then it loads from the filesystem, which may not\n // be there yet (in case of \"version\" object), or may be out-of-date (in case of \"component\" object).\n const inMemoryObjects = this.objects[ref.hash.toString()];\n if (inMemoryObjects) return inMemoryObjects;\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const cached = this.getCache(ref);\n if (cached) {\n return cached;\n }\n let fileContentsRaw: Buffer;\n const objectPath = this.objectPath(ref);\n try {\n fileContentsRaw = await fs.readFile(objectPath);\n } catch (err: any) {\n if (err.code !== 'ENOENT') {\n logger.error(`Failed reading a ref file ${objectPath}. Error: ${err.message}`);\n throw err;\n }\n logger.trace(`Failed finding a ref file ${objectPath}.`);\n if (throws) {\n // if we just `throw err` we loose the stack trace.\n // see https://stackoverflow.com/questions/68022123/no-stack-in-fs-promises-readfile-enoent-error\n const msg = `fatal: failed finding an object file ${objectPath} in the filesystem at ${err.path}`;\n throw Object.assign(err, { stack: new Error(msg).stack });\n }\n // @ts-ignore @todo: fix! it should return BitObject | null.\n return null;\n }\n const compressedSize = fileContentsRaw.byteLength;\n const fileContents = this.onRead(fileContentsRaw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());\n const { object: parsedObject, inflatedSize } = await BitObject.parseObjectWithSize(fileContents, objectPath);\n if (compressedSize < MAX_COMPRESSED_SIZE_TO_CACHE) {\n this.setCache(parsedObject, inflatedSize);\n } else {\n this.liveObjects.set(ref.toString(), parsedObject, inflatedSize, false);\n }\n return parsedObject;\n }\n\n /**\n * this is restricted to provide objects according to the given types. Otherwise, big scopes (>1GB) could crush.\n * example usage: `this.list([ModelComponent, Symlink, Lane])`\n */\n async list(types: Types): Promise<BitObject[]> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(\n `Repository.list, ${refs.length} refs are going to be loaded, searching for types: ${types.map((t) => t.name).join(', ')}`\n );\n const objects: BitObject[] = [];\n const loadGracefully = process.argv.includes('--never-exported');\n const isTypeIncluded = (obj: BitObject) => types.some((type) => type.name === obj.constructor.name); // avoid using \"obj instanceof type\" for Harmony to call this function successfully\n await pMapPool(\n refs,\n async (ref) => {\n const object = loadGracefully\n ? await this.loadRefDeleteIfInvalid(ref)\n : await this.loadRefOnlyIfType(ref, types);\n if (!object) return;\n if (loadGracefully && !isTypeIncluded(object)) return;\n objects.push(object);\n },\n {\n concurrency,\n onCompletedChunk: (completed) => {\n if (completed % 1000 === 0) logger.debug(`Repository.list, completed ${completed} out of ${refs.length}`);\n },\n }\n );\n return objects;\n }\n\n /**\n * classify every object in the scope by its type, along with its size on the filesystem.\n *\n * needed by the garbage collector, which must know the type of each object but has no use for\n * its content. inflating every object would mean inflating gigabytes of file-content (`Source`)\n * objects, so only the first chunk of each file is read - enough to hold the header, which is\n * where the type is. when a content transformer is registered (`onPostObjectRead`), it applies\n * to the whole buffer, so in that case the file is read in full.\n */\n async listObjectsWithType(): Promise<ObjectsWithType> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n logger.debug(`Repository.listObjectsWithType, classifying ${refs.length} objects`);\n const results = await pMapPool(refs, (ref) => this.getObjectTypeGracefully(ref), { concurrency });\n const objects = compact(results.map((result) => result.object));\n const unreadable = compact(results.map((result) => result.unreadable));\n if (unreadable.length) {\n logger.warn(`Repository.listObjectsWithType, unable to classify ${unreadable.length} objects`);\n }\n return { objects, unreadable };\n }\n\n /**\n * the objects that couldn't be classified are reported rather than skipped. a caller that acts on\n * this inventory (the garbage collector) has to know that it's incomplete, because an object it\n * can't see is one it can't reason about.\n */\n private async getObjectTypeGracefully(ref: Ref): Promise<{ object?: ObjectWithType; unreadable?: Ref }> {\n const objectPath = this.objectPath(ref);\n try {\n const stat = await fs.stat(objectPath);\n const type = await this.readObjectType(objectPath);\n return { object: { ref, type, size: stat.size, mtimeMs: stat.mtimeMs } };\n } catch (err: any) {\n logger.warn(`Repository.listObjectsWithType, failed reading ${objectPath}. Error: ${err.message}`);\n return { unreadable: ref };\n }\n }\n\n private async readObjectType(objectPath: string): Promise<string> {\n const readInFull = async () => BitObject.parseObjectType(this.onRead(await fs.readFile(objectPath)), objectPath);\n if (this.isContentTransformed()) return readInFull();\n return (await this.readTypeFromHeader(objectPath)) || readInFull();\n }\n\n /**\n * whether object files have to go through `onPostObjectRead` before their header can be read.\n * when there's no way to tell, assume they do. it's the slow answer, never the wrong one.\n */\n private isContentTransformed(): boolean {\n return Repository.hasPostObjectReadTransformer\n ? Repository.hasPostObjectReadTransformer()\n : Boolean(Repository.onPostObjectRead);\n }\n\n /**\n * the type an object file names in its header, read from the first chunk of the file only.\n * null when that chunk doesn't hold the whole header, in which case the file has to be read in\n * full. throws `UnknownObjectType` when the header names a type nothing is registered under.\n */\n private async readTypeFromHeader(objectPath: string): Promise<string | null> {\n // `Uint8Array` rather than `Buffer` - see `parseObjectTypeFromChunk`\n const chunk = new Uint8Array(OBJECT_HEADER_CHUNK_SIZE);\n const fileDescriptor = await fs.open(objectPath, 'r');\n let bytesRead: number;\n try {\n ({ bytesRead } = await fs.read(fileDescriptor, chunk, 0, chunk.length, 0));\n } finally {\n await fs.close(fileDescriptor);\n }\n return BitObject.parseObjectTypeFromChunk(chunk.subarray(0, bytesRead));\n }\n\n async loadRefDeleteIfInvalid(ref: Ref) {\n try {\n return await this.load(ref, true);\n } catch (err: any) {\n // this is needed temporarily to allow `bit reset --never-exported` to fix the bit-id-comp-id error.\n // in a few months, we can remove this condition (around min 2024)\n if (err.constructor.name === 'BitIdCompIdError' || err.constructor.name === 'MissingScope') {\n logger.debug(`bit-id-comp-id error, moving an object to trash ${ref.toString()}`);\n await this.moveOneObjectToTrash(ref);\n return undefined;\n }\n throw err;\n }\n }\n\n async loadRefOnlyIfType(ref: Ref, types: Types): Promise<BitObject | null> {\n const objectPath = this.objectPath(ref);\n const typeNames = types.map((type) => type.name);\n // most of a scope is file contents, which callers of this never ask for. the header says\n // whether an object is wanted, so the rest of the file is only read and inflated when it is.\n // transformed content has no header to read on its own, so it keeps to the single full read.\n if (!this.isContentTransformed()) {\n let type: string | null;\n try {\n type = await this.readTypeFromHeader(objectPath);\n } catch (err: any) {\n // an unregistered type is not one of the types asked for - the same answer the full read gives\n if (err instanceof UnknownObjectType) return null;\n throw err;\n }\n if (type && !typeNames.includes(type)) return null;\n }\n const fileContents = this.onRead(await fs.readFile(objectPath));\n return BitObject.parseObjectOnlyIfType(fileContents, typeNames, objectPath);\n }\n\n async listRefs(cwd = this.getPath()): Promise<Array<Ref>> {\n const matches = await glob(path.join('*', '*'), { cwd });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRefsStartWith(shortHash: Ref): Promise<Array<Ref>> {\n const pathPrefix = this.hashPath(shortHash);\n const matches = await glob(`${pathPrefix}*`, { cwd: this.getPath() });\n const refs = matches.map((str) => {\n const hash = str.replace(path.sep, '');\n if (!isSnap(hash)) {\n logger.error(`fatal: the file \"${str}\" is not a valid bit object path`);\n return null;\n }\n return new Ref(hash);\n });\n return compact(refs);\n }\n\n async listRawObjects(): Promise<any> {\n const refs = await this.listRefs();\n const concurrency = concurrentIOLimit();\n return pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject;\n } catch {\n logger.error(`Couldn't load the ref ${ref} this object is probably corrupted and should be delete`);\n return null;\n }\n },\n { concurrency }\n );\n }\n\n async listObjectsFromIndex(indexType: IndexType, filter?: Function): Promise<BitObject[]> {\n const hashes = filter ? this.scopeIndex.getHashesByQuery(indexType, filter) : this.scopeIndex.getHashes(indexType);\n return this._getBitObjectsByHashes(hashes);\n }\n\n getHashFromIndex(indexType: IndexType, filter: Function): string | null {\n const hashes = this.scopeIndex.getHashesByQuery(indexType, filter);\n if (hashes.length > 2) throw new Error('getHashFromIndex expect to get zero or one result');\n return hashes.length ? hashes[0] : null;\n }\n\n async _getBitObjectsByHashes(hashes: string[]): Promise<BitObject[]> {\n const missingIndexItems: IndexItem[] = [];\n const bitObjects = await Promise.all(\n hashes.map(async (hash) => {\n const bitObject = await this.load(new Ref(hash));\n if (!bitObject) {\n const indexItem = this.scopeIndex.find(hash);\n if (!indexItem) throw new Error(`_getBitObjectsByHashes failed finding ${hash}`);\n missingIndexItems.push(indexItem);\n return;\n }\n return bitObject;\n })\n );\n if (missingIndexItems.length) {\n this.scopeIndex.removeMany(missingIndexItems.map((item) => new Ref(item.hash)));\n await this.scopeIndex.write();\n const missingStringified = missingIndexItems.map((item) => item.toIdentifierString());\n throw new OutdatedIndexJson(missingStringified);\n }\n return compact(bitObjects);\n }\n\n async loadOptionallyCreateScopeIndex(): Promise<ScopeIndex> {\n try {\n const scopeIndex = await ScopeIndex.load(this.scopePath);\n return scopeIndex;\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n const bitObjects: BitObject[] = await this.list([ModelComponent, Lane]);\n const scopeIndex = ScopeIndex.create(this.scopePath);\n const added = scopeIndex.addMany(bitObjects);\n if (added) await scopeIndex.write();\n return scopeIndex;\n }\n throw err;\n }\n }\n\n async loadRaw(ref: Ref): Promise<Buffer> {\n if (ref.hash.length < HASH_SIZE) {\n ref = await this.getFullRefFromShortHash(ref);\n }\n const raw = await fs.readFile(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(raw);\n // uncomment to debug the transformed objects by onRead\n // console.log('transformedContent loadRaw', ref.toString(), BitObject.parseSync(transformedContent).getType());\n return transformedContent;\n }\n\n async getFullRefFromShortHash(ref: Ref): Promise<Ref> {\n const refs = await this.listRefsStartWith(ref);\n if (refs.length > 1) {\n throw new Error(\n `found ${refs.length} objects with the same short hash ${ref.toString()}, please use longer hash`\n );\n }\n if (refs.length === 0) {\n throw new Error(`failed finding an object with the short hash ${ref.toString()}`);\n }\n return refs[0];\n }\n\n async loadManyRaw(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const uniqRefs = uniqBy(refs, 'hash');\n return pMapPool(uniqRefs, async (ref) => ({ ref, buffer: await this.loadRaw(ref) }), { concurrency });\n }\n\n async loadManyRawIgnoreMissing(refs: Ref[]): Promise<ObjectItem[]> {\n const concurrency = concurrentIOLimit();\n const results = await pMapPool(\n refs,\n async (ref) => {\n try {\n const buffer = await this.loadRaw(ref);\n return { ref, buffer };\n } catch (err: any) {\n if (err.code === 'ENOENT') return null;\n throw err;\n }\n },\n { concurrency }\n );\n return compact(results);\n }\n\n async loadRawObject(ref: Ref): Promise<BitRawObject> {\n const buffer = await this.loadRaw(ref);\n const bitRawObject = await BitRawObject.fromDeflatedBuffer(buffer, ref.hash);\n return bitRawObject as any as BitRawObject;\n }\n\n /**\n * prefer using `this.load()` for an async version, which also writes to the cache\n */\n loadSync(ref: Ref, throws = true): BitObject {\n try {\n const objectFile = fs.readFileSync(this.objectPath(ref));\n // Run hook to transform content pre reading\n const transformedContent = this.onRead(objectFile);\n return BitObject.parseSync(transformedContent);\n } catch {\n if (throws) {\n throw new HashNotFound(ref.toString());\n }\n // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!\n return null;\n }\n }\n\n /**\n * `size` is the object's inflated content size (see `InMemoryCache.set`).\n */\n setCache(object: BitObject, size?: number) {\n const key = object.hash().toString();\n this.cache.set(key, object, size);\n this.liveObjects.set(key, object, size, true);\n return this;\n }\n\n /**\n * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).\n */\n getCache(ref: Ref): BitObject | undefined {\n const key = ref.toString();\n const cached = this.cache.get(key);\n if (cached) return cached;\n const live = this.liveObjects.get(key);\n if (!live) return undefined;\n if (live.cacheable) this.cache.set(key, live.object, live.size); // it's in use again\n return live.object;\n }\n\n removeFromCache(ref: Ref) {\n this.cache.delete(ref.toString());\n this.liveObjects.delete(ref.toString());\n }\n\n async clearCache() {\n logger.debug('repository.clearCache');\n this.clearObjectsFromCache();\n await this.init();\n }\n clearObjectsFromCache() {\n logger.debug('repository.clearObjectsFromCache');\n this.cache.deleteAll();\n this.liveObjects.clear();\n }\n\n backup(dirName?: string) {\n const backupDir = this.getBackupPath(dirName);\n const objectsDir = this.getPath();\n logger.debug(`making a backup of all objects from ${objectsDir} to ${backupDir}`);\n fs.emptyDirSync(backupDir);\n fs.copySync(objectsDir, backupDir);\n }\n\n add(object: BitObject | null | undefined): Repository {\n // console.trace(`repository: adding object ${object?.hash().toString()}`);\n if (!object) return this;\n // leave the following commented log message, it is very useful for debugging but too verbose when not needed.\n // logger.debug(`repository: adding object ${object.hash().toString()} which consist of the following id: ${object.id()}`);\n this.objects[object.hash().toString()] = object;\n this.setCache(object);\n return this;\n }\n\n addMany(objects: BitObject[]): Repository {\n if (!objects || !objects.length) return this;\n objects.forEach((obj) => this.add(obj));\n return this;\n }\n\n removeObject(ref: Ref) {\n this.objectsToRemove.push(ref);\n }\n\n removeManyObjects(refs: Ref[]) {\n if (!refs || !refs.length) return;\n refs.forEach((ref) => this.removeObject(ref));\n }\n\n findMany(refs: Ref[]): Promise<BitObject[]> {\n return Promise.all(refs.map((ref) => this.load(ref)));\n }\n\n /**\n * important! use this method only for commands that are non running on an http server.\n *\n * it's better to remove/delete objects directly and not using the `objects` member.\n * it helps to avoid multiple processes running concurrently on an http server.\n *\n * persist objects changes (added and removed) into the filesystem\n * do not call this function multiple times in parallel, otherwise, it'll damage the index.json file.\n * call this function only once after you added and removed all applicable objects.\n */\n async persist(validate = true): Promise<void> {\n // do not let two requests enter this critical area, otherwise, refs/index.json/objects could\n // be corrupted\n logger.debug(`Repository.persist, going to acquire a lock`);\n await this.persistMutex.runExclusive(async () => {\n logger.debug(`Repository.persist, validate = ${validate.toString()}, a lock has been acquired`);\n await this.deleteObjectsFromFS(this.objectsToRemove);\n this.validateObjects(validate, Object.values(this.objects));\n await this.writeObjectsToTheFS(Object.values(this.objects));\n await this.writeRemoteLanes();\n await this.unmergedComponents.write();\n });\n logger.debug(`Repository.persist, completed. the lock has been released`);\n this.clearObjects();\n if (Repository.onPostObjectsPersist) {\n Repository.onPostObjectsPersist().catch((err) => {\n logger.error('fatal: onPostObjectsPersist encountered an error (this error does not stop the process)', err);\n });\n }\n }\n\n async writeRemoteLanes() {\n await this.remoteLanes.write();\n }\n\n /**\n * this is especially critical for http server, where one process lives long and serves multiple\n * exports. without this, the objects get accumulated over time and being rewritten over and over\n * again.\n */\n private clearObjects() {\n this.objects = {};\n this.objectsToRemove = [];\n }\n\n /**\n * normally, the validation step takes place just before the acutal writing of the file.\n * however, this can be an issue where a component has an invalid version. the component could\n * be saved before validating the version (see #1727). that's why we validate here before writing\n * anything to the filesystem.\n * the open question here is whether should we validate again before the actual writing or it\n * should be enough to validate here?\n * for now, it does validate again before saving, only to be 100% sure nothing happens in a few\n * lines of code until the actual writing. however, if the performance penalty is noticeable, we\n * can easily revert it by changing `bitObject.validateBeforePersist = false` line run regardless\n * the `validate` argument.\n */\n validateObjects(validate: boolean, objects: BitObject[]) {\n objects.forEach((bitObject) => {\n // @ts-ignore some BitObject classes have validate() method\n if (validate && bitObject.validate) {\n // @ts-ignore\n bitObject.validate();\n }\n if (!validate) {\n bitObject.validateBeforePersist = false;\n }\n });\n }\n\n async deleteObjectsFromFS(refs: Ref[]): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository._deleteMany: deleting ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this._deleteOne(ref), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToDir(refs: Ref[], dir: string): Promise<void> {\n if (!refs.length) return;\n const uniqRefs = uniqBy(refs, 'hash');\n logger.debug(`Repository.moveObjectsToDir: ${uniqRefs.length} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(uniqRefs, (ref) => this.moveOneObjectToDir(ref, dir), { concurrency });\n const removed = this.scopeIndex.removeMany(uniqRefs);\n if (removed) await this.scopeIndex.write();\n }\n\n async moveObjectsToTrash(refs: Ref[]): Promise<void> {\n await this.moveObjectsToDir(refs, TRASH_DIR);\n }\n\n async listTrash(): Promise<Ref[]> {\n return this.listRefs(this.getTrashDir());\n }\n\n async getFromTrash(refs: Ref[]): Promise<BitObject[]> {\n const objectsFromTrash = await Promise.all(\n refs.map(async (ref) => {\n const trashObjPath = path.join(this.getTrashDir(), this.hashPath(ref));\n let buffer: Buffer;\n try {\n buffer = await fs.readFile(trashObjPath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n throw new BitError(`unable to find the object ${ref.toString()} in the trash`);\n }\n throw err;\n }\n return BitObject.parseObject(buffer, trashObjPath);\n })\n );\n return objectsFromTrash;\n }\n\n async restoreFromTrash(refs: Ref[]) {\n logger.debug(`Repository.restoreFromTrash: ${refs.length} objects`);\n const objectsFromTrash = await this.getFromTrash(refs);\n await this.writeObjectsToTheFS(objectsFromTrash);\n }\n\n async restoreFromDir(dir: string, overwrite = false) {\n await fs.copy(path.join(this.scopePath, dir), this.getPath(), { overwrite });\n }\n\n private async moveOneObjectToDir(ref: Ref, dir: string) {\n const currentPath = this.objectPath(ref);\n const absDir = path.join(this.scopePath, dir);\n const fullPath = path.join(absDir, this.hashPath(ref));\n await fs.move(currentPath, fullPath, { overwrite: true });\n this.removeFromCache(ref);\n }\n\n private async moveOneObjectToTrash(ref: Ref) {\n await this.moveOneObjectToDir(ref, TRASH_DIR);\n }\n\n async deleteRecordsFromUnmergedComponents(compIds: ComponentID[]) {\n this.unmergedComponents.removeMultipleComponents(compIds);\n await this.unmergedComponents.write();\n }\n\n /**\n * write all objects to the FS and index the components/lanes/symlink objects\n */\n async writeObjectsToTheFS(objects: BitObject[]): Promise<void> {\n const count = objects.length;\n if (!count) return;\n logger.trace(`Repository.writeObjectsToTheFS: started writing ${count} objects`);\n const concurrency = concurrentIOLimit();\n await pMapPool(objects, (obj) => this._writeOne(obj), {\n concurrency,\n });\n logger.trace(`Repository.writeObjectsToTheFS: completed writing ${count} objects`);\n\n const added = this.scopeIndex.addMany(objects);\n if (added) await this.scopeIndex.write();\n }\n\n /**\n * do not call this method directly. always call this.removeObject() and once done with all objects,\n * call this.persist()\n */\n _deleteOne(ref: Ref): Promise<boolean> {\n this.removeFromCache(ref);\n const pathToDelete = this.objectPath(ref);\n logger.trace(`repository._deleteOne: deleting ${pathToDelete}`);\n return removeFile(pathToDelete, true);\n }\n\n /**\n * always prefer this.persist() or this.writeObjectsToTheFS()\n * this method doesn't write to scopeIndex. so using this method for ModelComponent or\n * Symlink makes the index outdated.\n */\n async _writeOne(object: BitObject): Promise<void> {\n const { buffer: contents, inflatedSize } = await object.compressWithSize();\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n const hash = object.hash();\n const objectPath = this.objectPath(hash);\n logger.trace(`repository._writeOne: ${objectPath}`);\n // Run hook to transform content pre persisting\n const transformedContent = this.onPersist(contents);\n await writeFile(objectPath, transformedContent, options);\n // once written, the object is the up-to-date one. this also replaces the size-estimate of objects that\n // were cached by `add()`.\n if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);\n this.liveObjects.set(\n hash.toString(),\n object,\n inflatedSize,\n transformedContent.byteLength < MAX_COMPRESSED_SIZE_TO_CACHE\n );\n }\n\n async writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute) {\n // Refs come from client-supplied tar entry names. Validate the whole batch\n // before any writes so a crafted ref can't escape pendingDir AND so we\n // don't leave orphan files in pendingDir when one entry is rejected mid-batch.\n // Mirrors the isSnap check listRefs already applies on the read path.\n for (const object of objectList.objects) {\n const ref = object.ref.toString();\n if (!isSnap(ref)) throw new BitError(`invalid object ref: ${JSON.stringify(ref)}`);\n }\n const options: ChownOptions = {};\n if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);\n await Promise.all(\n objectList.objects.map(async (object) => {\n const objPath = path.join(pendingDir, this.hashPath(object.ref));\n await writeFile(objPath, object.buffer, options);\n })\n );\n }\n\n async readObjectsFromPendingDir(pendingDir: PathOsBasedAbsolute) {\n const refs = await this.listRefs(pendingDir);\n const objects = await Promise.all(\n refs.map(async (ref) => {\n const buffer = await fs.readFile(path.join(pendingDir, this.hashPath(ref)));\n return { ref, buffer };\n })\n );\n return new ObjectList(objects);\n }\n\n private hashPath(ref: Ref) {\n const hash = ref.toString();\n return path.join(hash.slice(0, 2), hash.slice(2));\n }\n}\n\nasync function removeFile(filePath: string, propagateDirs = false): Promise<boolean> {\n try {\n await fs.unlink(filePath);\n } catch (err: any) {\n if (err.code === 'ENOENT') {\n // the file doesn't exist, that's fine, no need to do anything\n return false;\n }\n throw err;\n }\n if (!propagateDirs) return true;\n const { dir } = path.parse(filePath);\n await removeEmptyDir(dir);\n return true;\n}\n\nasync function resolveGroupId(groupName: string): Promise<number | null | undefined> {\n // unix group ids are meaningless on Windows, which has no /etc/group and no process.getgid\n if (!process.getgid) return null;\n let groupFileContent: string;\n try {\n groupFileContent = await fs.readFile('/etc/group', 'utf8');\n } catch (err: any) {\n logger.error('resolveGroupId', err);\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error ${err.message}`);\n }\n const groupLine = groupFileContent.split('\\n').find((line) => line.split(':')[0] === groupName);\n if (!groupLine) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", the group does not exist`);\n }\n const gid = Number(groupLine.split(':')[2]);\n if (Number.isNaN(gid)) {\n throw new BitError(`unable to resolve group id of \"${groupName}\", got an error parsing /etc/group`);\n }\n return gid;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,43 @@
1
+ import { expect } from 'chai';
2
+ import type BitObject from './object';
3
+ import { LiveObjects } from './live-objects';
4
+
5
+ const createObject = () => ({}) as BitObject;
6
+
7
+ describe('LiveObjects', () => {
8
+ it('should return an object that is still referenced, with its size and cacheability', () => {
9
+ const liveObjects = new LiveObjects();
10
+ const object = createObject();
11
+ liveObjects.set('key', object, 100, false);
12
+ expect(liveObjects.get('key')).to.deep.equal({ object, size: 100, cacheable: false });
13
+ });
14
+ it('should return the latest object that was set for the same key', () => {
15
+ const liveObjects = new LiveObjects();
16
+ const older = createObject();
17
+ const newer = createObject();
18
+ liveObjects.set('key', older, 1, true);
19
+ liveObjects.set('key', newer, 2, true);
20
+ expect(liveObjects.get('key')?.object).to.equal(newer);
21
+ });
22
+ it('should not return deleted or cleared objects', () => {
23
+ const liveObjects = new LiveObjects();
24
+ const first = createObject();
25
+ const second = createObject();
26
+ liveObjects.set('first', first, 1, true);
27
+ liveObjects.set('second', second, 1, true);
28
+ liveObjects.delete('first');
29
+ expect(liveObjects.get('first')).to.be.undefined;
30
+ liveObjects.clear();
31
+ expect(liveObjects.get('second')).to.be.undefined;
32
+ });
33
+ it('should not keep an object alive once nothing else references it', async function () {
34
+ const gc = (global as any).gc;
35
+ if (!gc) this.skip(); // requires running node with --expose-gc
36
+ const liveObjects = new LiveObjects();
37
+ (() => liveObjects.set('key', createObject(), 1, true))();
38
+ // a WeakRef keeps its target alive until the end of the current job, so let it end before collecting
39
+ await new Promise((resolve) => setImmediate(resolve));
40
+ gc();
41
+ expect(liveObjects.get('key')).to.be.undefined;
42
+ });
43
+ });
@@ -0,0 +1,48 @@
1
+ /// <reference lib="es2021.weakref" />
2
+ import type BitObject from './object';
3
+
4
+ type LiveObjectEntry = {
5
+ ref: WeakRef<BitObject>;
6
+ size?: number;
7
+ /**
8
+ * whether the object may be kept in the (strong) objects cache. big objects are only tracked here.
9
+ */
10
+ cacheable: boolean;
11
+ };
12
+
13
+ /**
14
+ * objects that were loaded or cached, held *weakly*: an object is returned from here only while something
15
+ * else still references it, and this map never keeps an object alive.
16
+ *
17
+ * it complements the size-bounded objects cache. when that cache evicts an object that is still in use
18
+ * (or an object is too big to be cached at all), a later load returns the same instance from here
19
+ * rather than re-reading and re-parsing a duplicate copy of it.
20
+ */
21
+ export class LiveObjects {
22
+ private entries = new Map<string, LiveObjectEntry>();
23
+ private cleanup = new FinalizationRegistry<string>((key) => {
24
+ // the key may have been re-set with another object since this one was registered
25
+ if (!this.entries.get(key)?.ref.deref()) this.entries.delete(key);
26
+ });
27
+
28
+ set(key: string, object: BitObject, size: number | undefined, cacheable: boolean) {
29
+ const existing = this.entries.get(key);
30
+ if (existing?.ref.deref() !== object) this.cleanup.register(object, key);
31
+ this.entries.set(key, { ref: new WeakRef(object), size, cacheable });
32
+ }
33
+
34
+ get(key: string): { object: BitObject; size?: number; cacheable: boolean } | undefined {
35
+ const entry = this.entries.get(key);
36
+ const object = entry?.ref.deref();
37
+ if (!entry || !object) return undefined;
38
+ return { object, size: entry.size, cacheable: entry.cacheable };
39
+ }
40
+
41
+ delete(key: string) {
42
+ this.entries.delete(key);
43
+ }
44
+
45
+ clear() {
46
+ this.entries.clear();
47
+ }
48
+ }
package/objects/object.ts CHANGED
@@ -105,8 +105,16 @@ path: ${err.path}`);
105
105
  return new Ref(BitObject.makeHash(this.id()));
106
106
  }
107
107
 
108
- compress(): Promise<Buffer> {
109
- return deflate(this.serialize());
108
+ async compress(): Promise<Buffer> {
109
+ return (await this.compressWithSize()).buffer;
110
+ }
111
+
112
+ /**
113
+ * same as `compress`, but also returns the size of the uncompressed content.
114
+ */
115
+ async compressWithSize(): Promise<{ buffer: Buffer; inflatedSize: number }> {
116
+ const serialized = this.serialize();
117
+ return { buffer: await deflate(serialized), inflatedSize: serialized.byteLength };
110
118
  }
111
119
 
112
120
  serialize(): Buffer {
@@ -118,8 +126,18 @@ path: ${err.path}`);
118
126
  * see `this.parseSync` for the sync version
119
127
  */
120
128
  static async parseObject(fileContents: Buffer, filePath?: string): Promise<BitObject> {
129
+ return (await BitObject.parseObjectWithSize(fileContents, filePath)).object;
130
+ }
131
+
132
+ /**
133
+ * same as `parseObject`, but also returns the size of the inflated content.
134
+ */
135
+ static async parseObjectWithSize(
136
+ fileContents: Buffer,
137
+ filePath?: string
138
+ ): Promise<{ object: BitObject; inflatedSize: number }> {
121
139
  const buffer = await inflate(fileContents, filePath);
122
- return parse(buffer);
140
+ return { object: parse(buffer), inflatedSize: buffer.byteLength };
123
141
  }
124
142
 
125
143
  /**
@@ -28,13 +28,15 @@ import type { ObjectItem } from './object-list';
28
28
  import { ObjectList } from './object-list';
29
29
  import BitRawObject from './raw-object';
30
30
  import Ref from './ref';
31
+ import { LiveObjects } from './live-objects';
31
32
  import type { InMemoryCache } from '@teambit/harmony.modules.in-memory-cache';
32
- import { getMaxSizeForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';
33
+ import { getCacheOptionsForObjects, createInMemoryCache } from '@teambit/harmony.modules.in-memory-cache';
33
34
  import { ScopeMeta, Lane, ModelComponent } from '../models';
34
35
 
35
36
  type ContentTransformer = (content: Buffer) => Buffer;
36
37
  const OBJECTS_BACKUP_DIR = `${OBJECTS_DIR}.bak`;
37
38
  const TRASH_DIR = 'trash';
39
+ const MAX_COMPRESSED_SIZE_TO_CACHE = 100 * 1024; // don't cache big files (mainly artifacts) to prevent out-of-memory
38
40
  /**
39
41
  * how much of an object file to read when all that's needed is its header. the header holds the
40
42
  * type and is a few dozen bytes, which 512 compressed bytes always cover - and every byte past it
@@ -57,6 +59,7 @@ export default class Repository {
57
59
  scopePath: string;
58
60
  scopeIndex: ScopeIndex;
59
61
  protected cache: InMemoryCache<BitObject>;
62
+ private liveObjects = new LiveObjects();
60
63
  remoteLanes!: RemoteLanes;
61
64
  unmergedComponents!: UnmergedComponents;
62
65
  _persistMutex?: Mutex;
@@ -65,7 +68,7 @@ export default class Repository {
65
68
  this.scopeJson = scopeJson;
66
69
  this.onRead = (content: Buffer) => Repository.onPostObjectRead?.(content) || content;
67
70
  this.onPersist = (content: Buffer) => Repository.onPreObjectPersist?.(content) || content;
68
- this.cache = createInMemoryCache({ maxSize: getMaxSizeForObjects() });
71
+ this.cache = createInMemoryCache(getCacheOptionsForObjects());
69
72
  }
70
73
 
71
74
  get persistMutex() {
@@ -240,15 +243,15 @@ export default class Repository {
240
243
  // @ts-ignore @todo: fix! it should return BitObject | null.
241
244
  return null;
242
245
  }
243
- const size = fileContentsRaw.byteLength;
246
+ const compressedSize = fileContentsRaw.byteLength;
244
247
  const fileContents = this.onRead(fileContentsRaw);
245
248
  // uncomment to debug the transformed objects by onRead
246
249
  // console.log('transformedContent load', ref.toString(), BitObject.parseSync(fileContents).getType());
247
- const parsedObject = await BitObject.parseObject(fileContents, objectPath);
248
- const maxSizeToCache = 100 * 1024; // 100KB
249
- if (size < maxSizeToCache) {
250
- // don't cache big files (mainly artifacts) to prevent out-of-memory
251
- this.setCache(parsedObject);
250
+ const { object: parsedObject, inflatedSize } = await BitObject.parseObjectWithSize(fileContents, objectPath);
251
+ if (compressedSize < MAX_COMPRESSED_SIZE_TO_CACHE) {
252
+ this.setCache(parsedObject, inflatedSize);
253
+ } else {
254
+ this.liveObjects.set(ref.toString(), parsedObject, inflatedSize, false);
252
255
  }
253
256
  return parsedObject;
254
257
  }
@@ -564,27 +567,43 @@ export default class Repository {
564
567
  }
565
568
  }
566
569
 
567
- setCache(object: BitObject) {
568
- this.cache.set(object.hash().toString(), object);
570
+ /**
571
+ * `size` is the object's inflated content size (see `InMemoryCache.set`).
572
+ */
573
+ setCache(object: BitObject, size?: number) {
574
+ const key = object.hash().toString();
575
+ this.cache.set(key, object, size);
576
+ this.liveObjects.set(key, object, size, true);
569
577
  return this;
570
578
  }
571
579
 
580
+ /**
581
+ * an object evicted from the cache is still returned as long as it's in use elsewhere (see `LiveObjects`).
582
+ */
572
583
  getCache(ref: Ref): BitObject | undefined {
573
- return this.cache.get(ref.toString());
584
+ const key = ref.toString();
585
+ const cached = this.cache.get(key);
586
+ if (cached) return cached;
587
+ const live = this.liveObjects.get(key);
588
+ if (!live) return undefined;
589
+ if (live.cacheable) this.cache.set(key, live.object, live.size); // it's in use again
590
+ return live.object;
574
591
  }
575
592
 
576
593
  removeFromCache(ref: Ref) {
577
594
  this.cache.delete(ref.toString());
595
+ this.liveObjects.delete(ref.toString());
578
596
  }
579
597
 
580
598
  async clearCache() {
581
599
  logger.debug('repository.clearCache');
582
- this.cache.deleteAll();
600
+ this.clearObjectsFromCache();
583
601
  await this.init();
584
602
  }
585
603
  clearObjectsFromCache() {
586
604
  logger.debug('repository.clearObjectsFromCache');
587
605
  this.cache.deleteAll();
606
+ this.liveObjects.clear();
588
607
  }
589
608
 
590
609
  backup(dirName?: string) {
@@ -801,18 +820,25 @@ export default class Repository {
801
820
  * this method doesn't write to scopeIndex. so using this method for ModelComponent or
802
821
  * Symlink makes the index outdated.
803
822
  */
804
- async _writeOne(object: BitObject): Promise<boolean> {
805
- const contents = await object.compress();
823
+ async _writeOne(object: BitObject): Promise<void> {
824
+ const { buffer: contents, inflatedSize } = await object.compressWithSize();
806
825
  const options: ChownOptions = {};
807
826
  if (this.scopeJson.groupName) options.gid = await resolveGroupId(this.scopeJson.groupName);
808
827
  const hash = object.hash();
809
- if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object); // update the cache
810
828
  const objectPath = this.objectPath(hash);
811
829
  logger.trace(`repository._writeOne: ${objectPath}`);
812
830
  // Run hook to transform content pre persisting
813
831
  const transformedContent = this.onPersist(contents);
814
- // @ts-ignore AUTO-ADDED-AFTER-MIGRATION-PLEASE-FIX!
815
- return writeFile(objectPath, transformedContent, options);
832
+ await writeFile(objectPath, transformedContent, options);
833
+ // once written, the object is the up-to-date one. this also replaces the size-estimate of objects that
834
+ // were cached by `add()`.
835
+ if (this.cache.has(hash.toString())) this.cache.set(hash.toString(), object, inflatedSize);
836
+ this.liveObjects.set(
837
+ hash.toString(),
838
+ object,
839
+ inflatedSize,
840
+ transformedContent.byteLength < MAX_COMPRESSED_SIZE_TO_CACHE
841
+ );
816
842
  }
817
843
 
818
844
  async writeObjectsToPendingDir(objectList: ObjectList, pendingDir: PathOsBasedAbsolute) {
package/package.json CHANGED
@@ -1,60 +1,60 @@
1
1
  {
2
2
  "name": "@teambit/objects",
3
- "version": "0.0.686",
3
+ "version": "0.0.688",
4
4
  "homepage": "https://bit.cloud/teambit/scope/objects",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.scope",
8
8
  "name": "objects",
9
- "version": "0.0.686"
9
+ "version": "0.0.688"
10
10
  },
11
11
  "dependencies": {
12
+ "@pnpm/lockfile.types": "1100.0.19",
13
+ "semver": "7.7.1",
12
14
  "lodash": "4.17.21",
13
- "tar-stream": "2.2.0",
14
- "p-map-series": "2.1.0",
15
+ "uuid": "8.3.2",
15
16
  "async-mutex": "0.3.1",
17
+ "p-map-series": "2.1.0",
18
+ "tar-stream": "2.2.0",
16
19
  "fs-extra": "10.0.0",
17
20
  "glob": "13.0.0",
18
- "@pnpm/lockfile.types": "1100.0.19",
19
- "semver": "7.7.1",
20
- "uuid": "8.3.2",
21
21
  "@teambit/harmony": "0.4.12",
22
- "@teambit/cli": "0.0.1396",
22
+ "@teambit/cli": "0.0.1397",
23
23
  "@teambit/component-id": "1.2.4",
24
- "@teambit/component.snap-distance": "0.0.168",
25
- "@teambit/graph.cleargraph": "0.0.11",
26
- "@teambit/harmony.modules.concurrency": "0.0.46",
27
- "@teambit/legacy.logger": "0.0.62",
28
- "@teambit/legacy.scope": "0.0.167",
29
- "@teambit/toolbox.promise.map-pool": "0.0.21",
30
- "@teambit/legacy.constants": "0.0.45",
31
24
  "@teambit/legacy.utils": "0.0.52",
32
- "@teambit/toolbox.crypto.sha1": "0.0.22",
25
+ "@teambit/harmony.modules.get-basic-log": "0.0.169",
33
26
  "@teambit/bit-error": "0.0.404",
34
27
  "@teambit/component-version": "1.0.4",
35
- "@teambit/harmony.modules.in-memory-cache": "0.0.49",
36
- "@teambit/toolbox.fs.remove-empty-dir": "0.0.20",
28
+ "@teambit/component.snap-distance": "0.0.169",
29
+ "@teambit/config-store": "0.0.278",
37
30
  "@teambit/lane-id": "0.0.312",
38
- "@teambit/harmony.modules.get-basic-log": "0.0.168",
39
- "@teambit/config-store": "0.0.277",
40
- "@teambit/legacy.cli.error": "0.0.62",
41
- "@teambit/component.sources": "0.0.219",
31
+ "@teambit/legacy.cli.error": "0.0.63",
32
+ "@teambit/legacy.constants": "0.0.46",
33
+ "@teambit/legacy.logger": "0.0.63",
34
+ "@teambit/legacy.scope": "0.0.168",
35
+ "@teambit/toolbox.crypto.sha1": "0.0.22",
36
+ "@teambit/component.sources": "0.0.220",
37
+ "@teambit/harmony.modules.concurrency": "0.0.47",
42
38
  "@teambit/legacy-bit-id": "1.1.3",
43
39
  "@teambit/legacy-component-log": "0.0.432",
44
- "@teambit/legacy.consumer-component": "0.0.168",
45
- "@teambit/legacy.consumer-config": "0.0.167",
46
- "@teambit/legacy.extension-data": "0.0.169",
40
+ "@teambit/legacy.consumer-component": "0.0.169",
41
+ "@teambit/legacy.consumer-config": "0.0.168",
42
+ "@teambit/legacy.extension-data": "0.0.170",
47
43
  "@teambit/pkg.modules.semver-helper": "0.0.36",
48
44
  "@teambit/toolbox.array.duplications-finder": "0.0.16",
45
+ "@teambit/toolbox.promise.map-pool": "0.0.21",
46
+ "@teambit/graph.cleargraph": "0.0.11",
49
47
  "@teambit/bit.get-bit-version": "0.0.29",
50
- "@teambit/semantics.doc-parser": "0.0.175",
51
- "@teambit/graph": "1.0.1179"
48
+ "@teambit/semantics.doc-parser": "0.0.176",
49
+ "@teambit/harmony.modules.in-memory-cache": "0.0.50",
50
+ "@teambit/toolbox.fs.remove-empty-dir": "0.0.20",
51
+ "@teambit/graph": "1.0.1181"
52
52
  },
53
53
  "devDependencies": {
54
- "@types/lodash": "4.14.165",
55
- "@types/fs-extra": "9.0.7",
56
54
  "@types/semver": "7.5.8",
55
+ "@types/lodash": "4.14.165",
57
56
  "@types/uuid": "8.3.4",
57
+ "@types/fs-extra": "9.0.7",
58
58
  "@teambit/harmony.envs.core-aspect-env": "2.1.1"
59
59
  },
60
60
  "peerDependencies": {