diff --git a/lib/types/media-types.js b/lib/types/media-types.js --- a/lib/types/media-types.js +++ b/lib/types/media-types.js @@ -1,13 +1,21 @@ // @flow +import t, { type TInterface, type TUnion } from 'tcomb'; + import type { Shape } from './core.js'; import { type Platform } from './device-types.js'; +import { tShape, tString, tID } from '../utils/validation-utils.js'; export type Dimensions = $ReadOnly<{ +height: number, +width: number, }>; +export const dimensionsValidator: TInterface = tShape({ + height: t.Number, + width: t.Number, +}); + export type MediaType = 'photo' | 'video'; export type EncryptedMediaType = 'encrypted_photo' | 'encrypted_video'; @@ -246,6 +254,31 @@ +duration: number, // seconds }; +export const mediaLibrarySelectionValidator: TUnion = + t.union([ + tShape({ + step: tString('photo_library'), + dimensions: dimensionsValidator, + filename: t.maybe(t.String), + uri: t.String, + mediaNativeID: t.maybe(t.String), + selectTime: t.Number, + sendTime: t.Number, + retries: t.Number, + }), + tShape({ + step: tString('video_library'), + dimensions: dimensionsValidator, + filename: t.maybe(t.String), + uri: t.String, + mediaNativeID: t.maybe(t.String), + selectTime: t.Number, + sendTime: t.Number, + retries: t.Number, + duration: t.Number, + }), + ]); + export type PhotoCapture = { +step: 'photo_capture', +time: number, // ms @@ -258,6 +291,19 @@ +retries: number, }; +export const photoCaptureValidator: TInterface = + tShape({ + step: tString('photo_capture'), + time: t.Number, + dimensions: dimensionsValidator, + filename: t.String, + uri: t.String, + captureTime: t.Number, + selectTime: t.Number, + sendTime: t.Number, + retries: t.Number, + }); + export type PhotoPaste = { +step: 'photo_paste', +dimensions: Dimensions, @@ -268,11 +314,28 @@ +retries: number, }; +export const photoPasteValidator: TInterface = tShape({ + step: tString('photo_paste'), + dimensions: dimensionsValidator, + filename: t.String, + uri: t.String, + selectTime: t.Number, + sendTime: t.Number, + retries: t.Number, +}); + export type NativeMediaSelection = | MediaLibrarySelection | PhotoCapture | PhotoPaste; +export const nativeMediaSelectionValidator: TUnion = + t.union([ + mediaLibrarySelectionValidator, + photoCaptureValidator, + photoPasteValidator, + ]); + export type MediaMissionStep = | NativeMediaSelection | { @@ -560,6 +623,14 @@ +localMediaSelection?: NativeMediaSelection, }; +export const imageValidator: TInterface = tShape({ + id: tID, + uri: t.String, + type: tString('photo'), + dimensions: dimensionsValidator, + localMediaSelection: t.maybe(nativeMediaSelectionValidator), +}); + export type EncryptedImage = { +id: string, // a media URI for keyserver uploads / blob holder for Blob service uploads @@ -569,6 +640,15 @@ +dimensions: Dimensions, }; +export const encryptedImageValidator: TInterface = + tShape({ + id: tID, + holder: t.String, + encryptionKey: t.String, + type: tString('encrypted_photo'), + dimensions: dimensionsValidator, + }); + export type Video = { +id: string, +uri: string, @@ -581,6 +661,17 @@ +localMediaSelection?: NativeMediaSelection, }; +export const videoValidator: TInterface