-
Notifications
You must be signed in to change notification settings - Fork 208
/
Copy pathencoding.ts
117 lines (105 loc) · 3.76 KB
/
encoding.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// The MIT License (MIT)
//
// Copyright (c) 2021 Firebase
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
import { currentProjectId } from "./utilities/utils";
// Copied from firebase-tools/src/gcp/proto
/**
* A type alias used to annotate interfaces as using a google.protobuf.Duration.
* This type is parsed/encoded as a string of seconds + the "s" prefix.
*/
export type Duration = string;
/** Get a google.protobuf.Duration for a number of seconds. */
export function durationFromSeconds(s: number): Duration {
return `${s}s`;
}
/**
* Utility function to help copy fields from type A to B.
* As a safety net, catches typos or fields that aren't named the same
* in A and B, but cannot verify that both Src and Dest have the same type for the same field.
*/
export function copyIfPresent<Src, Dest>(
dest: Dest,
src: Src,
...fields: Array<keyof Src & keyof Dest>
) {
if (!src) {
return;
}
for (const field of fields) {
if (!Object.prototype.hasOwnProperty.call(src, field)) {
continue;
}
dest[field] = src[field] as any;
}
}
export function convertIfPresent<Src, Dest>(
dest: Dest,
src: Src,
destField: keyof Dest,
srcField: keyof Src,
converter: (from: any) => any = (from: any) => {
return from;
}
) {
if (!src) {
return;
}
if (!Object.prototype.hasOwnProperty.call(src, srcField)) {
return;
}
dest[destField] = converter(src[srcField]);
}
export function serviceAccountFromShorthand(serviceAccount: string): string | null {
if (serviceAccount === "default") {
return null;
} else if (serviceAccount.endsWith("@")) {
const projectId = currentProjectId();
if (!projectId) {
throw new Error(
`Unable to determine email for service account '${serviceAccount}' (process.env.GCLOUD_PROJECT and process.env.GCP_PROJECT missing)`
);
}
return `${serviceAccount}${projectId}.iam.gserviceaccount.com`;
} else if (serviceAccount.includes("@")) {
return serviceAccount;
} else {
throw new Error(
`Invalid option for serviceAccount: '${serviceAccount}'. Valid options are 'default', a service account email, or '{serviceAccountName}@'`
);
}
}
export function convertInvoker(invoker: string | string[]): string[] {
if (typeof invoker === "string") {
invoker = [invoker];
}
if (invoker.length === 0) {
throw new Error("Invalid option for invoker: Must be a non-empty array.");
}
if (invoker.find((inv) => inv.length === 0)) {
throw new Error("Invalid option for invoker: Must be a non-empty string.");
}
if (invoker.length > 1 && invoker.find((inv) => inv === "public" || inv === "private")) {
throw new Error(
"Invalid option for invoker: Cannot have 'public' or 'private' in an array of service accounts."
);
}
return invoker;
}