aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/aws-sendmail/util.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/aws-sendmail/util.ts')
-rw-r--r--services/docker/mail-server/aws-sendmail/util.ts49
1 files changed, 49 insertions, 0 deletions
diff --git a/services/docker/mail-server/aws-sendmail/util.ts b/services/docker/mail-server/aws-sendmail/util.ts
new file mode 100644
index 0000000..1411840
--- /dev/null
+++ b/services/docker/mail-server/aws-sendmail/util.ts
@@ -0,0 +1,49 @@
+function getZonedDateTime(instant?: Temporal.Instant | Date) {
+ if (instant == null) {
+ instant = Temporal.Now.instant();
+ } else if (instant instanceof Date) {
+ instant = instant.toTemporalInstant();
+ }
+
+ return instant.toZonedDateTimeISO("UTC");
+}
+
+export function generateTimeStringForFileName(
+ instant?: Temporal.Instant | Date,
+ dateOnly: boolean = false,
+): string {
+ const time = getZonedDateTime(instant);
+
+ if (dateOnly) {
+ return time.toPlainDate().toString();
+ } else {
+ return time.toPlainDateTime().toString().replaceAll(/:|\./g, "-");
+ }
+}
+
+export function transformProperties<T extends object, N>(
+ object: T,
+ transformer: (value: T[keyof T], key: keyof T) => N,
+): { [k in keyof T]: N } {
+ return Object.fromEntries(
+ Object.entries(object).map((
+ [k, v],
+ ) => [k, transformer(v, k as keyof T)]),
+ ) as { [k in keyof T]: N };
+}
+
+export function createSingleton<T>(
+ name: string,
+): [() => T, (v: T | null) => void] {
+ let singleton: T | null = null;
+
+ return [
+ () => {
+ if (singleton == null) {
+ throw new Error(`Singleton ${name} is not set now.`);
+ }
+ return singleton;
+ },
+ (newValue: T | null) => singleton = newValue,
+ ];
+}