@certik/skynet 0.22.1 → 0.22.3
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.
- package/CHANGELOG.md +8 -0
- package/build.ts +23 -0
- package/dist/abi.d.ts +1 -2
- package/dist/abi.js +569 -563
- package/dist/address.d.ts +0 -1
- package/dist/address.js +22 -21
- package/dist/api.d.ts +0 -1
- package/dist/api.js +235 -120
- package/dist/app.d.ts +1 -2
- package/dist/app.js +2030 -276
- package/dist/availability.d.ts +0 -1
- package/dist/availability.js +126 -56
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +28 -24
- package/dist/const.d.ts +0 -1
- package/dist/const.js +153 -132
- package/dist/databricks.d.ts +0 -1
- package/dist/databricks.js +198 -58
- package/dist/date.d.ts +0 -1
- package/dist/date.js +48 -21
- package/dist/deploy.d.ts +0 -1
- package/dist/deploy.js +427 -292
- package/dist/dynamodb.d.ts +3 -4
- package/dist/dynamodb.js +432 -281
- package/dist/env.d.ts +2 -3
- package/dist/env.js +16 -9
- package/dist/graphql.d.ts +0 -1
- package/dist/graphql.js +26 -23
- package/dist/indexer.d.ts +0 -1
- package/dist/indexer.js +1050 -441
- package/dist/log.d.ts +0 -1
- package/dist/log.js +53 -52
- package/dist/object-hash.d.ts +0 -1
- package/dist/object-hash.js +49 -59
- package/dist/opsgenie.d.ts +97 -19
- package/dist/opsgenie.js +35 -30
- package/dist/por.d.ts +0 -1
- package/dist/por.js +113 -123
- package/dist/s3.d.ts +7 -8
- package/dist/s3.js +103 -91
- package/dist/search.d.ts +0 -1
- package/dist/search.js +100 -25
- package/dist/selector.d.ts +0 -1
- package/dist/selector.js +34 -38
- package/dist/slack.d.ts +0 -1
- package/dist/slack.js +27 -21
- package/dist/util.d.ts +0 -1
- package/dist/util.js +21 -20
- package/examples/api.ts +1 -1
- package/examples/indexer.ts +1 -1
- package/examples/mode-indexer.ts +1 -1
- package/package.json +4 -3
- package/{graphql.ts → src/graphql.ts} +1 -1
- package/src/opsgenie.ts +176 -0
- package/tsconfig.build.json +2 -5
- package/tsconfig.json +11 -20
- package/dist/abi.d.ts.map +0 -1
- package/dist/address.d.ts.map +0 -1
- package/dist/api.d.ts.map +0 -1
- package/dist/app.d.ts.map +0 -1
- package/dist/availability.d.ts.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/const.d.ts.map +0 -1
- package/dist/databricks.d.ts.map +0 -1
- package/dist/date.d.ts.map +0 -1
- package/dist/deploy.d.ts.map +0 -1
- package/dist/dynamodb.d.ts.map +0 -1
- package/dist/env.d.ts.map +0 -1
- package/dist/graphql.d.ts.map +0 -1
- package/dist/indexer.d.ts.map +0 -1
- package/dist/log.d.ts.map +0 -1
- package/dist/object-hash.d.ts.map +0 -1
- package/dist/opsgenie.d.ts.map +0 -1
- package/dist/por.d.ts.map +0 -1
- package/dist/s3.d.ts.map +0 -1
- package/dist/search.d.ts.map +0 -1
- package/dist/selector.d.ts.map +0 -1
- package/dist/slack.d.ts.map +0 -1
- package/dist/util.d.ts.map +0 -1
- package/opsgenie.ts +0 -69
- /package/{abi.ts → src/abi.ts} +0 -0
- /package/{address.ts → src/address.ts} +0 -0
- /package/{api.ts → src/api.ts} +0 -0
- /package/{app.ts → src/app.ts} +0 -0
- /package/{availability.ts → src/availability.ts} +0 -0
- /package/{cli.ts → src/cli.ts} +0 -0
- /package/{const.ts → src/const.ts} +0 -0
- /package/{databricks.ts → src/databricks.ts} +0 -0
- /package/{date.ts → src/date.ts} +0 -0
- /package/{deploy.ts → src/deploy.ts} +0 -0
- /package/{dynamodb.ts → src/dynamodb.ts} +0 -0
- /package/{env.ts → src/env.ts} +0 -0
- /package/{indexer.ts → src/indexer.ts} +0 -0
- /package/{log.ts → src/log.ts} +0 -0
- /package/{object-hash.ts → src/object-hash.ts} +0 -0
- /package/{por.ts → src/por.ts} +0 -0
- /package/{s3.ts → src/s3.ts} +0 -0
- /package/{search.ts → src/search.ts} +0 -0
- /package/{selector.ts → src/selector.ts} +0 -0
- /package/{slack.ts → src/slack.ts} +0 -0
- /package/{util.ts → src/util.ts} +0 -0
package/dist/por.js
CHANGED
|
@@ -1,130 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
// src/por.ts
|
|
3
|
+
var {CryptoHasher } = globalThis.Bun;
|
|
4
|
+
|
|
5
|
+
class MerkleTreePoR {
|
|
6
|
+
leaves = [];
|
|
7
|
+
tree = [];
|
|
8
|
+
userMap = new Map;
|
|
9
|
+
userData = [];
|
|
10
|
+
hashFunction;
|
|
11
|
+
constructor(users, hashFunction) {
|
|
12
|
+
this.userData = [...users];
|
|
13
|
+
this.hashFunction = hashFunction || this.defaultSHA256Hash;
|
|
14
|
+
this.buildTree();
|
|
15
|
+
}
|
|
16
|
+
static defaultSHA256Hash(data) {
|
|
17
|
+
const hasher = new CryptoHasher("sha256");
|
|
18
|
+
hasher.update(data);
|
|
19
|
+
return hasher.digest("hex");
|
|
20
|
+
}
|
|
21
|
+
defaultSHA256Hash(data) {
|
|
22
|
+
return MerkleTreePoR.defaultSHA256Hash(data);
|
|
23
|
+
}
|
|
24
|
+
hash(data) {
|
|
25
|
+
return this.hashFunction(data);
|
|
26
|
+
}
|
|
27
|
+
createLeafHash(user) {
|
|
28
|
+
const leafData = `${user.userHash}:${user.balance}:${user.token || ""}`;
|
|
29
|
+
return this.hash(leafData);
|
|
30
|
+
}
|
|
31
|
+
buildTree() {
|
|
32
|
+
if (this.userData.length === 0) {
|
|
33
|
+
throw new Error("Cannot build tree with empty user data");
|
|
11
34
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
// Create leaf hashes and store user mapping
|
|
35
|
-
this.leaves = this.userData.map((user, index) => {
|
|
36
|
-
const leafHash = this.createLeafHash(user);
|
|
37
|
-
this.userMap.set(`${user.userHash}:${user.token || ''}`, index);
|
|
38
|
-
return leafHash;
|
|
35
|
+
this.leaves = this.userData.map((user, index) => {
|
|
36
|
+
const leafHash = this.createLeafHash(user);
|
|
37
|
+
this.userMap.set(`${user.userHash}:${user.token || ""}`, index);
|
|
38
|
+
return leafHash;
|
|
39
|
+
});
|
|
40
|
+
let currentLevel = this.leaves;
|
|
41
|
+
this.tree.push(currentLevel.map((hash) => ({ hash })));
|
|
42
|
+
while (currentLevel.length > 1) {
|
|
43
|
+
const nextLevel = [];
|
|
44
|
+
const nextLevelNodes = [];
|
|
45
|
+
for (let i = 0;i < currentLevel.length; i += 2) {
|
|
46
|
+
const left = currentLevel[i];
|
|
47
|
+
const right = i + 1 < currentLevel.length ? currentLevel[i + 1] : left;
|
|
48
|
+
const parentHash = this.hash(left + right);
|
|
49
|
+
nextLevel.push(parentHash);
|
|
50
|
+
const leftNode = this.tree[this.tree.length - 1][i];
|
|
51
|
+
const rightNode = i + 1 < currentLevel.length ? this.tree[this.tree.length - 1][i + 1] : leftNode;
|
|
52
|
+
nextLevelNodes.push({
|
|
53
|
+
hash: parentHash,
|
|
54
|
+
left: leftNode,
|
|
55
|
+
right: rightNode
|
|
39
56
|
});
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const left = currentLevel[i];
|
|
49
|
-
const right = i + 1 < currentLevel.length
|
|
50
|
-
? currentLevel[i + 1]
|
|
51
|
-
: left; // Duplicate if odd number
|
|
52
|
-
const parentHash = this.hash(left + right);
|
|
53
|
-
nextLevel.push(parentHash);
|
|
54
|
-
const leftNode = this.tree[this.tree.length - 1][i];
|
|
55
|
-
const rightNode = i + 1 < currentLevel.length
|
|
56
|
-
? this.tree[this.tree.length - 1][i + 1]
|
|
57
|
-
: leftNode;
|
|
58
|
-
nextLevelNodes.push({
|
|
59
|
-
hash: parentHash,
|
|
60
|
-
left: leftNode,
|
|
61
|
-
right: rightNode
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
currentLevel = nextLevel;
|
|
65
|
-
this.tree.push(nextLevelNodes);
|
|
66
|
-
}
|
|
57
|
+
}
|
|
58
|
+
currentLevel = nextLevel;
|
|
59
|
+
this.tree.push(nextLevelNodes);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
getRootHash() {
|
|
63
|
+
if (this.tree.length === 0) {
|
|
64
|
+
throw new Error("Merkle tree not built");
|
|
67
65
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
return this.tree[this.tree.length - 1][0].hash;
|
|
67
|
+
}
|
|
68
|
+
generateProof(userHash, token) {
|
|
69
|
+
const key = `${userHash}:${token || ""}`;
|
|
70
|
+
const leafIndex = this.userMap.get(key);
|
|
71
|
+
if (leafIndex === undefined) {
|
|
72
|
+
throw new Error(`${userHash} not found in merkle tree for token ${token}`);
|
|
74
73
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if (siblingIndex < currentLevelSize) {
|
|
92
|
-
proof.push(this.tree[level][siblingIndex].hash);
|
|
93
|
-
positions.push(isRightNode ? 'left' : 'right');
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
// When odd number, the last node is duplicated
|
|
97
|
-
proof.push(this.tree[level][currentIndex].hash);
|
|
98
|
-
positions.push(isRightNode ? 'left' : 'right');
|
|
99
|
-
}
|
|
100
|
-
currentIndex = Math.floor(currentIndex / 2);
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
userHash: user.userHash,
|
|
104
|
-
balance: user.balance,
|
|
105
|
-
token: user.token,
|
|
106
|
-
proof,
|
|
107
|
-
positions,
|
|
108
|
-
rootHash: this.getRootHash(),
|
|
109
|
-
leafIndex,
|
|
110
|
-
hashFunction: this.hashFunction !== this.defaultSHA256Hash ? this.hashFunction : undefined
|
|
111
|
-
};
|
|
74
|
+
const user = this.userData[leafIndex];
|
|
75
|
+
const proof = [];
|
|
76
|
+
const positions = [];
|
|
77
|
+
let currentIndex = leafIndex;
|
|
78
|
+
for (let level = 0;level < this.tree.length - 1; level++) {
|
|
79
|
+
const currentLevelSize = this.tree[level].length;
|
|
80
|
+
const isRightNode = currentIndex % 2 === 1;
|
|
81
|
+
const siblingIndex = isRightNode ? currentIndex - 1 : currentIndex + 1;
|
|
82
|
+
if (siblingIndex < currentLevelSize) {
|
|
83
|
+
proof.push(this.tree[level][siblingIndex].hash);
|
|
84
|
+
positions.push(isRightNode ? "left" : "right");
|
|
85
|
+
} else {
|
|
86
|
+
proof.push(this.tree[level][currentIndex].hash);
|
|
87
|
+
positions.push(isRightNode ? "left" : "right");
|
|
88
|
+
}
|
|
89
|
+
currentIndex = Math.floor(currentIndex / 2);
|
|
112
90
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
91
|
+
return {
|
|
92
|
+
userHash: user.userHash,
|
|
93
|
+
balance: user.balance,
|
|
94
|
+
token: user.token,
|
|
95
|
+
proof,
|
|
96
|
+
positions,
|
|
97
|
+
rootHash: this.getRootHash(),
|
|
98
|
+
leafIndex,
|
|
99
|
+
hashFunction: this.hashFunction !== this.defaultSHA256Hash ? this.hashFunction : undefined
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
static verifyProof(merkleProof) {
|
|
103
|
+
const leafData = `${merkleProof.userHash}:${merkleProof.balance}:${merkleProof.token || ""}`;
|
|
104
|
+
const hashFunction = merkleProof.hashFunction || MerkleTreePoR.defaultSHA256Hash;
|
|
105
|
+
let currentHash = hashFunction(leafData);
|
|
106
|
+
for (let i = 0;i < merkleProof.proof.length; i++) {
|
|
107
|
+
const siblingHash = merkleProof.proof[i];
|
|
108
|
+
const position = merkleProof.positions[i];
|
|
109
|
+
if (position === "left") {
|
|
110
|
+
currentHash = hashFunction(siblingHash + currentHash);
|
|
111
|
+
} else {
|
|
112
|
+
currentHash = hashFunction(currentHash + siblingHash);
|
|
113
|
+
}
|
|
129
114
|
}
|
|
115
|
+
return currentHash === merkleProof.rootHash;
|
|
116
|
+
}
|
|
130
117
|
}
|
|
118
|
+
export {
|
|
119
|
+
MerkleTreePoR
|
|
120
|
+
};
|
package/dist/s3.d.ts
CHANGED
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import { S3Client, ObjectCannedACL } from "@aws-sdk/client-s3";
|
|
2
2
|
declare function getS3(forceNew?: boolean): S3Client;
|
|
3
|
-
declare function readFile(bucketName: string, key: string, verbose?: boolean): Promise<string>;
|
|
3
|
+
declare function readFile(bucketName: string, key: string, verbose?: boolean): Promise<string | null | undefined>;
|
|
4
4
|
declare function hasFile(bucketName: string, key: string): Promise<boolean>;
|
|
5
|
-
declare function getFileSize(bucketName: string, key: string): Promise<number>;
|
|
5
|
+
declare function getFileSize(bucketName: string, key: string): Promise<number | undefined>;
|
|
6
6
|
declare function writeFile(bucketName: string, key: string, body: string, options?: {
|
|
7
7
|
verbose?: boolean;
|
|
8
8
|
skipIfExists?: boolean;
|
|
9
9
|
acl?: ObjectCannedACL;
|
|
10
10
|
contentType?: string;
|
|
11
11
|
}): Promise<void>;
|
|
12
|
-
declare function deleteFile(bucketName: string, key: string, verbose?: boolean): Promise<
|
|
12
|
+
declare function deleteFile(bucketName: string, key: string, verbose?: boolean): Promise<null | undefined>;
|
|
13
13
|
declare function listKeys(bucketName: string, prefix?: string, continuationToken?: string): Promise<{
|
|
14
|
-
keys:
|
|
14
|
+
keys: never[];
|
|
15
15
|
continuationToken?: undefined;
|
|
16
16
|
} | {
|
|
17
|
-
keys: string[];
|
|
18
|
-
continuationToken: string;
|
|
19
|
-
}>;
|
|
17
|
+
keys: (string | undefined)[];
|
|
18
|
+
continuationToken: string | undefined;
|
|
19
|
+
} | null>;
|
|
20
20
|
export { getS3, hasFile, readFile, writeFile, deleteFile, getFileSize, listKeys };
|
|
21
|
-
//# sourceMappingURL=s3.d.ts.map
|
package/dist/s3.js
CHANGED
|
@@ -1,110 +1,122 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/s3.ts
|
|
2
|
+
import {
|
|
3
|
+
S3Client,
|
|
4
|
+
GetObjectCommand,
|
|
5
|
+
HeadObjectCommand,
|
|
6
|
+
PutObjectCommand,
|
|
7
|
+
DeleteObjectCommand,
|
|
8
|
+
ListObjectsV2Command,
|
|
9
|
+
NotFound,
|
|
10
|
+
NoSuchKey
|
|
11
|
+
} from "@aws-sdk/client-s3";
|
|
12
|
+
var _s3Client;
|
|
3
13
|
function getS3(forceNew = false) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
14
|
+
if (!_s3Client || forceNew) {
|
|
15
|
+
_s3Client = new S3Client;
|
|
16
|
+
}
|
|
17
|
+
return _s3Client;
|
|
8
18
|
}
|
|
9
19
|
async function readFile(bucketName, key, verbose = false) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// do nothing
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
throw error;
|
|
20
|
+
const s3 = getS3();
|
|
21
|
+
const params = { Bucket: bucketName, Key: key };
|
|
22
|
+
try {
|
|
23
|
+
const result = await s3.send(new GetObjectCommand(params));
|
|
24
|
+
return result.Body?.transformToString();
|
|
25
|
+
} catch (error) {
|
|
26
|
+
if (error instanceof NoSuchKey) {
|
|
27
|
+
if (verbose) {
|
|
28
|
+
console.log("no such bucket or key", bucketName, key);
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
25
31
|
}
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
26
34
|
}
|
|
27
35
|
async function hasFile(bucketName, key) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
throw headErr;
|
|
36
|
+
const s3 = getS3();
|
|
37
|
+
try {
|
|
38
|
+
await s3.send(new HeadObjectCommand({ Bucket: bucketName, Key: key }));
|
|
39
|
+
return true;
|
|
40
|
+
} catch (headErr) {
|
|
41
|
+
if (headErr instanceof NotFound) {
|
|
42
|
+
return false;
|
|
38
43
|
}
|
|
44
|
+
throw headErr;
|
|
45
|
+
}
|
|
39
46
|
}
|
|
40
47
|
async function getFileSize(bucketName, key) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
const s3 = getS3();
|
|
49
|
+
const result = await s3.send(new HeadObjectCommand({
|
|
50
|
+
Bucket: bucketName,
|
|
51
|
+
Key: key
|
|
52
|
+
}));
|
|
53
|
+
return result.ContentLength;
|
|
47
54
|
}
|
|
48
55
|
async function writeFile(bucketName, key, body, options = {}) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
const verbose = options.verbose || false;
|
|
56
|
-
const params = { Bucket: bucketName, Key: key, Body: body };
|
|
57
|
-
if (options.acl) {
|
|
58
|
-
params.ACL = options.acl;
|
|
59
|
-
}
|
|
60
|
-
if (options.contentType) {
|
|
61
|
-
params.ContentType = options.contentType;
|
|
56
|
+
const s3 = getS3();
|
|
57
|
+
if (options.skipIfExists) {
|
|
58
|
+
if (await hasFile(bucketName, key)) {
|
|
59
|
+
return;
|
|
62
60
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
61
|
+
}
|
|
62
|
+
const verbose = options.verbose || false;
|
|
63
|
+
const params = { Bucket: bucketName, Key: key, Body: body };
|
|
64
|
+
if (options.acl) {
|
|
65
|
+
params.ACL = options.acl;
|
|
66
|
+
}
|
|
67
|
+
if (options.contentType) {
|
|
68
|
+
params.ContentType = options.contentType;
|
|
69
|
+
}
|
|
70
|
+
if (verbose) {
|
|
71
|
+
console.log("uploading", key);
|
|
72
|
+
}
|
|
73
|
+
await s3.send(new PutObjectCommand(params));
|
|
67
74
|
}
|
|
68
75
|
async function deleteFile(bucketName, key, verbose = false) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
// do nothing
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
throw error;
|
|
76
|
+
const s3 = getS3();
|
|
77
|
+
const params = { Bucket: bucketName, Key: key };
|
|
78
|
+
try {
|
|
79
|
+
await s3.send(new DeleteObjectCommand(params));
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (error instanceof NoSuchKey) {
|
|
82
|
+
if (verbose) {
|
|
83
|
+
console.log("no such bucket or key", bucketName, key);
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
83
86
|
}
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
84
89
|
}
|
|
85
90
|
async function listKeys(bucketName, prefix, continuationToken) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
throw `unable to list keys with prefix ${prefix}: ${err}`;
|
|
101
|
-
}
|
|
102
|
-
if (!data.Contents) {
|
|
103
|
-
return { keys: [] };
|
|
91
|
+
const s3 = getS3();
|
|
92
|
+
const params = {
|
|
93
|
+
Bucket: bucketName,
|
|
94
|
+
Prefix: prefix,
|
|
95
|
+
ContinuationToken: continuationToken
|
|
96
|
+
};
|
|
97
|
+
let data;
|
|
98
|
+
try {
|
|
99
|
+
data = await s3.send(new ListObjectsV2Command(params));
|
|
100
|
+
} catch (err) {
|
|
101
|
+
if (err instanceof Error && "statusCode" in err && err.statusCode === 400) {
|
|
102
|
+
return null;
|
|
104
103
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
};
|
|
104
|
+
throw `unable to list keys with prefix ${prefix}: ${err}`;
|
|
105
|
+
}
|
|
106
|
+
if (!data.Contents) {
|
|
107
|
+
return { keys: [] };
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
keys: data.Contents.map(({ Key }) => Key),
|
|
111
|
+
continuationToken: data.IsTruncated ? data.NextContinuationToken : undefined
|
|
112
|
+
};
|
|
109
113
|
}
|
|
110
|
-
export {
|
|
114
|
+
export {
|
|
115
|
+
writeFile,
|
|
116
|
+
readFile,
|
|
117
|
+
listKeys,
|
|
118
|
+
hasFile,
|
|
119
|
+
getS3,
|
|
120
|
+
getFileSize,
|
|
121
|
+
deleteFile
|
|
122
|
+
};
|
package/dist/search.d.ts
CHANGED
package/dist/search.js
CHANGED
|
@@ -1,30 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// src/env.ts
|
|
2
|
+
function ensureAndGet(envName, defaultValue) {
|
|
3
|
+
return process.env[envName] || defaultValue;
|
|
4
|
+
}
|
|
5
|
+
function getEnvironment() {
|
|
6
|
+
return ensureAndGet("SKYNET_ENVIRONMENT", "dev");
|
|
7
|
+
}
|
|
8
|
+
function getEnvOrThrow(envName) {
|
|
9
|
+
if (!process.env[envName]) {
|
|
10
|
+
throw new Error(`Must set environment variable ${envName}`);
|
|
11
|
+
}
|
|
12
|
+
return process.env[envName];
|
|
13
|
+
}
|
|
14
|
+
function isProduction() {
|
|
15
|
+
return getEnvironment() === "prd";
|
|
16
|
+
}
|
|
17
|
+
function isDev() {
|
|
18
|
+
return getEnvironment() === "dev";
|
|
19
|
+
}
|
|
20
|
+
// src/log.ts
|
|
21
|
+
function isObject(a) {
|
|
22
|
+
return !!a && a.constructor === Object;
|
|
23
|
+
}
|
|
24
|
+
function print(o) {
|
|
25
|
+
if (Array.isArray(o)) {
|
|
26
|
+
return `[${o.map(print).join(", ")}]`;
|
|
27
|
+
}
|
|
28
|
+
if (isObject(o)) {
|
|
29
|
+
return `{${Object.keys(o).map((k) => `${k}: ${o[k]}`).join(", ")}}`;
|
|
30
|
+
}
|
|
31
|
+
return `${o}`;
|
|
32
|
+
}
|
|
33
|
+
function getLine(params) {
|
|
34
|
+
let line = "";
|
|
35
|
+
for (let i = 0, l = params.length;i < l; i++) {
|
|
36
|
+
line += `${print(params[i])} `.replace(/\n/gm, "\t");
|
|
37
|
+
}
|
|
38
|
+
return line.trim();
|
|
39
|
+
}
|
|
40
|
+
function timestamp() {
|
|
41
|
+
return new Date().toISOString();
|
|
42
|
+
}
|
|
43
|
+
var inline = {
|
|
44
|
+
debug: function(...args) {
|
|
45
|
+
if (true) {
|
|
46
|
+
console.log(`${timestamp()} ${getLine(args)}`);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
log: function(...args) {
|
|
50
|
+
if (true) {
|
|
51
|
+
console.log(`${timestamp()} ${getLine(args)}`);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
error: function(...args) {
|
|
55
|
+
if (true) {
|
|
56
|
+
console.error(`${timestamp()} ${getLine(args)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
var logger = {
|
|
61
|
+
debug: function(...args) {
|
|
62
|
+
if (true) {
|
|
63
|
+
console.log(`[${timestamp()}]`, ...args);
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
log: function(...args) {
|
|
67
|
+
if (true) {
|
|
68
|
+
console.log(`[${timestamp()}]`, ...args);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
error: function(...args) {
|
|
72
|
+
if (true) {
|
|
73
|
+
console.error(`[${timestamp()}]`, ...args);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
// src/search.ts
|
|
3
78
|
import { Client, HttpConnection } from "@elastic/elasticsearch";
|
|
4
79
|
import osModule from "os";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
80
|
+
async function sendToSearch(indexPrefix, record, throws = false) {
|
|
81
|
+
if (!process.env["SKYNET_ELASTICSEARCH_CLOUD_ID"] || !process.env["SKYNET_ELASTICSEARCH_API_KEY"]) {
|
|
82
|
+
throw new Error("SKYNET_ELASTICSEARCH_CLOUD_ID or SKYNET_ELASTICSEARCH_API_KEY is not set");
|
|
83
|
+
}
|
|
84
|
+
const client = new Client({
|
|
85
|
+
cloud: { id: process.env["SKYNET_ELASTICSEARCH_CLOUD_ID"] },
|
|
86
|
+
auth: { apiKey: process.env["SKYNET_ELASTICSEARCH_API_KEY"] },
|
|
87
|
+
Connection: HttpConnection
|
|
88
|
+
});
|
|
89
|
+
const now = new Date;
|
|
90
|
+
const indexName = [indexPrefix, isProduction() ? "prod" : "dev", now.toISOString().slice(0, 7)].join("-");
|
|
91
|
+
try {
|
|
92
|
+
await client.index({
|
|
93
|
+
index: indexName,
|
|
94
|
+
document: { instance: osModule.hostname(), timestamp: now, record }
|
|
13
95
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
try {
|
|
19
|
-
await client.index({
|
|
20
|
-
index: indexName,
|
|
21
|
-
document: { instance: osModule.hostname(), timestamp: now, record },
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
inline.error(err);
|
|
26
|
-
if (throws) {
|
|
27
|
-
throw err;
|
|
28
|
-
}
|
|
96
|
+
} catch (err) {
|
|
97
|
+
inline.error(err);
|
|
98
|
+
if (throws) {
|
|
99
|
+
throw err;
|
|
29
100
|
}
|
|
101
|
+
}
|
|
30
102
|
}
|
|
103
|
+
export {
|
|
104
|
+
sendToSearch
|
|
105
|
+
};
|
package/dist/selector.d.ts
CHANGED
|
@@ -15,4 +15,3 @@ declare function getSelectorFlags<TSelector extends Selector>(selector: Selector
|
|
|
15
15
|
declare function toSelectorString<TSelector extends Selector>(selectorFlags: SelectorFlags<TSelector>, delim?: string): string;
|
|
16
16
|
declare function getJobName<TSelector extends Selector>(name: string, selectorFlags: SelectorFlags<TSelector>, mode?: string): string;
|
|
17
17
|
export { getJobName, getSelectorDesc, getSelectorFlags, toSelectorString };
|
|
18
|
-
//# sourceMappingURL=selector.d.ts.map
|