@atproto/common 0.3.4 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/buffers.d.ts +1 -0
  3. package/dist/buffers.d.ts.map +1 -0
  4. package/dist/buffers.js +12 -0
  5. package/dist/buffers.js.map +1 -0
  6. package/dist/dates.d.ts +1 -0
  7. package/dist/dates.d.ts.map +1 -0
  8. package/dist/dates.js +20 -0
  9. package/dist/dates.js.map +1 -0
  10. package/dist/env.d.ts +1 -0
  11. package/dist/env.d.ts.map +1 -0
  12. package/dist/env.js +33 -0
  13. package/dist/env.js.map +1 -0
  14. package/dist/fs.d.ts +1 -0
  15. package/dist/fs.d.ts.map +1 -0
  16. package/dist/fs.js +47 -0
  17. package/dist/fs.js.map +1 -0
  18. package/dist/index.d.ts +3 -1
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +26 -23071
  21. package/dist/index.js.map +1 -7
  22. package/dist/ipld-multi.d.ts +1 -0
  23. package/dist/ipld-multi.d.ts.map +1 -0
  24. package/dist/ipld-multi.js +53 -0
  25. package/dist/ipld-multi.js.map +1 -0
  26. package/dist/ipld.d.ts +1 -0
  27. package/dist/ipld.d.ts.map +1 -0
  28. package/dist/ipld.js +146 -0
  29. package/dist/ipld.js.map +1 -0
  30. package/dist/logger.d.ts +1 -0
  31. package/dist/logger.d.ts.map +1 -0
  32. package/dist/logger.js +32 -0
  33. package/dist/logger.js.map +1 -0
  34. package/dist/obfuscate.d.ts +9 -0
  35. package/dist/obfuscate.d.ts.map +1 -0
  36. package/dist/obfuscate.js +96 -0
  37. package/dist/obfuscate.js.map +1 -0
  38. package/dist/streams.d.ts +2 -1
  39. package/dist/streams.d.ts.map +1 -0
  40. package/dist/streams.js +81 -0
  41. package/dist/streams.js.map +1 -0
  42. package/jest.config.js +3 -3
  43. package/package.json +11 -9
  44. package/src/index.ts +2 -1
  45. package/src/ipld.ts +4 -1
  46. package/src/obfuscate.ts +85 -0
  47. package/src/streams.ts +7 -3
  48. package/tsconfig.build.json +6 -2
  49. package/tsconfig.json +5 -8
  50. package/tsconfig.tests.json +7 -0
  51. package/babel.config.js +0 -1
  52. package/build.js +0 -14
@@ -1 +1,2 @@
1
1
  export declare const cborDecodeMulti: (encoded: Uint8Array) => unknown[];
