@devtion/backend 0.0.0-f3ea056 → 0.0.0-f7df5e1
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/README.md +5 -5
- package/dist/src/functions/index.js +98 -83
- package/dist/src/functions/index.mjs +101 -86
- package/dist/types/functions/ceremony.d.ts.map +1 -1
- package/dist/types/functions/circuit.d.ts.map +1 -1
- package/dist/types/functions/storage.d.ts.map +1 -1
- package/dist/types/functions/user.d.ts.map +1 -1
- package/dist/types/lib/errors.d.ts +1 -0
- package/dist/types/lib/errors.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/functions/ceremony.ts +5 -1
- package/src/functions/circuit.ts +115 -110
- package/src/functions/participant.ts +7 -7
- package/src/functions/storage.ts +4 -2
- package/src/functions/user.ts +16 -6
- package/src/lib/errors.ts +5 -0
- package/src/lib/utils.ts +2 -2
package/src/functions/circuit.ts
CHANGED
|
@@ -58,6 +58,7 @@ import {
|
|
|
58
58
|
uploadFileToBucket
|
|
59
59
|
} from "../lib/utils"
|
|
60
60
|
import { EC2Client } from "@aws-sdk/client-ec2"
|
|
61
|
+
import { HttpsError } from "firebase-functions/v2/https"
|
|
61
62
|
|
|
62
63
|
dotenv.config()
|
|
63
64
|
|
|
@@ -214,57 +215,71 @@ const coordinate = async (
|
|
|
214
215
|
* Wait until the command has completed its execution inside the VM.
|
|
215
216
|
* @dev this method implements a custom interval to check 5 times after 1 minute if the command execution
|
|
216
217
|
* has been completed or not by calling the `retrieveCommandStatus` method.
|
|
217
|
-
* @param {any} resolve the promise.
|
|
218
|
-
* @param {any} reject the promise.
|
|
219
218
|
* @param {SSMClient} ssm the SSM client.
|
|
220
219
|
* @param {string} vmInstanceId the unique identifier of the VM instance.
|
|
221
220
|
* @param {string} commandId the unique identifier of the VM command.
|
|
222
221
|
* @returns <Promise<void>> true when the command execution succeed; otherwise false.
|
|
223
222
|
*/
|
|
224
|
-
const waitForVMCommandExecution = (
|
|
225
|
-
resolve
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
223
|
+
const waitForVMCommandExecution = (ssm: SSMClient, vmInstanceId: string, commandId: string): Promise<void> =>
|
|
224
|
+
new Promise((resolve, reject) => {
|
|
225
|
+
const poll = async () => {
|
|
226
|
+
try {
|
|
227
|
+
// Get command status.
|
|
228
|
+
const cmdStatus = await retrieveCommandStatus(ssm, vmInstanceId, commandId)
|
|
229
|
+
printLog(`Checking command ${commandId} status => ${cmdStatus}`, LogLevel.DEBUG)
|
|
230
|
+
|
|
231
|
+
let error: HttpsError | undefined
|
|
232
|
+
switch (cmdStatus) {
|
|
233
|
+
case CommandInvocationStatus.CANCELLING:
|
|
234
|
+
case CommandInvocationStatus.CANCELLED: {
|
|
235
|
+
error = SPECIFIC_ERRORS.SE_VM_CANCELLED_COMMAND_EXECUTION
|
|
236
|
+
break
|
|
237
|
+
}
|
|
238
|
+
case CommandInvocationStatus.DELAYED: {
|
|
239
|
+
error = SPECIFIC_ERRORS.SE_VM_DELAYED_COMMAND_EXECUTION
|
|
240
|
+
break
|
|
241
|
+
}
|
|
242
|
+
case CommandInvocationStatus.FAILED: {
|
|
243
|
+
error = SPECIFIC_ERRORS.SE_VM_FAILED_COMMAND_EXECUTION
|
|
244
|
+
break
|
|
245
|
+
}
|
|
246
|
+
case CommandInvocationStatus.TIMED_OUT: {
|
|
247
|
+
error = SPECIFIC_ERRORS.SE_VM_TIMEDOUT_COMMAND_EXECUTION
|
|
248
|
+
break
|
|
249
|
+
}
|
|
250
|
+
case CommandInvocationStatus.IN_PROGRESS:
|
|
251
|
+
case CommandInvocationStatus.PENDING: {
|
|
252
|
+
// wait a minute and poll again
|
|
253
|
+
setTimeout(poll, 60000)
|
|
254
|
+
return
|
|
255
|
+
}
|
|
256
|
+
case CommandInvocationStatus.SUCCESS: {
|
|
257
|
+
printLog(`Command ${commandId} successfully completed`, LogLevel.DEBUG)
|
|
258
|
+
|
|
259
|
+
// Resolve the promise.
|
|
260
|
+
resolve()
|
|
261
|
+
return
|
|
262
|
+
}
|
|
263
|
+
default: {
|
|
264
|
+
logAndThrowError(SPECIFIC_ERRORS.SE_VM_UNKNOWN_COMMAND_STATUS)
|
|
265
|
+
}
|
|
266
|
+
}
|
|
257
267
|
|
|
258
|
-
|
|
268
|
+
if (error) {
|
|
269
|
+
logAndThrowError(error)
|
|
270
|
+
}
|
|
271
|
+
} catch (error: any) {
|
|
272
|
+
printLog(`Invalid command ${commandId} execution`, LogLevel.DEBUG)
|
|
259
273
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
274
|
+
if (!error.toString().includes(commandId)) logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION)
|
|
275
|
+
|
|
276
|
+
// Reject the promise.
|
|
277
|
+
reject()
|
|
278
|
+
}
|
|
265
279
|
}
|
|
266
|
-
|
|
267
|
-
|
|
280
|
+
|
|
281
|
+
setTimeout(poll, 60000)
|
|
282
|
+
})
|
|
268
283
|
|
|
269
284
|
/**
|
|
270
285
|
* This method is used to coordinate the waiting queues of ceremony circuits.
|
|
@@ -286,7 +301,7 @@ const waitForVMCommandExecution = (
|
|
|
286
301
|
* - Just completed a contribution or all contributions for each circuit. If yes, coordinate (multi-participant scenario).
|
|
287
302
|
*/
|
|
288
303
|
export const coordinateCeremonyParticipant = functionsV1
|
|
289
|
-
.region(
|
|
304
|
+
.region("europe-west1")
|
|
290
305
|
.runWith({
|
|
291
306
|
memory: "512MB"
|
|
292
307
|
})
|
|
@@ -387,7 +402,6 @@ export const coordinateCeremonyParticipant = functionsV1
|
|
|
387
402
|
}
|
|
388
403
|
})
|
|
389
404
|
|
|
390
|
-
|
|
391
405
|
/**
|
|
392
406
|
* Recursive function to check whether an EC2 is in a running state
|
|
393
407
|
* @notice required step to run commands
|
|
@@ -396,16 +410,12 @@ export const coordinateCeremonyParticipant = functionsV1
|
|
|
396
410
|
* @param attempts <number> - how many times to retry before failing
|
|
397
411
|
* @returns <Promise<boolean>> - whether the VM was started
|
|
398
412
|
*/
|
|
399
|
-
const checkIfVMRunning = async (
|
|
400
|
-
ec2: EC2Client,
|
|
401
|
-
vmInstanceId: string,
|
|
402
|
-
attempts = 5
|
|
403
|
-
): Promise<boolean> => {
|
|
413
|
+
const checkIfVMRunning = async (ec2: EC2Client, vmInstanceId: string, attempts = 5): Promise<boolean> => {
|
|
404
414
|
// if we tried 5 times, then throw an error
|
|
405
415
|
if (attempts <= 0) logAndThrowError(SPECIFIC_ERRORS.SE_VM_NOT_RUNNING)
|
|
406
416
|
|
|
407
|
-
await sleep(60000)
|
|
408
|
-
const isVMRunning = await checkIfRunning(ec2, vmInstanceId)
|
|
417
|
+
await sleep(60000) // Wait for 1 min
|
|
418
|
+
const isVMRunning = await checkIfRunning(ec2, vmInstanceId)
|
|
409
419
|
|
|
410
420
|
if (!isVMRunning) {
|
|
411
421
|
printLog(`VM not running, ${attempts - 1} attempts remaining. Retrying in 1 minute...`, LogLevel.DEBUG)
|
|
@@ -442,7 +452,7 @@ const checkIfVMRunning = async (
|
|
|
442
452
|
* 2) Send all updates atomically to the Firestore database.
|
|
443
453
|
*/
|
|
444
454
|
export const verifycontribution = functionsV2.https.onCall(
|
|
445
|
-
{ memory: "16GiB", timeoutSeconds: 3600, region:
|
|
455
|
+
{ memory: "16GiB", timeoutSeconds: 3600, region: "europe-west1" },
|
|
446
456
|
async (request: functionsV2.https.CallableRequest<VerifyContributionData>): Promise<any> => {
|
|
447
457
|
if (!request.auth || (!request.auth.token.participant && !request.auth.token.coordinator))
|
|
448
458
|
logAndThrowError(SPECIFIC_ERRORS.SE_AUTH_NO_CURRENT_AUTH_USER)
|
|
@@ -610,7 +620,6 @@ export const verifycontribution = functionsV2.https.onCall(
|
|
|
610
620
|
verificationTranscriptTemporaryLocalPath,
|
|
611
621
|
true
|
|
612
622
|
)
|
|
613
|
-
|
|
614
623
|
} else {
|
|
615
624
|
// Upload verification transcript.
|
|
616
625
|
/// nb. do not use multi-part upload here due to small file size.
|
|
@@ -709,7 +718,7 @@ export const verifycontribution = functionsV2.https.onCall(
|
|
|
709
718
|
? (avgVerifyCloudFunctionTime + verifyCloudFunctionTime) / 2
|
|
710
719
|
: verifyCloudFunctionTime
|
|
711
720
|
|
|
712
|
-
// Prepare tx to update circuit average contribution/verification time.
|
|
721
|
+
// Prepare tx to update circuit average contribution/verification time.
|
|
713
722
|
const updatedCircuitDoc = await getDocumentById(getCircuitsCollectionPath(ceremonyId), circuitId)
|
|
714
723
|
const { waitingQueue: updatedWaitingQueue } = updatedCircuitDoc.data()!
|
|
715
724
|
/// @dev this must happen only for valid contributions.
|
|
@@ -783,9 +792,7 @@ export const verifycontribution = functionsV2.https.onCall(
|
|
|
783
792
|
printLog(`Starting the execution of command ${commandId}`, LogLevel.DEBUG)
|
|
784
793
|
|
|
785
794
|
// Step (1.A.3.3).
|
|
786
|
-
return
|
|
787
|
-
waitForVMCommandExecution(resolve, reject, ssm, vmInstanceId, commandId)
|
|
788
|
-
)
|
|
795
|
+
return waitForVMCommandExecution(ssm, vmInstanceId, commandId)
|
|
789
796
|
.then(async () => {
|
|
790
797
|
// Command execution successfully completed.
|
|
791
798
|
printLog(`Command ${commandId} execution has been successfully completed`, LogLevel.DEBUG)
|
|
@@ -797,59 +804,57 @@ export const verifycontribution = functionsV2.https.onCall(
|
|
|
797
804
|
|
|
798
805
|
logAndThrowError(COMMON_ERRORS.CM_INVALID_COMMAND_EXECUTION)
|
|
799
806
|
})
|
|
800
|
-
}
|
|
801
|
-
// CF approach.
|
|
802
|
-
printLog(`CF mechanism`, LogLevel.DEBUG)
|
|
807
|
+
}
|
|
803
808
|
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
)
|
|
809
|
+
// CF approach.
|
|
810
|
+
printLog(`CF mechanism`, LogLevel.DEBUG)
|
|
811
|
+
|
|
812
|
+
const potStoragePath = getPotStorageFilePath(files.potFilename)
|
|
813
|
+
const firstZkeyStoragePath = getZkeyStorageFilePath(prefix, `${prefix}_${genesisZkeyIndex}.zkey`)
|
|
814
|
+
// Prepare temporary file paths.
|
|
815
|
+
// (nb. these are needed to download the necessary artifacts for verification from AWS S3).
|
|
816
|
+
verificationTranscriptTemporaryLocalPath = createTemporaryLocalPath(verificationTranscriptCompleteFilename)
|
|
817
|
+
const potTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}.pot`)
|
|
818
|
+
const firstZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_genesis.zkey`)
|
|
819
|
+
const lastZkeyTempFilePath = createTemporaryLocalPath(`${circuitId}_${participantDoc.id}_last.zkey`)
|
|
820
|
+
|
|
821
|
+
// Create and populate transcript.
|
|
822
|
+
const transcriptLogger = createCustomLoggerForFile(verificationTranscriptTemporaryLocalPath)
|
|
823
|
+
transcriptLogger.info(
|
|
824
|
+
`${
|
|
825
|
+
isFinalizing ? `Final verification` : `Verification`
|
|
826
|
+
} transcript for ${prefix} circuit Phase 2 contribution.\n${
|
|
827
|
+
isFinalizing ? `Coordinator ` : `Contributor # ${Number(lastZkeyIndex)}`
|
|
828
|
+
} (${contributorOrCoordinatorIdentifier})\n`
|
|
829
|
+
)
|
|
824
830
|
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
}
|
|
850
|
-
|
|
851
|
-
await completeVerification()
|
|
831
|
+
// Step (1.A.2).
|
|
832
|
+
await downloadArtifactFromS3Bucket(bucketName, potStoragePath, potTempFilePath)
|
|
833
|
+
await downloadArtifactFromS3Bucket(bucketName, firstZkeyStoragePath, firstZkeyTempFilePath)
|
|
834
|
+
await downloadArtifactFromS3Bucket(bucketName, lastZkeyStoragePath, lastZkeyTempFilePath)
|
|
835
|
+
|
|
836
|
+
// Step (1.A.4).
|
|
837
|
+
isContributionValid = await zKey.verifyFromInit(
|
|
838
|
+
firstZkeyTempFilePath,
|
|
839
|
+
potTempFilePath,
|
|
840
|
+
lastZkeyTempFilePath,
|
|
841
|
+
transcriptLogger
|
|
842
|
+
)
|
|
843
|
+
|
|
844
|
+
// Compute contribution hash.
|
|
845
|
+
lastZkeyBlake2bHash = await blake512FromPath(lastZkeyTempFilePath)
|
|
846
|
+
|
|
847
|
+
// Free resources by unlinking temporary folders.
|
|
848
|
+
// Do not free-up verification transcript path here.
|
|
849
|
+
try {
|
|
850
|
+
fs.unlinkSync(potTempFilePath)
|
|
851
|
+
fs.unlinkSync(firstZkeyTempFilePath)
|
|
852
|
+
fs.unlinkSync(lastZkeyTempFilePath)
|
|
853
|
+
} catch (error: any) {
|
|
854
|
+
printLog(`Error while unlinking temporary files - Error ${error}`, LogLevel.WARN)
|
|
852
855
|
}
|
|
856
|
+
|
|
857
|
+
await completeVerification()
|
|
853
858
|
}
|
|
854
859
|
}
|
|
855
860
|
)
|
|
@@ -860,7 +865,7 @@ export const verifycontribution = functionsV2.https.onCall(
|
|
|
860
865
|
* this does not happen if the participant is actually the coordinator who is finalizing the ceremony.
|
|
861
866
|
*/
|
|
862
867
|
export const refreshParticipantAfterContributionVerification = functionsV1
|
|
863
|
-
.region(
|
|
868
|
+
.region("europe-west1")
|
|
864
869
|
.runWith({
|
|
865
870
|
memory: "512MB"
|
|
866
871
|
})
|
|
@@ -943,7 +948,7 @@ export const refreshParticipantAfterContributionVerification = functionsV1
|
|
|
943
948
|
* and verification key extracted from the circuit final contribution (as part of the ceremony finalization process).
|
|
944
949
|
*/
|
|
945
950
|
export const finalizeCircuit = functionsV1
|
|
946
|
-
.region(
|
|
951
|
+
.region("europe-west1")
|
|
947
952
|
.runWith({
|
|
948
953
|
memory: "512MB"
|
|
949
954
|
})
|
|
@@ -44,7 +44,7 @@ dotenv.config()
|
|
|
44
44
|
* @dev true when the participant can participate (1.A, 3.B, 1.D); otherwise false.
|
|
45
45
|
*/
|
|
46
46
|
export const checkParticipantForCeremony = functions
|
|
47
|
-
.region(
|
|
47
|
+
.region("europe-west1")
|
|
48
48
|
.runWith({
|
|
49
49
|
memory: "512MB"
|
|
50
50
|
})
|
|
@@ -175,7 +175,7 @@ export const checkParticipantForCeremony = functions
|
|
|
175
175
|
* 2) the participant has just finished the contribution for a circuit (contributionProgress != 0 && status = CONTRIBUTED && contributionStep = COMPLETED).
|
|
176
176
|
*/
|
|
177
177
|
export const progressToNextCircuitForContribution = functions
|
|
178
|
-
.region(
|
|
178
|
+
.region("europe-west1")
|
|
179
179
|
.runWith({
|
|
180
180
|
memory: "512MB"
|
|
181
181
|
})
|
|
@@ -233,7 +233,7 @@ export const progressToNextCircuitForContribution = functions
|
|
|
233
233
|
* 5) Completed contribution computation and verification.
|
|
234
234
|
*/
|
|
235
235
|
export const progressToNextContributionStep = functions
|
|
236
|
-
.region(
|
|
236
|
+
.region("europe-west1")
|
|
237
237
|
.runWith({
|
|
238
238
|
memory: "512MB"
|
|
239
239
|
})
|
|
@@ -296,7 +296,7 @@ export const progressToNextContributionStep = functions
|
|
|
296
296
|
* @dev enable the current contributor to resume a contribution from where it had left off.
|
|
297
297
|
*/
|
|
298
298
|
export const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
299
|
-
.region(
|
|
299
|
+
.region("europe-west1")
|
|
300
300
|
.runWith({
|
|
301
301
|
memory: "512MB"
|
|
302
302
|
})
|
|
@@ -355,7 +355,7 @@ export const permanentlyStoreCurrentContributionTimeAndHash = functions
|
|
|
355
355
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
356
356
|
*/
|
|
357
357
|
export const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
358
|
-
.region(
|
|
358
|
+
.region("europe-west1")
|
|
359
359
|
.runWith({
|
|
360
360
|
memory: "512MB"
|
|
361
361
|
})
|
|
@@ -409,7 +409,7 @@ export const temporaryStoreCurrentContributionMultiPartUploadId = functions
|
|
|
409
409
|
* @dev enable the current contributor to resume a multi-part upload from where it had left off.
|
|
410
410
|
*/
|
|
411
411
|
export const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
412
|
-
.region(
|
|
412
|
+
.region("europe-west1")
|
|
413
413
|
.runWith({
|
|
414
414
|
memory: "512MB"
|
|
415
415
|
})
|
|
@@ -469,7 +469,7 @@ export const temporaryStoreCurrentContributionUploadedChunkData = functions
|
|
|
469
469
|
* contributed to every selected ceremony circuits (= DONE).
|
|
470
470
|
*/
|
|
471
471
|
export const checkAndPrepareCoordinatorForFinalization = functions
|
|
472
|
-
.region(
|
|
472
|
+
.region("europe-west1")
|
|
473
473
|
.runWith({
|
|
474
474
|
memory: "512MB"
|
|
475
475
|
})
|
package/src/functions/storage.ts
CHANGED
|
@@ -193,8 +193,10 @@ export const createBucket = functions
|
|
|
193
193
|
CORSConfiguration: {
|
|
194
194
|
CORSRules: [
|
|
195
195
|
{
|
|
196
|
-
AllowedMethods: ["GET"],
|
|
197
|
-
AllowedOrigins: ["*"]
|
|
196
|
+
AllowedMethods: ["GET", "PUT"],
|
|
197
|
+
AllowedOrigins: ["*"],
|
|
198
|
+
ExposeHeaders: ["ETag", "Content-Length"],
|
|
199
|
+
AllowedHeaders: ["*"]
|
|
198
200
|
}
|
|
199
201
|
]
|
|
200
202
|
}
|
package/src/functions/user.ts
CHANGED
|
@@ -41,7 +41,8 @@ export const registerAuthUser = functions
|
|
|
41
41
|
// Reference to a document using uid.
|
|
42
42
|
const userRef = firestore.collection(commonTerms.collections.users.name).doc(uid)
|
|
43
43
|
// html encode the display name (or put the ID if the name is not displayed)
|
|
44
|
-
const encodedDisplayName =
|
|
44
|
+
const encodedDisplayName =
|
|
45
|
+
user.displayName === "Null" || user.displayName === null ? user.uid : encode(displayName)
|
|
45
46
|
|
|
46
47
|
// store the avatar URL of a contributor
|
|
47
48
|
let avatarUrl: string = ""
|
|
@@ -73,13 +74,22 @@ export const registerAuthUser = functions
|
|
|
73
74
|
makeError(
|
|
74
75
|
"permission-denied",
|
|
75
76
|
"The user is not allowed to sign up because their Github reputation is not high enough.",
|
|
76
|
-
`The user ${
|
|
77
|
+
`The user ${
|
|
78
|
+
user.displayName === "Null" || user.displayName === null
|
|
79
|
+
? user.uid
|
|
80
|
+
: user.displayName
|
|
81
|
+
} is not allowed to sign up because their Github reputation is not high enough. Please contact the administrator if you think this is a mistake.`
|
|
77
82
|
)
|
|
78
83
|
)
|
|
79
|
-
}
|
|
84
|
+
}
|
|
80
85
|
// store locally
|
|
81
86
|
avatarUrl = avatarURL
|
|
82
|
-
printLog(
|
|
87
|
+
printLog(
|
|
88
|
+
`Github reputation check passed for user ${
|
|
89
|
+
user.displayName === "Null" || user.displayName === null ? user.uid : user.displayName
|
|
90
|
+
}`,
|
|
91
|
+
LogLevel.DEBUG
|
|
92
|
+
)
|
|
83
93
|
} catch (error: any) {
|
|
84
94
|
// Delete user
|
|
85
95
|
await auth.deleteUser(user.uid)
|
|
@@ -95,7 +105,7 @@ export const registerAuthUser = functions
|
|
|
95
105
|
}
|
|
96
106
|
// Set document (nb. we refer to providerData[0] because we use Github OAuth provider only).
|
|
97
107
|
// In future releases we might want to loop through the providerData array as we support
|
|
98
|
-
// more providers.
|
|
108
|
+
// more providers.
|
|
99
109
|
await userRef.set({
|
|
100
110
|
name: encodedDisplayName,
|
|
101
111
|
encodedDisplayName,
|
|
@@ -112,7 +122,7 @@ export const registerAuthUser = functions
|
|
|
112
122
|
// we want to create a new collection for the users to store the avatars
|
|
113
123
|
const avatarRef = firestore.collection(commonTerms.collections.avatars.name).doc(uid)
|
|
114
124
|
await avatarRef.set({
|
|
115
|
-
avatarUrl: avatarUrl || ""
|
|
125
|
+
avatarUrl: avatarUrl || ""
|
|
116
126
|
})
|
|
117
127
|
printLog(`Authenticated user document with identifier ${uid} has been correctly stored`, LogLevel.DEBUG)
|
|
118
128
|
printLog(`Authenticated user avatar with identifier ${uid} has been correctly stored`, LogLevel.DEBUG)
|
package/src/lib/errors.ts
CHANGED
|
@@ -184,6 +184,11 @@ export const SPECIFIC_ERRORS = {
|
|
|
184
184
|
"unavailable",
|
|
185
185
|
"VM command execution has been delayed since there were no available instance at the moment",
|
|
186
186
|
"Please, contact the coordinator if this error persists."
|
|
187
|
+
),
|
|
188
|
+
SE_VM_UNKNOWN_COMMAND_STATUS: makeError(
|
|
189
|
+
"unavailable",
|
|
190
|
+
"VM command execution has failed due to an unknown status code",
|
|
191
|
+
"Please, contact the coordinator if this error persists."
|
|
187
192
|
)
|
|
188
193
|
}
|
|
189
194
|
|
package/src/lib/utils.ts
CHANGED
|
@@ -217,7 +217,7 @@ export const downloadArtifactFromS3Bucket = async (bucketName: string, objectKey
|
|
|
217
217
|
const streamPipeline = promisify(pipeline)
|
|
218
218
|
await streamPipeline(response.body, writeStream)
|
|
219
219
|
|
|
220
|
-
writeStream.on(
|
|
220
|
+
writeStream.on("finish", () => {
|
|
221
221
|
writeStream.end()
|
|
222
222
|
})
|
|
223
223
|
}
|
|
@@ -305,7 +305,7 @@ export const deleteObject = async (bucketName: string, objectKey: string) => {
|
|
|
305
305
|
|
|
306
306
|
// Prepare command.
|
|
307
307
|
const command = new DeleteObjectCommand({ Bucket: bucketName, Key: objectKey })
|
|
308
|
-
|
|
308
|
+
|
|
309
309
|
// Execute command.
|
|
310
310
|
const data = await client.send(command)
|
|
311
311
|
|