Skip to content

Commit 7cb5bc9

Browse files
committed
Break the records scripts into different lambdas
1 parent 6432c7f commit 7cb5bc9

File tree

3 files changed

+125
-33
lines changed

3 files changed

+125
-33
lines changed

serverless.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,18 @@ functions:
207207
enabled: ${self:custom.scheduleEnabled.${self:provider.stage}}
208208
# 3am UTC every sunday (giving the dump plenty of time to complete)
209209
schedule: cron(0 3 ? * 1 *)
210+
records-manifest:
211+
handler: utils/records-manifest.handler
212+
description: Generates manifest file for records bucket
213+
timeout: 900
214+
memorySize: 10240
215+
events:
216+
- eventBridge:
217+
name: abstractplay-${self:provider.stage}-records-manifest
218+
description: Generates static time-to-move results of each game
219+
enabled: ${self:custom.scheduleEnabled.${self:provider.stage}}
220+
# 4am UTC every sunday (giving the various records scripts time to complete)
221+
schedule: cron(0 4 ? * 1 *)
210222
summarize:
211223
handler: utils/summarize.handler
212224
description: Summarize generated game reports

utils/records-manifest.ts

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
'use strict';
2+
3+
import { S3Client, GetObjectCommand, ListObjectsV2Command, PutObjectCommand, type _Object } from "@aws-sdk/client-s3";
4+
import { Handler } from "aws-lambda";
5+
import { GameFactory } from '@abstractplay/gameslib';
6+
import { type APGameRecord } from '@abstractplay/recranks';
7+
import { gunzipSync, strFromU8 } from "fflate";
8+
import { load } from "ion-js";
9+
10+
const REGION = "us-east-1";
11+
const s3 = new S3Client({region: REGION});
12+
const DUMP_BUCKET = "abstractplay-db-dump";
13+
const REC_BUCKET = "records.abstractplay.com";
14+
15+
type BasicRec = {
16+
Item: {
17+
pk: string;
18+
sk: string;
19+
[key: string]: any;
20+
}
21+
}
22+
23+
type GameRec = {
24+
pk: string;
25+
sk: string;
26+
id: string;
27+
metaGame: string;
28+
state: string;
29+
pieInvoked?: boolean;
30+
players: {
31+
name: string;
32+
id: string;
33+
time: number;
34+
}[];
35+
tournament?: string;
36+
event?: string;
37+
[key: string]: any;
38+
}
39+
40+
type Tournament = {
41+
pk: string;
42+
sk: string;
43+
id: string;
44+
metaGame: string;
45+
variants: string[];
46+
number: number;
47+
started: boolean;
48+
dateCreated: number;
49+
datePreviousEnded: number; // 0 means either the first tournament or a restart of the series (after it stopped because not enough participants), 3000000000000 means previous tournament still running.
50+
[key: string]: any;
51+
};
52+
53+
type OrgEvent = {
54+
pk: "ORGEVENT";
55+
sk: string; // <eventid>
56+
name: string;
57+
description: string;
58+
organizer: string;
59+
dateStart: number;
60+
dateEnd?: number;
61+
winner?: string[];
62+
visible: boolean;
63+
}
64+
65+
type OrgEventGame = {
66+
pk: "ORGEVENTGAME";
67+
sk: string; // <eventid>#<gameid>
68+
metaGame: string;
69+
variants?: string[];
70+
round: number;
71+
gameid: string;
72+
player1: string;
73+
player2: string;
74+
winner?: number[];
75+
arbitrated?: boolean;
76+
};
77+
78+
export const handler: Handler = async (event: any, context?: any) => {
79+
// generate file listing
80+
const recListCmd = new ListObjectsV2Command({
81+
Bucket: REC_BUCKET,
82+
});
83+
84+
const recList: _Object[] = [];
85+
try {
86+
let isTruncatedOuter = true;
87+
88+
while (isTruncatedOuter) {
89+
const { Contents, IsTruncated: IsTruncatedInner, NextContinuationToken } =
90+
await s3.send(recListCmd);
91+
if (Contents === undefined) {
92+
throw new Error(`Could not list the bucket contents`);
93+
}
94+
recList.push(...Contents);
95+
isTruncatedOuter = IsTruncatedInner || false;
96+
recListCmd.input.ContinuationToken = NextContinuationToken;
97+
}
98+
} catch (err) {
99+
console.error(err);
100+
}
101+
const cmd = new PutObjectCommand({
102+
Bucket: REC_BUCKET,
103+
Key: `_manifest.json`,
104+
Body: JSON.stringify(recList),
105+
});
106+
const response = await s3.send(cmd);
107+
if (response["$metadata"].httpStatusCode !== 200) {
108+
console.log(response);
109+
}
110+
console.log("Manifest generated");
111+
112+
console.log("ALL DONE");
113+
};

utils/records.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -277,38 +277,5 @@ export const handler: Handler = async (event: any, context?: any) => {
277277
}
278278
console.log("Event recs done");
279279

280-
// generate file listing
281-
const recListCmd = new ListObjectsV2Command({
282-
Bucket: REC_BUCKET,
283-
});
284-
285-
const recList: _Object[] = [];
286-
try {
287-
let isTruncatedOuter = true;
288-
289-
while (isTruncatedOuter) {
290-
const { Contents, IsTruncated: IsTruncatedInner, NextContinuationToken } =
291-
await s3.send(recListCmd);
292-
if (Contents === undefined) {
293-
throw new Error(`Could not list the bucket contents`);
294-
}
295-
recList.push(...Contents);
296-
isTruncatedOuter = IsTruncatedInner || false;
297-
command.input.ContinuationToken = NextContinuationToken;
298-
}
299-
} catch (err) {
300-
console.error(err);
301-
}
302-
cmd = new PutObjectCommand({
303-
Bucket: REC_BUCKET,
304-
Key: `_manifest.json`,
305-
Body: JSON.stringify(recList),
306-
});
307-
response = await s3.send(cmd);
308-
if (response["$metadata"].httpStatusCode !== 200) {
309-
console.log(response);
310-
}
311-
console.log("Manifest generated");
312-
313280
console.log("ALL DONE");
314281
};

0 commit comments

Comments
 (0)