2
+ //# sourceMappingURL=ipld-multi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipld-multi.d.ts","sourceRoot":"","sources":["../src/ipld-multi.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,eAAe,YAAa,UAAU,KAAG,OAAO,EAM5D,CAAA"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.cborDecodeMulti = void 0;
27
+ const cborx = __importStar(require("cbor-x"));
28
+ const cid_1 = require("multiformats/cid");
29
+ // add extension for decoding CIDs
30
+ // decoding code taken from @ipld/dag-cbor
31
+ // does not support encoding cids
32
+ cborx.addExtension({
33
+ Class: cid_1.CID,
34
+ tag: 42,
35
+ encode: () => {
36
+ throw new Error('cannot encode cids');
37
+ },
38
+ decode: (bytes) => {
39
+ if (bytes[0] !== 0) {
40
+ throw new Error('Invalid CID for CBOR tag 42; expected leading 0x00');
41
+ }
42
+ return cid_1.CID.decode(bytes.subarray(1)); // ignore leading 0x00
43
+ },
44
+ });
45
+ const cborDecodeMulti = (encoded) => {
46
+ const decoded = [];
47
+ cborx.decodeMultiple(encoded, (value) => {
48
+ decoded.push(value);
49
+ });
50
+ return decoded;
51
+ };
52
+ exports.cborDecodeMulti = cborDecodeMulti;
53
+ //# sourceMappingURL=ipld-multi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipld-multi.js","sourceRoot":"","sources":["../src/ipld-multi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAA+B;AAC/B,0CAAsC;AAEtC,kCAAkC;AAClC,0CAA0C;AAC1C,iCAAiC;AACjC,KAAK,CAAC,YAAY,CAAC;IACjB,KAAK,EAAE,SAAG;IACV,GAAG,EAAE,EAAE;IACP,MAAM,EAAE,GAAG,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAA;IACvC,CAAC;IACD,MAAM,EAAE,CAAC,KAAiB,EAAO,EAAE;QACjC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,OAAO,SAAG,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,sBAAsB;IAC7D,CAAC;CACF,CAAC,CAAA;AAEK,MAAM,eAAe,GAAG,CAAC,OAAmB,EAAa,EAAE;IAChE,MAAM,OAAO,GAAc,EAAE,CAAA;IAC7B,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACtC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AANY,QAAA,eAAe,mBAM3B"}
package/dist/ipld.d.ts CHANGED
@@ -27,3 +27,4 @@ export declare class VerifyCidError extends Error {
27
27
  actual: CID;
28
28
  constructor(expected: CID, actual: CID);
29
29
  }
30
+ //# sourceMappingURL=ipld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipld.d.ts","sourceRoot":"","sources":["../src/ipld.ts"],"names":[],"mappings":";;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAErD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,KAAK,MAAM,oBAAoB,CAAA;AAI3C,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C,eAAO,MAAM,UAAU,yBAAmB,CAAA;AAC1C,eAAO,MAAM,UAAU,yBAAmB,CAAA;AAE1C,eAAO,MAAM,eAAe,SAAgB,OAAO,kCAMlD,CAAA;AAED,eAAO,MAAM,UAAU,SAAgB,OAAO,KAAG,QAAQ,GAAG,CAG3D,CAAA;AAED,eAAO,MAAM,UAAU,WAAkB,MAAM,KAAG,QAAQ,OAAO,CAOhE,CAAA;AAED,eAAO,MAAM,iBAAiB,UACrB,UAAU,KAChB,OAAO,MAAM,EAAE,OAAO,CAMxB,CAAA;AAED,eAAO,MAAM,iBAAiB,QAAe,GAAG,SAAS,UAAU,kBAQlE,CAAA;AAED,eAAO,MAAM,WAAW,SAAU,UAAU,SAAS,MAAM,KAAG,GAG7D,CAAA;AAED,eAAO,MAAM,cAAc,SAAU,UAAU,KAAG,GAEjD,CAAA;AAED,qBAAa,kBAAmB,SAAQ,SAAS;IAE5B,GAAG,EAAE,GAAG;IAD3B,MAAM,cAA8B;gBACjB,GAAG,EAAE,GAAG;IAI3B,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,iBAAiB;IAKzE,MAAM,CAAC,EAAE,EAAE,iBAAiB;CAgB7B;AAED,qBAAa,cAAe,SAAQ,KAAK;IAE9B,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;gBADX,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,GAAG;CAIrB"}
package/dist/ipld.js ADDED
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.VerifyCidError = exports.VerifyCidTransform = exports.sha256RawToCid = exports.sha256ToCid = exports.verifyCidForBytes = exports.cborBytesToRecord = exports.isValidCid = exports.cidForCbor = exports.dataToCborBlock = exports.cborDecode = exports.cborEncode = void 0;
30
+ const crypto_1 = __importDefault(require("crypto"));
31
+ const stream_1 = require("stream");
32
+ const common_web_1 = require("@atproto/common-web");
33
+ const cid_1 = require("multiformats/cid");
34
+ const Block = __importStar(require("multiformats/block"));
35
+ const rawCodec = __importStar(require("multiformats/codecs/raw"));
36
+ const sha2_1 = require("multiformats/hashes/sha2");
37
+ const mf = __importStar(require("multiformats"));
38
+ const cborCodec = __importStar(require("@ipld/dag-cbor"));
39
+ exports.cborEncode = cborCodec.encode;
40
+ exports.cborDecode = cborCodec.decode;
41
+ const dataToCborBlock = async (data) => {
42
+ return Block.encode({
43
+ value: data,
44
+ codec: cborCodec,
45
+ hasher: sha2_1.sha256,
46
+ });
47
+ };
48
+ exports.dataToCborBlock = dataToCborBlock;
49
+ const cidForCbor = async (data) => {
50
+ const block = await (0, exports.dataToCborBlock)(data);
51
+ return block.cid;
52
+ };
53
+ exports.cidForCbor = cidForCbor;
54
+ const isValidCid = async (cidStr) => {
55
+ try {
56
+ const parsed = cid_1.CID.parse(cidStr);
57
+ return parsed.toString() === cidStr;
58
+ }
59
+ catch (err) {
60
+ return false;
61
+ }
62
+ };
63
+ exports.isValidCid = isValidCid;
64
+ const cborBytesToRecord = (bytes) => {
65
+ const val = (0, exports.cborDecode)(bytes);
66
+ if (!common_web_1.check.is(val, common_web_1.schema.map)) {
67
+ throw new Error(`Expected object, got: ${val}`);
68
+ }
69
+ return val;
70
+ };
71
+ exports.cborBytesToRecord = cborBytesToRecord;
72
+ const verifyCidForBytes = async (cid, bytes) => {
73
+ const digest = await sha2_1.sha256.digest(bytes);
74
+ const expected = cid_1.CID.createV1(cid.code, digest);
75
+ if (!cid.equals(expected)) {
76
+ throw new Error(`Not a valid CID for bytes. Expected: ${expected.toString()} Got: ${cid.toString()}`);
77
+ }
78
+ };
79
+ exports.verifyCidForBytes = verifyCidForBytes;
80
+ const sha256ToCid = (hash, codec) => {
81
+ const digest = mf.digest.create(sha2_1.sha256.code, hash);
82
+ return cid_1.CID.createV1(codec, digest);
83
+ };
84
+ exports.sha256ToCid = sha256ToCid;
85
+ const sha256RawToCid = (hash) => {
86
+ return (0, exports.sha256ToCid)(hash, rawCodec.code);
87
+ };
88
+ exports.sha256RawToCid = sha256RawToCid;
89
+ class VerifyCidTransform extends stream_1.Transform {
90
+ constructor(cid) {
91
+ super();
92
+ Object.defineProperty(this, "cid", {
93
+ enumerable: true,
94
+ configurable: true,
95
+ writable: true,
96
+ value: cid
97
+ });
98
+ Object.defineProperty(this, "hasher", {
99
+ enumerable: true,
100
+ configurable: true,
101
+ writable: true,
102
+ value: crypto_1.default.createHash('sha256')
103
+ });
104
+ }
105
+ _transform(chunk, _enc, cb) {
106
+ this.hasher.update(chunk);
107
+ cb(null, chunk);
108
+ }
109
+ _flush(cb) {
110
+ try {
111
+ const cid = (0, exports.sha256RawToCid)(this.hasher.digest());
112
+ if (this.cid.equals(cid)) {
113
+ return cb();
114
+ }
115
+ else {
116
+ return cb(new VerifyCidError(this.cid, cid));
117
+ }
118
+ }
119
+ catch (_err) {
120
+ const err = _err instanceof Error
121
+ ? _err
122
+ : new Error('Unexpected error', { cause: _err });
123
+ return cb(err);
124
+ }
125
+ }
126
+ }
127
+ exports.VerifyCidTransform = VerifyCidTransform;
128
+ class VerifyCidError extends Error {
129
+ constructor(expected, actual) {
130
+ super('Bad cid check');
131
+ Object.defineProperty(this, "expected", {
132
+ enumerable: true,
133
+ configurable: true,
134
+ writable: true,
135
+ value: expected
136
+ });
137
+ Object.defineProperty(this, "actual", {
138
+ enumerable: true,
139
+ configurable: true,
140
+ writable: true,
141
+ value: actual
142
+ });
143
+ }
144
+ }
145
+ exports.VerifyCidError = VerifyCidError;
146
+ //# sourceMappingURL=ipld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipld.js","sourceRoot":"","sources":["../src/ipld.ts"],"names":[],"mappings":"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"}
package/dist/logger.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import pino from 'pino';
2
2
  export declare const subsystemLogger: (name: string) => pino.Logger;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAwBvB,eAAO,MAAM,eAAe,SAAU,MAAM,KAAG,KAAK,MAWnD,CAAA"}
package/dist/logger.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.subsystemLogger = void 0;
7
+ const pino_1 = __importDefault(require("pino"));
8
+ const allSystemsEnabled = !process.env.LOG_SYSTEMS;
9
+ const enabledSystems = (process.env.LOG_SYSTEMS || '')
10
+ .replace(',', ' ')
11
+ .split(' ');
12
+ const enabledEnv = process.env.LOG_ENABLED;
13
+ const enabled = enabledEnv === 'true' || enabledEnv === 't' || enabledEnv === '1';
14
+ const level = process.env.LOG_LEVEL || 'info';
15
+ const config = {
16
+ enabled,
17
+ level,
18
+ };
19
+ const rootLogger = process.env.LOG_DESTINATION
20
+ ? (0, pino_1.default)(config, pino_1.default.destination(process.env.LOG_DESTINATION))
21
+ : (0, pino_1.default)(config);
22
+ const subsystems = {};
23
+ const subsystemLogger = (name) => {
24
+ if (subsystems[name])
25
+ return subsystems[name];
26
+ const subsystemEnabled = enabled && (allSystemsEnabled || enabledSystems.indexOf(name) > -1);
27
+ // can't disable child loggers, so we just set their level to fatal to effectively turn them off
28
+ subsystems[name] = rootLogger.child({ name }, { level: subsystemEnabled ? level : 'silent' });
29
+ return subsystems[name];
30
+ };
31
+ exports.subsystemLogger = subsystemLogger;
32
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAEvB,MAAM,iBAAiB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AAClD,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;KACnD,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;KACjB,KAAK,CAAC,GAAG,CAAC,CAAA;AAEb,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;AAC1C,MAAM,OAAO,GACX,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,CAAA;AAEnE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAA;AAE7C,MAAM,MAAM,GAAG;IACb,OAAO;IACP,KAAK;CACN,CAAA;AAED,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe;IAC5C,CAAC,CAAC,IAAA,cAAI,EAAC,MAAM,EAAE,cAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7D,CAAC,CAAC,IAAA,cAAI,EAAC,MAAM,CAAC,CAAA;AAEhB,MAAM,UAAU,GAAgC,EAAE,CAAA;AAE3C,MAAM,eAAe,GAAG,CAAC,IAAY,EAAe,EAAE;IAC3D,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;IAC7C,MAAM,gBAAgB,GACpB,OAAO,IAAI,CAAC,iBAAiB,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAErE,gGAAgG;IAChG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CACjC,EAAE,IAAI,EAAE,EACR,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC/C,CAAA;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC,CAAA;AAXY,QAAA,eAAe,mBAW3B"}
@@ -0,0 +1,9 @@
1
+ export declare function obfuscateEmail(email: string): string;
2
+ export declare function obfuscateWord(word: string): string;
3
+ export declare function obfuscateHeaders(headers: Record<string, string>): Record<string, string>;
4
+ export declare function obfuscateAuthHeader(authHeader: string): string;
5
+ export declare function obfuscateBasic(token: string): null | string;
6
+ export declare function obfuscateBearer(token: string): string;
7
+ export declare function obfuscateToken(token: string): string;
8
+ export declare function obfuscateJwt(token: string): null | string;
9
+ //# sourceMappingURL=obfuscate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscate.d.ts","sourceRoot":"","sources":["../src/obfuscate.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,UAG3C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,UAEzC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,0BAY/D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAgB9D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAS3D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAuBzD"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.obfuscateJwt = exports.obfuscateToken = exports.obfuscateBearer = exports.obfuscateBasic = exports.obfuscateAuthHeader = exports.obfuscateHeaders = exports.obfuscateWord = exports.obfuscateEmail = void 0;
4
+ function obfuscateEmail(email) {
5
+ const [local, domain] = email.split('@');
6
+ return `${obfuscateWord(local)}@${obfuscateWord(domain)}`;
7
+ }
8
+ exports.obfuscateEmail = obfuscateEmail;
9
+ function obfuscateWord(word) {
10
+ return `${word.charAt(0)}***${word.charAt(word.length - 1)}`;
11
+ }
12
+ exports.obfuscateWord = obfuscateWord;
13
+ function obfuscateHeaders(headers) {
14
+ const obfuscatedHeaders = {};
15
+ for (const key in headers) {
16
+ if (key.toLowerCase() === 'authorization') {
17
+ obfuscatedHeaders[key] = obfuscateAuthHeader(headers[key]);
18
+ }
19
+ else if (key.toLowerCase() === 'dpop') {
20
+ obfuscatedHeaders[key] = obfuscateJwt(headers[key]) || 'Invalid';
21
+ }
22
+ else {
23
+ obfuscatedHeaders[key] = headers[key];
24
+ }
25
+ }
26
+ return obfuscatedHeaders;
27
+ }
28
+ exports.obfuscateHeaders = obfuscateHeaders;
29
+ function obfuscateAuthHeader(authHeader) {
30
+ // This is a hot path (runs on every request). Avoid using split() or regex.
31
+ const spaceIdx = authHeader.indexOf(' ');
32
+ if (spaceIdx === -1)
33
+ return 'Invalid';
34
+ const type = authHeader.slice(0, spaceIdx);
35
+ switch (type.toLowerCase()) {
36
+ case 'bearer':
37
+ case 'dpop':
38
+ return `${type} ${obfuscateBearer(authHeader.slice(spaceIdx + 1))}`;
39
+ case 'basic':
40
+ return `${type} ${obfuscateBasic(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`;
41
+ default:
42
+ return `Invalid`;
43
+ }
44
+ }
45
+ exports.obfuscateAuthHeader = obfuscateAuthHeader;
46
+ function obfuscateBasic(token) {
47
+ if (!token)
48
+ return null;
49
+ const buffer = Buffer.from(token, 'base64');
50
+ if (!buffer.length)
51
+ return null; // Buffer.from will silently ignore invalid base64 chars
52
+ const authHeader = buffer.toString('utf8');
53
+ const colIdx = authHeader.indexOf(':');
54
+ if (colIdx === -1)
55
+ return null;
56
+ const username = authHeader.slice(0, colIdx);
57
+ return `${username}:***`;
58
+ }
59
+ exports.obfuscateBasic = obfuscateBasic;
60
+ function obfuscateBearer(token) {
61
+ return obfuscateJwt(token) || obfuscateToken(token);
62
+ }
63
+ exports.obfuscateBearer = obfuscateBearer;
64
+ function obfuscateToken(token) {
65
+ if (token.length >= 12)
66
+ return obfuscateWord(token);
67
+ return token ? '***' : '';
68
+ }
69
+ exports.obfuscateToken = obfuscateToken;
70
+ function obfuscateJwt(token) {
71
+ const firstDot = token.indexOf('.');
72
+ if (firstDot === -1)
73
+ return null;
74
+ const secondDot = token.indexOf('.', firstDot + 1);
75
+ if (secondDot === -1)
76
+ return null;
77
+ // Expected to be missing
78
+ const thirdDot = token.indexOf('.', secondDot + 1);
79
+ if (thirdDot !== -1)
80
+ return null;
81
+ try {
82
+ const payloadEnc = token.slice(firstDot + 1, secondDot);
83
+ const payloadJson = Buffer.from(payloadEnc, 'base64').toString('utf8');
84
+ const payload = JSON.parse(payloadJson);
85
+ if (typeof payload.sub === 'string')
86
+ return payload.sub;
87
+ }
88
+ catch {
89
+ // Invalid JWT
90
+ return null;
91
+ }
92
+ // Strip the signature
93
+ return token.slice(0, secondDot) + '.obfuscated';
94
+ }
95
+ exports.obfuscateJwt = obfuscateJwt;
96
+ //# sourceMappingURL=obfuscate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscate.js","sourceRoot":"","sources":["../src/obfuscate.ts"],"names":[],"mappings":"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"}
package/dist/streams.d.ts CHANGED
@@ -12,5 +12,6 @@ export declare class MaxSizeChecker extends Transform {
12
12
  createError: () => Error;
13
13
  totalSize: number;
14
14
  constructor(maxSize: number, createError: () => Error);
15
- _transform(chunk: Uint8Array, _enc: BufferEncoding, cb: TransformCallback): void | this;
15
+ _transform(chunk: Uint8Array, _enc: BufferEncoding, cb: TransformCallback): void;
16
16
  }
17
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,MAAM,EACN,QAAQ,EAER,SAAS,EACT,iBAAiB,EAClB,MAAM,QAAQ,CAAA;AAEf,eAAO,MAAM,mBAAmB,eAAgB,MAAM,EAAE,SAQvD,CAAA;AAED,eAAO,MAAM,WAAW,WAAY,QAAQ,KAAG,QAI9C,CAAA;AAED,eAAO,MAAM,UAAU,WAAkB,QAAQ,KAAG,QAAQ,MAAM,CAMjE,CAAA;AAED,eAAO,MAAM,aAAa,WAAkB,QAAQ,KAAG,QAAQ,UAAU,CAMxE,CAAA;AAED,eAAO,MAAM,oBAAoB,SACzB,cAAc,UAAU,CAAC,KAC9B,QAEF,CAAA;AAED,eAAO,MAAM,aAAa,UAAW,UAAU,KAAG,QAKjD,CAAA;AAED,qBAAa,cAAe,SAAQ,SAAS;IAGlC,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,MAAM,KAAK;IAHjC,SAAS,SAAI;gBAEJ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,KAAK;IAIjC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,iBAAiB;CAQ1E"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaxSizeChecker = exports.bytesToStream = exports.byteIterableToStream = exports.streamToBytes = exports.streamSize = exports.cloneStream = exports.forwardStreamErrors = void 0;
4
+ const stream_1 = require("stream");
5
+ const forwardStreamErrors = (...streams) => {
6
+ for (let i = 0; i < streams.length; ++i) {
7
+ const stream = streams[i];
8
+ const next = streams[i + 1];
9
+ if (next) {
10
+ stream.once('error', (err) => next.emit('error', err));
11
+ }
12
+ }
13
+ };
14
+ exports.forwardStreamErrors = forwardStreamErrors;
15
+ const cloneStream = (stream) => {
16
+ const passthrough = new stream_1.PassThrough();
17
+ (0, exports.forwardStreamErrors)(stream, passthrough);
18
+ return stream.pipe(passthrough);
19
+ };
20
+ exports.cloneStream = cloneStream;
21
+ const streamSize = async (stream) => {
22
+ let size = 0;
23
+ for await (const chunk of stream) {
24
+ size += chunk.length;
25
+ }
26
+ return size;
27
+ };
28
+ exports.streamSize = streamSize;
29
+ const streamToBytes = async (stream) => {
30
+ const bufs = [];
31
+ for await (const bytes of stream) {
32
+ bufs.push(bytes);
33
+ }
34
+ return new Uint8Array(Buffer.concat(bufs));
35
+ };
36
+ exports.streamToBytes = streamToBytes;
37
+ const byteIterableToStream = (iter) => {
38
+ return stream_1.Readable.from(iter, { objectMode: false });
39
+ };
40
+ exports.byteIterableToStream = byteIterableToStream;
41
+ const bytesToStream = (bytes) => {
42
+ const stream = new stream_1.Readable();
43
+ stream.push(bytes);
44
+ stream.push(null);
45
+ return stream;
46
+ };
47
+ exports.bytesToStream = bytesToStream;
48
+ class MaxSizeChecker extends stream_1.Transform {
49
+ constructor(maxSize, createError) {
50
+ super();
51
+ Object.defineProperty(this, "maxSize", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: maxSize
56
+ });
57
+ Object.defineProperty(this, "createError", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: createError
62
+ });
63
+ Object.defineProperty(this, "totalSize", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: 0
68
+ });
69
+ }
70
+ _transform(chunk, _enc, cb) {
71
+ this.totalSize += chunk.length;
72
+ if (this.totalSize > this.maxSize) {
73
+ cb(this.createError());
74
+ }
75
+ else {
76
+ cb(null, chunk);
77
+ }
78
+ }
79
+ }
80
+ exports.MaxSizeChecker = MaxSizeChecker;
81
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"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"}
package/jest.config.js CHANGED
@@ -1,6 +1,6 @@
1
- const base = require('../../jest.config.base.js')
2
-
1
+ /** @type {import('jest').Config} */
3
2
  module.exports = {
4
- ...base,
5
3
  displayName: 'Common',
4
+ transform: { '^.+\\.(t|j)s$': '@swc/jest' },
5
+ setupFiles: ['<rootDir>/../../jest.setup.ts'],
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/common",
3
- "version": "0.3.4",
3
+ "version": "0.4.1",
4
4
  "license": "MIT",
5
5
  "description": "Shared web-platform-friendly code for atproto libraries",
6
6
  "keywords": [
@@ -13,20 +13,22 @@
13
13
  "directory": "packages/common"
14
14
  },
15
15
  "main": "dist/index.js",
16
+ "types": "dist/index.d.ts",
16
17
  "dependencies": {
17
18
  "@ipld/dag-cbor": "^7.0.3",
18
19
  "cbor-x": "^1.5.1",
19
20
  "iso-datestring-validator": "^2.2.2",
20
21
  "multiformats": "^9.9.0",
21
- "pino": "^8.15.0",
22
- "zod": "3.21.4",
23
- "@atproto/common-web": "^0.2.4"
22
+ "pino": "^8.21.0",
23
+ "@atproto/common-web": "^0.3.0"
24
+ },
25
+ "devDependencies": {
26
+ "jest": "^28.1.2",
27
+ "typescript": "^5.3.3",
28
+ "uint8arrays": "3.0.0"
24
29
  },
25
30
  "scripts": {
26
31
  "test": "jest",
27
- "build": "node ./build.js",
28
- "postbuild": "tsc --build tsconfig.build.json",
29
- "update-main-to-dist": "node ../../update-main-to-dist.js packages/common"
30
- },
31
- "types": "dist/index.d.ts"
32
+ "build": "tsc --build tsconfig.build.json"
33
+ }
32
34
  }
package/src/index.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export * from '@atproto/common-web'
2
+ export * from './buffers'
2
3
  export * from './dates'
3
4
  export * from './env'
4
5
  export * from './fs'
5
6
  export * from './ipld'
6
7
  export * from './ipld-multi'
7
8
  export * from './logger'
9
+ export * from './obfuscate'
8
10
  export * from './streams'
9
- export * from './buffers'
package/src/ipld.ts CHANGED
@@ -92,7 +92,10 @@ export class VerifyCidTransform extends Transform {
92
92
  }
93
93
 
94
94
  export class VerifyCidError extends Error {
95
- constructor(public expected: CID, public actual: CID) {
95
+ constructor(
96
+ public expected: CID,
97
+ public actual: CID,
98
+ ) {
96
99
  super('Bad cid check')
97
100
  }
98
101
  }
@@ -0,0 +1,85 @@
1
+ export function obfuscateEmail(email: string) {
2
+ const [local, domain] = email.split('@')
3
+ return `${obfuscateWord(local)}@${obfuscateWord(domain)}`
4
+ }
5
+
6
+ export function obfuscateWord(word: string) {
7
+ return `${word.charAt(0)}***${word.charAt(word.length - 1)}`
8
+ }
9
+
10
+ export function obfuscateHeaders(headers: Record<string, string>) {
11
+ const obfuscatedHeaders: Record<string, string> = {}
12
+ for (const key in headers) {
13
+ if (key.toLowerCase() === 'authorization') {
14
+ obfuscatedHeaders[key] = obfuscateAuthHeader(headers[key])
15
+ } else if (key.toLowerCase() === 'dpop') {
16
+ obfuscatedHeaders[key] = obfuscateJwt(headers[key]) || 'Invalid'
17
+ } else {
18
+ obfuscatedHeaders[key] = headers[key]
19
+ }
20
+ }
21
+ return obfuscatedHeaders
22
+ }
23
+
24
+ export function obfuscateAuthHeader(authHeader: string): string {
25
+ // This is a hot path (runs on every request). Avoid using split() or regex.
26
+
27
+ const spaceIdx = authHeader.indexOf(' ')
28
+ if (spaceIdx === -1) return 'Invalid'
29
+
30
+ const type = authHeader.slice(0, spaceIdx)
31
+ switch (type.toLowerCase()) {
32
+ case 'bearer':
33
+ case 'dpop':
34
+ return `${type} ${obfuscateBearer(authHeader.slice(spaceIdx + 1))}`
35
+ case 'basic':
36
+ return `${type} ${obfuscateBasic(authHeader.slice(spaceIdx + 1)) || 'Invalid'}`
37
+ default:
38
+ return `Invalid`
39
+ }
40
+ }
41
+
42
+ export function obfuscateBasic(token: string): null | string {
43
+ if (!token) return null
44
+ const buffer = Buffer.from(token, 'base64')
45
+ if (!buffer.length) return null // Buffer.from will silently ignore invalid base64 chars
46
+ const authHeader = buffer.toString('utf8')
47
+ const colIdx = authHeader.indexOf(':')
48
+ if (colIdx === -1) return null
49
+ const username = authHeader.slice(0, colIdx)
50
+ return `${username}:***`
51
+ }
52
+
53
+ export function obfuscateBearer(token: string): string {
54
+ return obfuscateJwt(token) || obfuscateToken(token)
55
+ }
56
+
57
+ export function obfuscateToken(token: string): string {
58
+ if (token.length >= 12) return obfuscateWord(token)
59
+ return token ? '***' : ''
60
+ }
61
+
62
+ export function obfuscateJwt(token: string): null | string {
63
+ const firstDot = token.indexOf('.')
64
+ if (firstDot === -1) return null
65
+
66
+ const secondDot = token.indexOf('.', firstDot + 1)
67
+ if (secondDot === -1) return null
68
+
69
+ // Expected to be missing
70
+ const thirdDot = token.indexOf('.', secondDot + 1)
71
+ if (thirdDot !== -1) return null
72
+
73
+ try {
74
+ const payloadEnc = token.slice(firstDot + 1, secondDot)
75
+ const payloadJson = Buffer.from(payloadEnc, 'base64').toString('utf8')
76
+ const payload = JSON.parse(payloadJson)
77
+ if (typeof payload.sub === 'string') return payload.sub
78
+ } catch {
79
+ // Invalid JWT
80
+ return null
81
+ }
82
+
83
+ // Strip the signature
84
+ return token.slice(0, secondDot) + '.obfuscated'
85
+ }