Live video on the AT Protocol

Makefile: add c2pa go type generation

+421 -1485
+48
Cargo.lock
··· 569 569 "riff", 570 570 "ring", 571 571 "rsa", 572 + "schemars 0.8.22", 572 573 "serde", 573 574 "serde-transcode", 574 575 "serde-wasm-bindgen", ··· 1329 1330 dependencies = [ 1330 1331 "libc", 1331 1332 "windows-sys 0.59.0", 1333 + ] 1334 + 1335 + [[package]] 1336 + name = "export_c2pa_schema" 1337 + version = "0.0.0" 1338 + dependencies = [ 1339 + "anyhow", 1340 + "c2pa", 1341 + "schemars 0.8.22", 1342 + "serde", 1343 + "serde_json", 1344 + "serde_with", 1332 1345 ] 1333 1346 1334 1347 [[package]] ··· 4247 4260 4248 4261 [[package]] 4249 4262 name = "schemars" 4263 + version = "0.8.22" 4264 + source = "registry+https://github.com/rust-lang/crates.io-index" 4265 + checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" 4266 + dependencies = [ 4267 + "dyn-clone", 4268 + "schemars_derive", 4269 + "serde", 4270 + "serde_json", 4271 + ] 4272 + 4273 + [[package]] 4274 + name = "schemars" 4250 4275 version = "0.9.0" 4251 4276 source = "registry+https://github.com/rust-lang/crates.io-index" 4252 4277 checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" ··· 4267 4292 "ref-cast", 4268 4293 "serde", 4269 4294 "serde_json", 4295 + ] 4296 + 4297 + [[package]] 4298 + name = "schemars_derive" 4299 + version = "0.8.22" 4300 + source = "registry+https://github.com/rust-lang/crates.io-index" 4301 + checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" 4302 + dependencies = [ 4303 + "proc-macro2", 4304 + "quote", 4305 + "serde_derive_internals", 4306 + "syn 2.0.105", 4270 4307 ] 4271 4308 4272 4309 [[package]] ··· 4385 4422 version = "1.0.226" 4386 4423 source = "registry+https://github.com/rust-lang/crates.io-index" 4387 4424 checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" 4425 + dependencies = [ 4426 + "proc-macro2", 4427 + "quote", 4428 + "syn 2.0.105", 4429 + ] 4430 + 4431 + [[package]] 4432 + name = "serde_derive_internals" 4433 + version = "0.29.1" 4434 + source = "registry+https://github.com/rust-lang/crates.io-index" 4435 + checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" 4388 4436 dependencies = [ 4389 4437 "proc-macro2", 4390 4438 "quote",
+1 -1
Cargo.toml
··· 1 1 [workspace] 2 2 resolver = "3" 3 - members = ["rust/iroh-streamplace"] 3 + members = ["rust/export-c2pa-schema", "rust/iroh-streamplace"] 4 4 exclude = ["subprojects/c2pa_go"]
+4
Makefile
··· 969 969 -o bin/$(download_file) \ 970 970 "$$CI_API_V4_URL/projects/$$CI_PROJECT_ID/packages/generic/$(BRANCH)/$(VERSION)/$(download_file)"; 971 971 972 + .PHONY: c2pa-types 972 973 c2pa-types: 974 + $(MAKE) dev-rust 975 + ./target/debug/export_c2pa_schema 976 + npx quicktype --lang go --src-lang schema --package c2patypes --out pkg/c2patypes/c2patypes.go ./target/schema/C2PA.schema.json
+2 -1
package.json
··· 42 42 "dependencies": { 43 43 "firebase-admin": "^12.7.0", 44 44 "lex-md": "^0.1.0", 45 - "prettier-plugin-organize-imports": "^4.1.0" 45 + "prettier-plugin-organize-imports": "^4.1.0", 46 + "quicktype": "^23.2.6" 46 47 }, 47 48 "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977" 48 49 }
-1482
pkg/c2patypes/json/Everything.schema.json
··· 1 - { 2 - "$schema": "http://json-schema.org/draft-07/schema#", 3 - "title": "Everything", 4 - "type": "object", 5 - "required": ["builder", "manifest_definition", "reader"], 6 - "properties": { 7 - "builder": { 8 - "$ref": "#/definitions/Builder" 9 - }, 10 - "manifest_definition": { 11 - "$ref": "#/definitions/ManifestDefinition" 12 - }, 13 - "reader": { 14 - "$ref": "#/definitions/Reader" 15 - } 16 - }, 17 - "definitions": { 18 - "Actor": { 19 - "description": "Identifies a person responsible for an action.", 20 - "type": "object", 21 - "properties": { 22 - "credentials": { 23 - "description": "List of references to W3C Verifiable Credentials.", 24 - "type": ["array", "null"], 25 - "items": { 26 - "$ref": "#/definitions/HashedUri" 27 - } 28 - }, 29 - "identifier": { 30 - "description": "An identifier for a human actor, used when the \"type\" is `humanEntry.identified`.", 31 - "type": ["string", "null"] 32 - } 33 - } 34 - }, 35 - "AssertionData": { 36 - "description": "This allows the assertion to be expressed as CBOR or JSON. The default is CBOR unless you specify that an assertion should be JSON.", 37 - "anyOf": [true] 38 - }, 39 - "AssertionDefinition": { 40 - "description": "Defines an assertion that consists of a label that can be either a C2PA-defined assertion label or a custom label in reverse domain format.", 41 - "type": "object", 42 - "required": ["data", "label"], 43 - "properties": { 44 - "data": { 45 - "$ref": "#/definitions/AssertionData" 46 - }, 47 - "label": { 48 - "type": "string" 49 - } 50 - } 51 - }, 52 - "AssertionMetadata": { 53 - "description": "The AssertionMetadata structure can be used as part of other assertions or on its own to reference others", 54 - "type": "object", 55 - "properties": { 56 - "dataSource": { 57 - "anyOf": [ 58 - { 59 - "$ref": "#/definitions/DataSource" 60 - }, 61 - { 62 - "type": "null" 63 - } 64 - ] 65 - }, 66 - "dateTime": { 67 - "anyOf": [ 68 - { 69 - "$ref": "#/definitions/DateT" 70 - }, 71 - { 72 - "type": "null" 73 - } 74 - ] 75 - }, 76 - "reference": { 77 - "anyOf": [ 78 - { 79 - "$ref": "#/definitions/HashedUri" 80 - }, 81 - { 82 - "type": "null" 83 - } 84 - ] 85 - }, 86 - "regionOfInterest": { 87 - "anyOf": [ 88 - { 89 - "$ref": "#/definitions/RegionOfInterest" 90 - }, 91 - { 92 - "type": "null" 93 - } 94 - ] 95 - }, 96 - "reviewRatings": { 97 - "type": ["array", "null"], 98 - "items": { 99 - "$ref": "#/definitions/ReviewRating" 100 - } 101 - } 102 - } 103 - }, 104 - "AssetType": { 105 - "type": "object", 106 - "required": ["type"], 107 - "properties": { 108 - "type": { 109 - "type": "string" 110 - }, 111 - "version": { 112 - "type": ["string", "null"] 113 - } 114 - } 115 - }, 116 - "Builder": { 117 - "description": "Use a Builder to add a signed manifest to an asset.\n\n# Example: Building and signing a manifest\n\n``` use c2pa::Result; use std::path::PathBuf;\n\nuse c2pa::{create_signer, Builder, SigningAlg}; use serde::Serialize; use serde_json::json; use tempfile::tempdir;\n\n#[derive(Serialize)] struct Test { my_tag: usize, }\n\n# fn main() -> Result<()> { #[cfg(feature = \"file_io\")] { let manifest_json = json!({ \"claim_generator_info\": [ { \"name\": \"c2pa_test\", \"version\": \"1.0.0\" } ], \"title\": \"Test_Manifest\" }).to_string();\n\nlet mut builder = Builder::from_json(&manifest_json)?; builder.add_assertion(\"org.contentauth.test\", &Test { my_tag: 42 })?;\n\nlet source = PathBuf::from(\"tests/fixtures/C.jpg\"); let dir = tempdir()?; let dest = dir.path().join(\"test_file.jpg\");\n\n// Create a ps256 signer using certs and key files. TO DO: Update example. let signcert_path = \"tests/fixtures/certs/ps256.pub\"; let pkey_path = \"tests/fixtures/certs/ps256.pem\"; let signer = create_signer::from_files(signcert_path, pkey_path, SigningAlg::Ps256, None)?;\n\n// embed a manifest using the signer builder.sign_file( signer.as_ref(), &source, &dest)?; } # Ok(()) # } ```", 118 - "type": "object", 119 - "required": ["no_embed"], 120 - "properties": { 121 - "assertions": { 122 - "description": "A list of assertions", 123 - "default": [], 124 - "type": "array", 125 - "items": { 126 - "$ref": "#/definitions/AssertionDefinition" 127 - } 128 - }, 129 - "base_path": { 130 - "description": "Base path to search for resources.", 131 - "type": ["string", "null"] 132 - }, 133 - "builder_flow": { 134 - "description": "The type of builder being used.", 135 - "anyOf": [ 136 - { 137 - "$ref": "#/definitions/BuilderFlow" 138 - }, 139 - { 140 - "type": "null" 141 - } 142 - ] 143 - }, 144 - "claim_generator_info": { 145 - "description": "Claim Generator Info is always required with at least one entry", 146 - "default": [ 147 - { 148 - "name": "c2pa-rs", 149 - "version": "0.58.0" 150 - } 151 - ], 152 - "type": "array", 153 - "items": { 154 - "$ref": "#/definitions/ClaimGeneratorInfo" 155 - } 156 - }, 157 - "claim_version": { 158 - "description": "The version of the claim. Defaults to 1.", 159 - "type": ["integer", "null"], 160 - "format": "uint8", 161 - "minimum": 0.0 162 - }, 163 - "format": { 164 - "description": "The format of the source file as a MIME type.", 165 - "default": "application/octet-stream", 166 - "type": "string" 167 - }, 168 - "ingredients": { 169 - "description": "A List of ingredients", 170 - "default": [], 171 - "type": "array", 172 - "items": { 173 - "$ref": "#/definitions/Ingredient" 174 - } 175 - }, 176 - "instance_id": { 177 - "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", 178 - "default": "xmp:iid:ad854dd7-b8f6-46cf-93d5-9e0607131a38", 179 - "type": "string" 180 - }, 181 - "label": { 182 - "description": "Allows you to pre-define the manifest label, which must be unique. Not intended for general use. If not set, it will be assigned automatically.", 183 - "type": ["string", "null"] 184 - }, 185 - "metadata": { 186 - "description": "Optional manifest metadata. This will be deprecated in the future; not recommended to use.", 187 - "type": ["array", "null"], 188 - "items": { 189 - "$ref": "#/definitions/AssertionMetadata" 190 - } 191 - }, 192 - "no_embed": { 193 - "description": "If true, the manifest store will not be embedded in the asset on sign", 194 - "type": "boolean" 195 - }, 196 - "redactions": { 197 - "description": "A list of redactions - URIs to redacted assertions.", 198 - "type": ["array", "null"], 199 - "items": { 200 - "type": "string" 201 - } 202 - }, 203 - "remote_url": { 204 - "description": "Optional remote URL for the manifest", 205 - "type": ["string", "null"] 206 - }, 207 - "thumbnail": { 208 - "description": "An optional ResourceRef to a thumbnail image that represents the asset that was signed. Must be available when the manifest is signed.", 209 - "anyOf": [ 210 - { 211 - "$ref": "#/definitions/ResourceRef" 212 - }, 213 - { 214 - "type": "null" 215 - } 216 - ] 217 - }, 218 - "title": { 219 - "description": "A human-readable title, generally source filename.", 220 - "type": ["string", "null"] 221 - }, 222 - "vendor": { 223 - "description": "Optional prefix added to the generated Manifest Label This is typically a reverse domain name.", 224 - "type": ["string", "null"] 225 - } 226 - } 227 - }, 228 - "BuilderFlow": { 229 - "description": "Represents the type of builder flow being used.\n\nThis determines how the builder will be used, such as creating a new asset, opening an existing asset, or updating an existing asset.", 230 - "oneOf": [ 231 - { 232 - "type": "string", 233 - "enum": ["Open", "Update"] 234 - }, 235 - { 236 - "type": "object", 237 - "required": ["Create"], 238 - "properties": { 239 - "Create": { 240 - "$ref": "#/definitions/DigitalSourceType" 241 - } 242 - }, 243 - "additionalProperties": false 244 - } 245 - ] 246 - }, 247 - "ClaimGeneratorInfo": { 248 - "description": "Description of the claim generator, or the software used in generating the claim.\n\nThis structure is also used for actions softwareAgent", 249 - "type": "object", 250 - "required": ["name"], 251 - "properties": { 252 - "icon": { 253 - "description": "hashed URI to the icon (either embedded or remote)", 254 - "anyOf": [ 255 - { 256 - "$ref": "#/definitions/UriOrResource" 257 - }, 258 - { 259 - "type": "null" 260 - } 261 - ] 262 - }, 263 - "name": { 264 - "description": "A human readable string naming the claim_generator", 265 - "type": "string" 266 - }, 267 - "operating_system": { 268 - "description": "A human readable string of the OS the claim generator is running on", 269 - "type": ["string", "null"] 270 - }, 271 - "version": { 272 - "description": "A human readable string of the product's version", 273 - "type": ["string", "null"] 274 - } 275 - }, 276 - "additionalProperties": true 277 - }, 278 - "Coordinate": { 279 - "description": "An x, y coordinate used for specifying vertices in polygons.", 280 - "type": "object", 281 - "required": ["x", "y"], 282 - "properties": { 283 - "x": { 284 - "description": "The coordinate along the x-axis.", 285 - "type": "number", 286 - "format": "double" 287 - }, 288 - "y": { 289 - "description": "The coordinate along the y-axis.", 290 - "type": "number", 291 - "format": "double" 292 - } 293 - } 294 - }, 295 - "DataSource": { 296 - "description": "A description of the source for assertion data", 297 - "type": "object", 298 - "required": ["type"], 299 - "properties": { 300 - "actors": { 301 - "description": "A list of [`Actor`]s associated with this source.", 302 - "type": ["array", "null"], 303 - "items": { 304 - "$ref": "#/definitions/Actor" 305 - } 306 - }, 307 - "details": { 308 - "description": "A human-readable string giving details about the source of the assertion data.", 309 - "type": ["string", "null"] 310 - }, 311 - "type": { 312 - "description": "A value from among the enumerated list indicating the source of the assertion.", 313 - "type": "string" 314 - } 315 - } 316 - }, 317 - "DateT": { 318 - "type": "string" 319 - }, 320 - "DigitalSourceType": { 321 - "oneOf": [ 322 - { 323 - "description": "Media whose digital content is effectively empty, such as a blank canvas or zero-length video.", 324 - "type": "string", 325 - "enum": ["Empty"] 326 - }, 327 - { 328 - "description": "Data that is the result of algorithmically using a model derived from sampled content and data. Differs from <http://cv.iptc.org/newscodes/digitalsourcetype/>trainedAlgorithmicMedia in that the result isn’t a media type (e.g., image or video) but is a data format (e.g., CSV, pickle).", 329 - "type": "string", 330 - "enum": ["TrainedAlgorithmicData"] 331 - } 332 - ] 333 - }, 334 - "Frame": { 335 - "description": "A frame range representing starting and ending frames or pages.\n\nIf both `start` and `end` are missing, the frame will span the entire asset.", 336 - "type": "object", 337 - "properties": { 338 - "end": { 339 - "description": "The end of the frame inclusive or the end of the asset if not present.", 340 - "type": ["integer", "null"], 341 - "format": "int32" 342 - }, 343 - "start": { 344 - "description": "The start of the frame or the end of the asset if not present.\n\nThe first frame/page starts at 0.", 345 - "type": ["integer", "null"], 346 - "format": "int32" 347 - } 348 - } 349 - }, 350 - "HashedUri": { 351 - "description": "A `HashedUri` provides a reference to content available within the same manifest store.\n\nThis is described in [§8.3, URI References], of the C2PA Technical Specification.\n\n[§8.3, URI References]: https://c2pa.org/specifications/specifications/2.1/specs/C2PA_Specification.html#_uri_references", 352 - "type": "object", 353 - "required": ["hash", "url"], 354 - "properties": { 355 - "alg": { 356 - "description": "A string identifying the cryptographic hash algorithm used to compute the hash", 357 - "type": ["string", "null"] 358 - }, 359 - "hash": { 360 - "description": "Byte string containing the hash value", 361 - "type": "array", 362 - "items": { 363 - "type": "integer", 364 - "format": "uint8", 365 - "minimum": 0.0 366 - } 367 - }, 368 - "url": { 369 - "description": "JUMBF URI reference", 370 - "type": "string" 371 - } 372 - } 373 - }, 374 - "Ingredient": { 375 - "description": "An `Ingredient` is any external asset that has been used in the creation of an asset.", 376 - "type": "object", 377 - "properties": { 378 - "active_manifest": { 379 - "description": "The active manifest label (if one exists).\n\nIf this ingredient has a [`ManifestStore`], this will hold the label of the active [`Manifest`].\n\n[`Manifest`]: crate::Manifest [`ManifestStore`]: crate::ManifestStore", 380 - "type": ["string", "null"] 381 - }, 382 - "data": { 383 - "description": "A reference to the actual data of the ingredient.", 384 - "anyOf": [ 385 - { 386 - "$ref": "#/definitions/ResourceRef" 387 - }, 388 - { 389 - "type": "null" 390 - } 391 - ] 392 - }, 393 - "data_types": { 394 - "description": "Additional information about the data's type to the ingredient V2 structure.", 395 - "type": ["array", "null"], 396 - "items": { 397 - "$ref": "#/definitions/AssetType" 398 - } 399 - }, 400 - "description": { 401 - "description": "Additional description of the ingredient.", 402 - "type": ["string", "null"] 403 - }, 404 - "document_id": { 405 - "description": "Document ID from `xmpMM:DocumentID` in XMP metadata.", 406 - "type": ["string", "null"] 407 - }, 408 - "format": { 409 - "description": "The format of the source file as a MIME type.", 410 - "type": ["string", "null"] 411 - }, 412 - "hash": { 413 - "description": "An optional hash of the asset to prevent duplicates.", 414 - "type": ["string", "null"] 415 - }, 416 - "informational_URI": { 417 - "description": "URI to an informational page about the ingredient or its data.", 418 - "type": ["string", "null"] 419 - }, 420 - "instance_id": { 421 - "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", 422 - "type": ["string", "null"] 423 - }, 424 - "label": { 425 - "description": "The ingredient's label as assigned in the manifest.", 426 - "type": ["string", "null"] 427 - }, 428 - "manifest_data": { 429 - "description": "A [`ManifestStore`] from the source asset extracted as a binary C2PA blob.\n\n[`ManifestStore`]: crate::ManifestStore", 430 - "anyOf": [ 431 - { 432 - "$ref": "#/definitions/ResourceRef" 433 - }, 434 - { 435 - "type": "null" 436 - } 437 - ] 438 - }, 439 - "metadata": { 440 - "description": "Any additional [`Metadata`] as defined in the C2PA spec.\n\n[`Metadata`]: crate::Metadata", 441 - "anyOf": [ 442 - { 443 - "$ref": "#/definitions/AssertionMetadata" 444 - }, 445 - { 446 - "type": "null" 447 - } 448 - ] 449 - }, 450 - "provenance": { 451 - "description": "URI from `dcterms:provenance` in XMP metadata.", 452 - "type": ["string", "null"] 453 - }, 454 - "relationship": { 455 - "description": "Set to `ParentOf` if this is the parent ingredient.\n\nThere can only be one parent ingredient in the ingredients.", 456 - "default": "componentOf", 457 - "allOf": [ 458 - { 459 - "$ref": "#/definitions/Relationship" 460 - } 461 - ] 462 - }, 463 - "resources": { 464 - "readOnly": true, 465 - "allOf": [ 466 - { 467 - "$ref": "#/definitions/ResourceStore" 468 - } 469 - ] 470 - }, 471 - "thumbnail": { 472 - "description": "A thumbnail image capturing the visual state at the time of import.\n\nA tuple of thumbnail MIME format (for example `image/jpeg`) and binary bits of the image.", 473 - "anyOf": [ 474 - { 475 - "$ref": "#/definitions/ResourceRef" 476 - }, 477 - { 478 - "type": "null" 479 - } 480 - ] 481 - }, 482 - "title": { 483 - "description": "A human-readable title, generally source filename.", 484 - "type": ["string", "null"] 485 - }, 486 - "validation_results": { 487 - "description": "Validation results (Ingredient.V3)", 488 - "anyOf": [ 489 - { 490 - "$ref": "#/definitions/ValidationResults" 491 - }, 492 - { 493 - "type": "null" 494 - } 495 - ] 496 - }, 497 - "validation_status": { 498 - "description": "Validation status (Ingredient v1 & v2)", 499 - "type": ["array", "null"], 500 - "items": { 501 - "$ref": "#/definitions/ValidationStatus" 502 - } 503 - } 504 - } 505 - }, 506 - "IngredientDeltaValidationResult": { 507 - "description": "Represents any changes or deltas between the current and previous validation results for an ingredient's manifest.", 508 - "type": "object", 509 - "required": ["ingredientAssertionURI", "validationDeltas"], 510 - "properties": { 511 - "ingredientAssertionURI": { 512 - "description": "JUMBF URI reference to the ingredient assertion", 513 - "type": "string" 514 - }, 515 - "validationDeltas": { 516 - "description": "Validation results for the ingredient's active manifest", 517 - "allOf": [ 518 - { 519 - "$ref": "#/definitions/StatusCodes" 520 - } 521 - ] 522 - } 523 - } 524 - }, 525 - "Item": { 526 - "description": "Description of the boundaries of an identified range.", 527 - "type": "object", 528 - "required": ["identifier", "value"], 529 - "properties": { 530 - "identifier": { 531 - "description": "The container-specific term used to identify items, such as \"track_id\" for MP4 or \"item_ID\" for HEIF.", 532 - "type": "string" 533 - }, 534 - "value": { 535 - "description": "The value of the identifier, e.g. a value of \"2\" for an identifier of \"track_id\" would imply track 2 of the asset.", 536 - "type": "string" 537 - } 538 - } 539 - }, 540 - "Manifest": { 541 - "description": "A Manifest represents all the information in a c2pa manifest", 542 - "type": "object", 543 - "properties": { 544 - "assertions": { 545 - "description": "A list of assertions", 546 - "default": [], 547 - "type": "array", 548 - "items": { 549 - "$ref": "#/definitions/ManifestAssertion" 550 - } 551 - }, 552 - "claim_generator": { 553 - "description": "A User Agent formatted string identifying the software/hardware/system produced this claim Spaces are not allowed in names, versions can be specified with product/1.0 syntax.", 554 - "type": ["string", "null"] 555 - }, 556 - "claim_generator_info": { 557 - "description": "A list of claim generator info data identifying the software/hardware/system produced this claim.", 558 - "type": ["array", "null"], 559 - "items": { 560 - "$ref": "#/definitions/ClaimGeneratorInfo" 561 - } 562 - }, 563 - "credentials": { 564 - "description": "A List of verified credentials", 565 - "type": ["array", "null"], 566 - "items": true 567 - }, 568 - "format": { 569 - "description": "The format of the source file as a MIME type.", 570 - "type": ["string", "null"] 571 - }, 572 - "ingredients": { 573 - "description": "A List of ingredients", 574 - "default": [], 575 - "type": "array", 576 - "items": { 577 - "$ref": "#/definitions/Ingredient" 578 - } 579 - }, 580 - "instance_id": { 581 - "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", 582 - "default": "xmp:iid:162c4576-2f5c-4852-93ad-e15b784e19e8", 583 - "type": "string" 584 - }, 585 - "label": { 586 - "type": ["string", "null"] 587 - }, 588 - "metadata": { 589 - "description": "A list of user metadata for this claim.", 590 - "type": ["array", "null"], 591 - "items": { 592 - "$ref": "#/definitions/AssertionMetadata" 593 - } 594 - }, 595 - "redactions": { 596 - "description": "A list of redactions - URIs to a redacted assertions", 597 - "type": ["array", "null"], 598 - "items": { 599 - "type": "string" 600 - } 601 - }, 602 - "resources": { 603 - "description": "container for binary assets (like thumbnails)", 604 - "readOnly": true, 605 - "allOf": [ 606 - { 607 - "$ref": "#/definitions/ResourceStore" 608 - } 609 - ] 610 - }, 611 - "signature_info": { 612 - "description": "Signature data (only used for reporting)", 613 - "anyOf": [ 614 - { 615 - "$ref": "#/definitions/SignatureInfo" 616 - }, 617 - { 618 - "type": "null" 619 - } 620 - ] 621 - }, 622 - "thumbnail": { 623 - "anyOf": [ 624 - { 625 - "$ref": "#/definitions/ResourceRef" 626 - }, 627 - { 628 - "type": "null" 629 - } 630 - ] 631 - }, 632 - "title": { 633 - "description": "A human-readable title, generally source filename.", 634 - "type": ["string", "null"] 635 - }, 636 - "vendor": { 637 - "description": "Optional prefix added to the generated Manifest label. This is typically an internet domain name for the vendor (i.e. `adobe`).", 638 - "type": ["string", "null"] 639 - } 640 - } 641 - }, 642 - "ManifestAssertion": { 643 - "description": "A labeled container for an Assertion value in a Manifest", 644 - "type": "object", 645 - "required": ["data", "label"], 646 - "properties": { 647 - "data": { 648 - "description": "The data of the assertion as Value", 649 - "allOf": [ 650 - { 651 - "$ref": "#/definitions/ManifestData" 652 - } 653 - ] 654 - }, 655 - "instance": { 656 - "description": "There can be more than one assertion for any label", 657 - "type": ["integer", "null"], 658 - "format": "uint", 659 - "minimum": 0.0 660 - }, 661 - "kind": { 662 - "description": "The [ManifestAssertionKind] for this assertion (as stored in c2pa content)", 663 - "anyOf": [ 664 - { 665 - "$ref": "#/definitions/ManifestAssertionKind" 666 - }, 667 - { 668 - "type": "null" 669 - } 670 - ] 671 - }, 672 - "label": { 673 - "description": "An assertion label in reverse domain format", 674 - "type": "string" 675 - } 676 - } 677 - }, 678 - "ManifestAssertionKind": { 679 - "description": "Assertions in C2PA can be stored in several formats", 680 - "type": "string", 681 - "enum": ["Cbor", "Json", "Binary", "Uri"] 682 - }, 683 - "ManifestData": { 684 - "anyOf": [ 685 - true, 686 - { 687 - "type": "array", 688 - "items": { 689 - "type": "integer", 690 - "format": "uint8", 691 - "minimum": 0.0 692 - } 693 - } 694 - ] 695 - }, 696 - "ManifestDefinition": { 697 - "description": "Use a ManifestDefinition to define a manifest and to build a `ManifestStore`. A manifest is a collection of ingredients and assertions used to define a claim that can be signed and embedded into a file.", 698 - "type": "object", 699 - "properties": { 700 - "assertions": { 701 - "description": "A list of assertions", 702 - "default": [], 703 - "type": "array", 704 - "items": { 705 - "$ref": "#/definitions/AssertionDefinition" 706 - } 707 - }, 708 - "claim_generator_info": { 709 - "description": "Claim Generator Info is always required with at least one entry", 710 - "default": [ 711 - { 712 - "name": "c2pa-rs", 713 - "version": "0.58.0" 714 - } 715 - ], 716 - "type": "array", 717 - "items": { 718 - "$ref": "#/definitions/ClaimGeneratorInfo" 719 - } 720 - }, 721 - "claim_version": { 722 - "description": "The version of the claim. Defaults to 1.", 723 - "type": ["integer", "null"], 724 - "format": "uint8", 725 - "minimum": 0.0 726 - }, 727 - "format": { 728 - "description": "The format of the source file as a MIME type.", 729 - "default": "application/octet-stream", 730 - "type": "string" 731 - }, 732 - "ingredients": { 733 - "description": "A List of ingredients", 734 - "default": [], 735 - "type": "array", 736 - "items": { 737 - "$ref": "#/definitions/Ingredient" 738 - } 739 - }, 740 - "instance_id": { 741 - "description": "Instance ID from `xmpMM:InstanceID` in XMP metadata.", 742 - "default": "xmp:iid:39745b0f-82b0-4848-b2ac-695b1acd4893", 743 - "type": "string" 744 - }, 745 - "label": { 746 - "description": "Allows you to pre-define the manifest label, which must be unique. Not intended for general use. If not set, it will be assigned automatically.", 747 - "type": ["string", "null"] 748 - }, 749 - "metadata": { 750 - "description": "Optional manifest metadata. This will be deprecated in the future; not recommended to use.", 751 - "type": ["array", "null"], 752 - "items": { 753 - "$ref": "#/definitions/AssertionMetadata" 754 - } 755 - }, 756 - "redactions": { 757 - "description": "A list of redactions - URIs to redacted assertions.", 758 - "type": ["array", "null"], 759 - "items": { 760 - "type": "string" 761 - } 762 - }, 763 - "thumbnail": { 764 - "description": "An optional ResourceRef to a thumbnail image that represents the asset that was signed. Must be available when the manifest is signed.", 765 - "anyOf": [ 766 - { 767 - "$ref": "#/definitions/ResourceRef" 768 - }, 769 - { 770 - "type": "null" 771 - } 772 - ] 773 - }, 774 - "title": { 775 - "description": "A human-readable title, generally source filename.", 776 - "type": ["string", "null"] 777 - }, 778 - "vendor": { 779 - "description": "Optional prefix added to the generated Manifest Label This is typically a reverse domain name.", 780 - "type": ["string", "null"] 781 - } 782 - } 783 - }, 784 - "Range": { 785 - "description": "A spatial, temporal, frame, or textual range describing the region of interest.", 786 - "type": "object", 787 - "required": ["type"], 788 - "properties": { 789 - "frame": { 790 - "description": "A frame range.", 791 - "anyOf": [ 792 - { 793 - "$ref": "#/definitions/Frame" 794 - }, 795 - { 796 - "type": "null" 797 - } 798 - ] 799 - }, 800 - "item": { 801 - "description": "A item identifier.", 802 - "anyOf": [ 803 - { 804 - "$ref": "#/definitions/Item" 805 - }, 806 - { 807 - "type": "null" 808 - } 809 - ] 810 - }, 811 - "shape": { 812 - "description": "A spatial range.", 813 - "anyOf": [ 814 - { 815 - "$ref": "#/definitions/Shape" 816 - }, 817 - { 818 - "type": "null" 819 - } 820 - ] 821 - }, 822 - "text": { 823 - "description": "A textual range.", 824 - "anyOf": [ 825 - { 826 - "$ref": "#/definitions/Text" 827 - }, 828 - { 829 - "type": "null" 830 - } 831 - ] 832 - }, 833 - "time": { 834 - "description": "A temporal range.", 835 - "anyOf": [ 836 - { 837 - "$ref": "#/definitions/Time" 838 - }, 839 - { 840 - "type": "null" 841 - } 842 - ] 843 - }, 844 - "type": { 845 - "description": "The type of range of interest.", 846 - "allOf": [ 847 - { 848 - "$ref": "#/definitions/RangeType" 849 - } 850 - ] 851 - } 852 - } 853 - }, 854 - "RangeType": { 855 - "description": "The type of range for the region of interest.", 856 - "oneOf": [ 857 - { 858 - "description": "A spatial range, see [`Shape`] for more details.", 859 - "type": "string", 860 - "enum": ["spatial"] 861 - }, 862 - { 863 - "description": "A temporal range, see [`Time`] for more details.", 864 - "type": "string", 865 - "enum": ["temporal"] 866 - }, 867 - { 868 - "description": "A spatial range, see [`Frame`] for more details.", 869 - "type": "string", 870 - "enum": ["frame"] 871 - }, 872 - { 873 - "description": "A textual range, see [`Text`] for more details.", 874 - "type": "string", 875 - "enum": ["textual"] 876 - }, 877 - { 878 - "description": "A range identified by a specific identifier and value, see [`Item`] for more details.", 879 - "type": "string", 880 - "enum": ["identified"] 881 - } 882 - ] 883 - }, 884 - "Reader": { 885 - "description": "Use a Reader to read and validate a manifest store.", 886 - "type": "object", 887 - "required": ["manifests"], 888 - "properties": { 889 - "active_manifest": { 890 - "description": "A label for the active (most recent) manifest in the store", 891 - "type": ["string", "null"] 892 - }, 893 - "manifests": { 894 - "description": "A HashMap of Manifests", 895 - "type": "object", 896 - "additionalProperties": { 897 - "$ref": "#/definitions/Manifest" 898 - } 899 - }, 900 - "validation_results": { 901 - "description": "ValidationStatus generated when loading the ManifestStore from an asset", 902 - "anyOf": [ 903 - { 904 - "$ref": "#/definitions/ValidationResults" 905 - }, 906 - { 907 - "type": "null" 908 - } 909 - ] 910 - }, 911 - "validation_state": { 912 - "description": "The validation state of the manifest store", 913 - "anyOf": [ 914 - { 915 - "$ref": "#/definitions/ValidationState" 916 - }, 917 - { 918 - "type": "null" 919 - } 920 - ] 921 - }, 922 - "validation_status": { 923 - "description": "ValidationStatus generated when loading the ManifestStore from an asset", 924 - "type": ["array", "null"], 925 - "items": { 926 - "$ref": "#/definitions/ValidationStatus" 927 - } 928 - } 929 - } 930 - }, 931 - "RegionOfInterest": { 932 - "description": "A region of interest within an asset describing the change.\n\nThis struct can be used from [`Action::changes`][crate::assertions::Action::changes] or [`AssertionMetadata::region_of_interest`][crate::assertions::AssertionMetadata::region_of_interest].", 933 - "type": "object", 934 - "required": ["region"], 935 - "properties": { 936 - "description": { 937 - "description": "A free-text string.", 938 - "type": ["string", "null"] 939 - }, 940 - "identifier": { 941 - "description": "A free-text string representing a machine-readable, unique to this assertion, identifier for the region.", 942 - "type": ["string", "null"] 943 - }, 944 - "metadata": { 945 - "description": "Additional information about the asset.", 946 - "anyOf": [ 947 - { 948 - "$ref": "#/definitions/AssertionMetadata" 949 - }, 950 - { 951 - "type": "null" 952 - } 953 - ] 954 - }, 955 - "name": { 956 - "description": "A free-text string representing a human-readable name for the region which might be used in a user interface.", 957 - "type": ["string", "null"] 958 - }, 959 - "region": { 960 - "description": "A range describing the region of interest for the specific asset.", 961 - "type": "array", 962 - "items": { 963 - "$ref": "#/definitions/Range" 964 - } 965 - }, 966 - "role": { 967 - "description": "A value from our controlled vocabulary or an entity-specific value (e.g., com.litware.coolArea) that represents the role of a region among other regions.", 968 - "anyOf": [ 969 - { 970 - "$ref": "#/definitions/Role" 971 - }, 972 - { 973 - "type": "null" 974 - } 975 - ] 976 - }, 977 - "type": { 978 - "description": "A value from a controlled vocabulary such as <https://cv.iptc.org/newscodes/imageregiontype/> or an entity-specific value (e.g., com.litware.newType) that represents the type of thing(s) depicted by a region.\n\nNote this field serializes/deserializes into the name `type`.", 979 - "type": ["string", "null"] 980 - } 981 - } 982 - }, 983 - "Relationship": { 984 - "description": "The relationship of the ingredient to the current asset.", 985 - "oneOf": [ 986 - { 987 - "description": "The current asset is derived from this ingredient.", 988 - "type": "string", 989 - "enum": ["parentOf"] 990 - }, 991 - { 992 - "description": "The current asset is a part of this ingredient.", 993 - "type": "string", 994 - "enum": ["componentOf"] 995 - }, 996 - { 997 - "description": "The ingredient was used as an input to a computational process to create or modify the asset.", 998 - "type": "string", 999 - "enum": ["inputTo"] 1000 - } 1001 - ] 1002 - }, 1003 - "ResourceRef": { 1004 - "description": "A reference to a resource to be used in JSON serialization.\n\nThe underlying data can be read as a stream via [`Reader::resource_to_stream`][crate::Reader::resource_to_stream].", 1005 - "type": "object", 1006 - "required": ["format", "identifier"], 1007 - "properties": { 1008 - "alg": { 1009 - "description": "The algorithm used to hash the resource (if applicable).", 1010 - "type": ["string", "null"] 1011 - }, 1012 - "data_types": { 1013 - "description": "More detailed data types as defined in the C2PA spec.", 1014 - "type": ["array", "null"], 1015 - "items": { 1016 - "$ref": "#/definitions/AssetType" 1017 - } 1018 - }, 1019 - "format": { 1020 - "description": "The mime type of the referenced resource.", 1021 - "type": "string" 1022 - }, 1023 - "hash": { 1024 - "description": "The hash of the resource (if applicable).", 1025 - "type": ["string", "null"] 1026 - }, 1027 - "identifier": { 1028 - "description": "A URI that identifies the resource as referenced from the manifest.\n\nThis may be a JUMBF URI, a file path, a URL or any other string. Relative JUMBF URIs will be resolved with the manifest label. Relative file paths will be resolved with the base path if provided.", 1029 - "type": "string" 1030 - } 1031 - } 1032 - }, 1033 - "ResourceStore": { 1034 - "description": "Resource store to contain binary objects referenced from JSON serializable structures", 1035 - "type": "object", 1036 - "required": ["resources"], 1037 - "properties": { 1038 - "base_path": { 1039 - "type": ["string", "null"] 1040 - }, 1041 - "label": { 1042 - "type": ["string", "null"] 1043 - }, 1044 - "resources": { 1045 - "type": "object", 1046 - "additionalProperties": { 1047 - "type": "array", 1048 - "items": { 1049 - "type": "integer", 1050 - "format": "uint8", 1051 - "minimum": 0.0 1052 - } 1053 - } 1054 - } 1055 - } 1056 - }, 1057 - "ReviewRating": { 1058 - "description": "A rating on an Assertion.\n\nSee <https://c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_review_ratings>.", 1059 - "type": "object", 1060 - "required": ["explanation", "value"], 1061 - "properties": { 1062 - "code": { 1063 - "type": ["string", "null"] 1064 - }, 1065 - "explanation": { 1066 - "type": "string" 1067 - }, 1068 - "value": { 1069 - "type": "integer", 1070 - "format": "uint8", 1071 - "minimum": 0.0 1072 - } 1073 - } 1074 - }, 1075 - "Role": { 1076 - "description": "A role describing the region.", 1077 - "oneOf": [ 1078 - { 1079 - "description": "Arbitrary area worth identifying.", 1080 - "type": "string", 1081 - "enum": ["c2pa.areaOfInterest"] 1082 - }, 1083 - { 1084 - "description": "This area is all that is left after a crop action.", 1085 - "type": "string", 1086 - "enum": ["c2pa.cropped"] 1087 - }, 1088 - { 1089 - "description": "This area has had edits applied to it.", 1090 - "type": "string", 1091 - "enum": ["c2pa.edited"] 1092 - }, 1093 - { 1094 - "description": "The area where an ingredient was placed/added.", 1095 - "type": "string", 1096 - "enum": ["c2pa.placed"] 1097 - }, 1098 - { 1099 - "description": "Something in this area was redacted.", 1100 - "type": "string", 1101 - "enum": ["c2pa.redacted"] 1102 - }, 1103 - { 1104 - "description": "Area specific to a subject (human or not).", 1105 - "type": "string", 1106 - "enum": ["c2pa.subjectArea"] 1107 - }, 1108 - { 1109 - "description": "A range of information was removed/deleted.", 1110 - "type": "string", 1111 - "enum": ["c2pa.deleted"] 1112 - }, 1113 - { 1114 - "description": "Styling was applied to this area.", 1115 - "type": "string", 1116 - "enum": ["c2pa.styled"] 1117 - }, 1118 - { 1119 - "description": "Invisible watermarking was applied to this area for the purpose of soft binding.", 1120 - "type": "string", 1121 - "enum": ["c2pa.watermarked"] 1122 - } 1123 - ] 1124 - }, 1125 - "Shape": { 1126 - "description": "A spatial range representing rectangle, circle, or a polygon.", 1127 - "type": "object", 1128 - "required": ["origin", "type", "unit"], 1129 - "properties": { 1130 - "height": { 1131 - "description": "The height of a rectnagle.\n\nThis field can be ignored for circles and polygons.", 1132 - "type": ["number", "null"], 1133 - "format": "double" 1134 - }, 1135 - "inside": { 1136 - "description": "If the range is inside the shape.\n\nThe default value is true.", 1137 - "type": ["boolean", "null"] 1138 - }, 1139 - "origin": { 1140 - "description": "THe origin of the coordinate in the shape.", 1141 - "allOf": [ 1142 - { 1143 - "$ref": "#/definitions/Coordinate" 1144 - } 1145 - ] 1146 - }, 1147 - "type": { 1148 - "description": "The type of shape.", 1149 - "allOf": [ 1150 - { 1151 - "$ref": "#/definitions/ShapeType" 1152 - } 1153 - ] 1154 - }, 1155 - "unit": { 1156 - "description": "The type of unit for the shape range.", 1157 - "allOf": [ 1158 - { 1159 - "$ref": "#/definitions/UnitType" 1160 - } 1161 - ] 1162 - }, 1163 - "vertices": { 1164 - "description": "The vertices of the polygon.\n\nThis field can be ignored for rectangles and circles.", 1165 - "type": ["array", "null"], 1166 - "items": { 1167 - "$ref": "#/definitions/Coordinate" 1168 - } 1169 - }, 1170 - "width": { 1171 - "description": "The width for rectangles or diameter for circles.\n\nThis field can be ignored for polygons.", 1172 - "type": ["number", "null"], 1173 - "format": "double" 1174 - } 1175 - } 1176 - }, 1177 - "ShapeType": { 1178 - "description": "The type of shape for the range.", 1179 - "oneOf": [ 1180 - { 1181 - "description": "A rectangle.", 1182 - "type": "string", 1183 - "enum": ["rectangle"] 1184 - }, 1185 - { 1186 - "description": "A circle.", 1187 - "type": "string", 1188 - "enum": ["circle"] 1189 - }, 1190 - { 1191 - "description": "A polygon.", 1192 - "type": "string", 1193 - "enum": ["polygon"] 1194 - } 1195 - ] 1196 - }, 1197 - "SignatureInfo": { 1198 - "description": "Holds information about a signature", 1199 - "type": "object", 1200 - "properties": { 1201 - "alg": { 1202 - "description": "Human-readable issuing authority for this signature.", 1203 - "anyOf": [ 1204 - { 1205 - "$ref": "#/definitions/SigningAlg" 1206 - }, 1207 - { 1208 - "type": "null" 1209 - } 1210 - ] 1211 - }, 1212 - "cert_serial_number": { 1213 - "description": "The serial number of the certificate.", 1214 - "type": ["string", "null"] 1215 - }, 1216 - "issuer": { 1217 - "description": "Human-readable issuing authority for this signature.", 1218 - "type": ["string", "null"] 1219 - }, 1220 - "revocation_status": { 1221 - "description": "Revocation status of the certificate.", 1222 - "type": ["boolean", "null"] 1223 - }, 1224 - "time": { 1225 - "description": "The time the signature was created.", 1226 - "type": ["string", "null"] 1227 - } 1228 - } 1229 - }, 1230 - "SigningAlg": { 1231 - "description": "Describes the digital signature algorithms allowed by the C2PA spec.\n\nPer [§13.2, “Digital Signatures”]:\n\n> All digital signatures applied as per the technical requirements of this > specification shall be generated using one of the digital signature > algorithms and key types listed as described in this section.\n\n[§13.2, “Digital Signatures”]: https://c2pa.org/specifications/specifications/2.1/specs/C2PA_Specification.html#_digital_signatures", 1232 - "oneOf": [ 1233 - { 1234 - "description": "ECDSA with SHA-256", 1235 - "type": "string", 1236 - "enum": ["Es256"] 1237 - }, 1238 - { 1239 - "description": "ECDSA with SHA-256 on secp256k1 curve", 1240 - "type": "string", 1241 - "enum": ["Es256K"] 1242 - }, 1243 - { 1244 - "description": "ECDSA with SHA-384", 1245 - "type": "string", 1246 - "enum": ["Es384"] 1247 - }, 1248 - { 1249 - "description": "ECDSA with SHA-512", 1250 - "type": "string", 1251 - "enum": ["Es512"] 1252 - }, 1253 - { 1254 - "description": "RSASSA-PSS using SHA-256 and MGF1 with SHA-256", 1255 - "type": "string", 1256 - "enum": ["Ps256"] 1257 - }, 1258 - { 1259 - "description": "RSASSA-PSS using SHA-384 and MGF1 with SHA-384", 1260 - "type": "string", 1261 - "enum": ["Ps384"] 1262 - }, 1263 - { 1264 - "description": "RSASSA-PSS using SHA-512 and MGF1 with SHA-512", 1265 - "type": "string", 1266 - "enum": ["Ps512"] 1267 - }, 1268 - { 1269 - "description": "Edwards-Curve DSA (Ed25519 instance only)", 1270 - "type": "string", 1271 - "enum": ["Ed25519"] 1272 - } 1273 - ] 1274 - }, 1275 - "StatusCodes": { 1276 - "description": "Contains a set of success, informational, and failure validation status codes.", 1277 - "type": "object", 1278 - "required": ["failure", "informational", "success"], 1279 - "properties": { 1280 - "failure": { 1281 - "type": "array", 1282 - "items": { 1283 - "$ref": "#/definitions/ValidationStatus" 1284 - } 1285 - }, 1286 - "informational": { 1287 - "type": "array", 1288 - "items": { 1289 - "$ref": "#/definitions/ValidationStatus" 1290 - } 1291 - }, 1292 - "success": { 1293 - "type": "array", 1294 - "items": { 1295 - "$ref": "#/definitions/ValidationStatus" 1296 - } 1297 - } 1298 - } 1299 - }, 1300 - "Text": { 1301 - "description": "A textual range representing multiple (possibly discontinuous) ranges of text.", 1302 - "type": "object", 1303 - "required": ["selectors"], 1304 - "properties": { 1305 - "selectors": { 1306 - "description": "The ranges of text to select.", 1307 - "type": "array", 1308 - "items": { 1309 - "$ref": "#/definitions/TextSelectorRange" 1310 - } 1311 - } 1312 - } 1313 - }, 1314 - "TextSelector": { 1315 - "description": "Selects a range of text via a fragment identifier.\n\nThis is modeled after the W3C Web Annotation selector model.", 1316 - "type": "object", 1317 - "required": ["fragment"], 1318 - "properties": { 1319 - "end": { 1320 - "description": "The end character offset or the end of the fragment if not present.", 1321 - "type": ["integer", "null"], 1322 - "format": "int32" 1323 - }, 1324 - "fragment": { 1325 - "description": "Fragment identifier as per RFC3023 (XML) or ISO 32000-2 (PDF), Annex O.", 1326 - "type": "string" 1327 - }, 1328 - "start": { 1329 - "description": "The start character offset or the start of the fragment if not present.", 1330 - "type": ["integer", "null"], 1331 - "format": "int32" 1332 - } 1333 - } 1334 - }, 1335 - "TextSelectorRange": { 1336 - "description": "One or two [`TextSelector`][TextSelector] identifiying the range to select.", 1337 - "type": "object", 1338 - "required": ["selector"], 1339 - "properties": { 1340 - "end": { 1341 - "description": "The end of the text range.", 1342 - "anyOf": [ 1343 - { 1344 - "$ref": "#/definitions/TextSelector" 1345 - }, 1346 - { 1347 - "type": "null" 1348 - } 1349 - ] 1350 - }, 1351 - "selector": { 1352 - "description": "The start (or entire) text range.", 1353 - "allOf": [ 1354 - { 1355 - "$ref": "#/definitions/TextSelector" 1356 - } 1357 - ] 1358 - } 1359 - } 1360 - }, 1361 - "Time": { 1362 - "description": "A temporal range representing a starting time to an ending time.", 1363 - "type": "object", 1364 - "properties": { 1365 - "end": { 1366 - "description": "The end time or the end of the asset if not present.", 1367 - "type": ["string", "null"] 1368 - }, 1369 - "start": { 1370 - "description": "The start time or the start of the asset if not present.", 1371 - "type": ["string", "null"] 1372 - }, 1373 - "type": { 1374 - "description": "The type of time.", 1375 - "default": "npt", 1376 - "allOf": [ 1377 - { 1378 - "$ref": "#/definitions/TimeType" 1379 - } 1380 - ] 1381 - } 1382 - } 1383 - }, 1384 - "TimeType": { 1385 - "description": "The type of time.", 1386 - "oneOf": [ 1387 - { 1388 - "description": "Times are described using Normal Play Time (npt) as described in RFC 2326.", 1389 - "type": "string", 1390 - "enum": ["npt"] 1391 - } 1392 - ] 1393 - }, 1394 - "UnitType": { 1395 - "description": "The type of unit for the range.", 1396 - "oneOf": [ 1397 - { 1398 - "description": "Use pixels.", 1399 - "type": "string", 1400 - "enum": ["pixel"] 1401 - }, 1402 - { 1403 - "description": "Use percentage.", 1404 - "type": "string", 1405 - "enum": ["percent"] 1406 - } 1407 - ] 1408 - }, 1409 - "UriOrResource": { 1410 - "anyOf": [ 1411 - { 1412 - "$ref": "#/definitions/ResourceRef" 1413 - }, 1414 - { 1415 - "$ref": "#/definitions/HashedUri" 1416 - } 1417 - ] 1418 - }, 1419 - "ValidationResults": { 1420 - "description": "A map of validation results for a manifest store.\n\nThe map contains the validation results for the active manifest and any ingredient deltas. It is normal for there to be many", 1421 - "type": "object", 1422 - "properties": { 1423 - "activeManifest": { 1424 - "anyOf": [ 1425 - { 1426 - "$ref": "#/definitions/StatusCodes" 1427 - }, 1428 - { 1429 - "type": "null" 1430 - } 1431 - ] 1432 - }, 1433 - "ingredientDeltas": { 1434 - "type": ["array", "null"], 1435 - "items": { 1436 - "$ref": "#/definitions/IngredientDeltaValidationResult" 1437 - } 1438 - } 1439 - } 1440 - }, 1441 - "ValidationState": { 1442 - "description": "Indicates if the manifest store is valid and trusted.\n\nThe Trusted state implies the manifest store is valid and the active signature is trusted.", 1443 - "oneOf": [ 1444 - { 1445 - "description": "Errors were found in the manifest store.", 1446 - "type": "string", 1447 - "enum": ["Invalid"] 1448 - }, 1449 - { 1450 - "description": "No errors were found in validation, but the active signature is not trusted.", 1451 - "type": "string", 1452 - "enum": ["Valid"] 1453 - }, 1454 - { 1455 - "description": "The manifest store is valid and the active signature is trusted.", 1456 - "type": "string", 1457 - "enum": ["Trusted"] 1458 - } 1459 - ] 1460 - }, 1461 - "ValidationStatus": { 1462 - "description": "A `ValidationStatus` struct describes the validation status of a specific part of a manifest.\n\nSee <https://c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_existing_manifests>.", 1463 - "type": "object", 1464 - "required": ["code"], 1465 - "properties": { 1466 - "code": { 1467 - "type": "string" 1468 - }, 1469 - "explanation": { 1470 - "type": ["string", "null"] 1471 - }, 1472 - "success": { 1473 - "writeOnly": true, 1474 - "type": ["boolean", "null"] 1475 - }, 1476 - "url": { 1477 - "type": ["string", "null"] 1478 - } 1479 - } 1480 - } 1481 - } 1482 - }
+305 -1
pnpm-lock.yaml
··· 17 17 prettier-plugin-organize-imports: 18 18 specifier: ^4.1.0 19 19 version: 4.1.0(prettier@3.4.2)(typescript@5.8.3) 20 + quicktype: 21 + specifier: ^23.2.6 22 + version: 23.2.6(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13) 20 23 devDependencies: 21 24 '@atproto/lex-cli': 22 25 specifier: ^0.9.4 ··· 2425 2428 '@gar/promisify@1.1.3': 2426 2429 resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} 2427 2430 2431 + '@glideapps/ts-necessities@2.2.3': 2432 + resolution: {integrity: sha512-gXi0awOZLHk3TbW55GZLCPP6O+y/b5X1pBXKBVckFONSwF1z1E5ND2BGJsghQFah+pW7pkkyFb2VhUQI2qhL5w==} 2433 + 2434 + '@glideapps/ts-necessities@2.4.0': 2435 + resolution: {integrity: sha512-mDC+qosuNa4lxR3ioMBb6CD0XLRsQBplU+zRPUYiMLXKeVPZ6UYphdNG/EGReig0YyfnVlBKZEXl1wzTotYmPA==} 2436 + 2428 2437 '@google-cloud/firestore@7.9.0': 2429 2438 resolution: {integrity: sha512-c4ALHT3G08rV7Zwv8Z2KG63gZh66iKdhCBeDfCpIkLrjX6EAjTD/szMdj14M+FnQuClZLFfW5bAgoOjfNmLtJg==} 2430 2439 engines: {node: '>=14.0.0'} ··· 2732 2741 resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} 2733 2742 engines: {node: '>= 12.13.0'} 2734 2743 2744 + '@mark.probst/typescript-json-schema@0.55.0': 2745 + resolution: {integrity: sha512-jI48mSnRgFQxXiE/UTUCVCpX8lK3wCFKLF1Ss2aEreboKNuLQGt3e0/YFqWVHe/WENxOaqiJvwOz+L/SrN2+qQ==} 2746 + hasBin: true 2747 + 2735 2748 '@mdx-js/mdx@3.1.0': 2736 2749 resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==} 2737 2750 ··· 4475 4488 '@types/node-forge@1.3.11': 4476 4489 resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} 4477 4490 4491 + '@types/node@16.18.126': 4492 + resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} 4493 + 4478 4494 '@types/node@17.0.45': 4479 4495 resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} 4480 4496 ··· 4924 4940 resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 4925 4941 engines: {node: '>= 0.4'} 4926 4942 4943 + array-back@3.1.0: 4944 + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} 4945 + engines: {node: '>=6'} 4946 + 4947 + array-back@6.2.2: 4948 + resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} 4949 + engines: {node: '>=12.17'} 4950 + 4927 4951 array-buffer-byte-length@1.0.1: 4928 4952 resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 4929 4953 engines: {node: '>= 0.4'} ··· 5268 5292 brotli@1.3.3: 5269 5293 resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} 5270 5294 5295 + browser-or-node@3.0.0: 5296 + resolution: {integrity: sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==} 5297 + 5271 5298 browserslist@4.24.2: 5272 5299 resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} 5273 5300 engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} ··· 5420 5447 ccount@2.0.1: 5421 5448 resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 5422 5449 5450 + chalk-template@0.4.0: 5451 + resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} 5452 + engines: {node: '>=12'} 5453 + 5423 5454 chalk@2.4.2: 5424 5455 resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 5425 5456 engines: {node: '>=4'} ··· 5606 5637 collapse-white-space@2.1.0: 5607 5638 resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} 5608 5639 5640 + collection-utils@1.0.1: 5641 + resolution: {integrity: sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==} 5642 + 5609 5643 color-contrast-checker@2.1.0: 5610 5644 resolution: {integrity: sha512-6Y0aIEej3pwZTVlicIqVzhO6T4izDWouaIXnYoDdTuFFAMQ9nnN0dgHNP9J94jRnH6asjPq1/wzUKxwoNbWtRQ==} 5611 5645 ··· 5653 5687 command-exists@1.2.9: 5654 5688 resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} 5655 5689 5690 + command-line-args@5.2.1: 5691 + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} 5692 + engines: {node: '>=4.0.0'} 5693 + 5694 + command-line-usage@7.0.3: 5695 + resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} 5696 + engines: {node: '>=12.20.0'} 5697 + 5656 5698 commander@12.1.0: 5657 5699 resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 5658 5700 engines: {node: '>=18'} ··· 5823 5865 5824 5866 cross-fetch@3.2.0: 5825 5867 resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} 5868 + 5869 + cross-fetch@4.1.0: 5870 + resolution: {integrity: sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==} 5826 5871 5827 5872 cross-spawn@6.0.5: 5828 5873 resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} ··· 6877 6922 finalhandler@1.3.1: 6878 6923 resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} 6879 6924 engines: {node: '>= 0.8'} 6925 + 6926 + find-replace@3.0.0: 6927 + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} 6928 + engines: {node: '>=4.0.0'} 6880 6929 6881 6930 find-up@2.1.0: 6882 6931 resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} ··· 7280 7329 graphemer@1.4.0: 7281 7330 resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 7282 7331 7332 + graphql@0.11.7: 7333 + resolution: {integrity: sha512-x7uDjyz8Jx+QPbpCFCMQ8lltnQa4p4vSYHx6ADe8rVYRTdsyhCJbvSty5DAsLVmU6cGakl+r8HQYolKHxk/tiw==} 7334 + deprecated: 'No longer supported; please update to a newer version. Details: https://github.com/graphql/graphql-js#version-support' 7335 + 7283 7336 gtoken@7.1.0: 7284 7337 resolution: {integrity: sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==} 7285 7338 engines: {node: '>=14.0.0'} ··· 7945 7998 resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 7946 7999 engines: {node: '>=8'} 7947 8000 8001 + iterall@1.1.3: 8002 + resolution: {integrity: sha512-Cu/kb+4HiNSejAPhSaN1VukdNTTi/r4/e+yykqjlG/IW+1gZH5b4+Bq3whDX4tvbYugta3r8KTMUiqT3fIGxuQ==} 8003 + 7948 8004 jackspeak@3.4.1: 7949 8005 resolution: {integrity: sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==} 7950 8006 engines: {node: '>=18'} ··· 8015 8071 resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 8016 8072 engines: {node: '>=10'} 8017 8073 8074 + js-base64@3.7.8: 8075 + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} 8076 + 8018 8077 js-tokens@4.0.0: 8019 8078 resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 8020 8079 ··· 9007 9066 resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} 9008 9067 engines: {node: '>=0.10.0'} 9009 9068 9069 + moment@2.30.1: 9070 + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 9071 + 9010 9072 mrmime@2.0.1: 9011 9073 resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 9012 9074 engines: {node: '>=10'} ··· 9515 9577 pako@0.2.9: 9516 9578 resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} 9517 9579 9580 + pako@1.0.11: 9581 + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 9582 + 9518 9583 param-case@3.0.4: 9519 9584 resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} 9520 9585 ··· 9580 9645 9581 9646 path-browserify@1.0.1: 9582 9647 resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 9648 + 9649 + path-equal@1.2.5: 9650 + resolution: {integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==} 9583 9651 9584 9652 path-exists@3.0.0: 9585 9653 resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} ··· 9744 9812 resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} 9745 9813 engines: {node: '>=10.4.0'} 9746 9814 9815 + pluralize@8.0.0: 9816 + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} 9817 + engines: {node: '>=4'} 9818 + 9747 9819 pngjs@3.4.0: 9748 9820 resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} 9749 9821 engines: {node: '>=4.0.0'} ··· 10001 10073 resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 10002 10074 engines: {node: '>=10'} 10003 10075 10076 + quicktype-core@23.2.6: 10077 + resolution: {integrity: sha512-asfeSv7BKBNVb9WiYhFRBvBZHcRutPRBwJMxW0pefluK4kkKu4lv0IvZBwFKvw2XygLcL1Rl90zxWDHYgkwCmA==} 10078 + 10079 + quicktype-graphql-input@23.2.6: 10080 + resolution: {integrity: sha512-jHQ8XrEaccZnWA7h/xqUQhfl+0mR5o91T6k3I4QhlnZSLdVnbycrMq4FHa9EaIFcai783JKwSUl1+koAdJq4pg==} 10081 + 10082 + quicktype-typescript-input@23.2.6: 10083 + resolution: {integrity: sha512-dCNMxR+7PGs9/9Tsth9H6LOQV1G+Tv4sUGT8ZUfDRJ5Hq371qOYLma5BnLX6VxkPu8JT7mAMpQ9VFlxstX6Qaw==} 10084 + 10085 + quicktype@23.2.6: 10086 + resolution: {integrity: sha512-rlD1jF71bOmDn6SQ/ToLuuRkMQ7maxo5oVTn5dPCl11ymqoJCFCvl7FzRfh+fkDFmWt2etl+JiIEdWImLxferA==} 10087 + engines: {node: '>=18.12.0'} 10088 + hasBin: true 10089 + 10004 10090 quietjs-bundle@0.1.3: 10005 10091 resolution: {integrity: sha512-GLhOwkusINwCLY1tCW20jmWGeo8cDKYya8SYUoS2UPd3ZoHjyATAxcd8wEA0V32tQfmQ4KledpF/9ri+9y+6yA==} 10006 10092 ··· 10916 11002 resolution: {integrity: sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==} 10917 11003 engines: {node: '>= 0.10.0'} 10918 11004 11005 + stream-chain@2.2.5: 11006 + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} 11007 + 10919 11008 stream-events@1.0.5: 10920 11009 resolution: {integrity: sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==} 10921 11010 10922 11011 stream-http@3.2.0: 10923 11012 resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} 11013 + 11014 + stream-json@1.8.0: 11015 + resolution: {integrity: sha512-HZfXngYHUAr1exT4fxlbc1IOce1RYxp2ldeaf97LYCOPSoOqY/1Psp7iGvpb+6JIOgkra9zDYnPX01hGAHzEPw==} 10924 11016 10925 11017 stream-replace-string@2.0.0: 10926 11018 resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} ··· 10938 11030 string-argv@0.3.2: 10939 11031 resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} 10940 11032 engines: {node: '>=0.6.19'} 11033 + 11034 + string-to-stream@3.0.1: 11035 + resolution: {integrity: sha512-Hl092MV3USJuUCC6mfl9sPzGloA3K5VwdIeJjYIkXY/8K+mUvaeEabWJgArp+xXrsWxCajeT2pc4axbVhIZJyg==} 10941 11036 10942 11037 string-width@4.2.3: 10943 11038 resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} ··· 11099 11194 supports-preserve-symlinks-flag@1.0.0: 11100 11195 resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 11101 11196 engines: {node: '>= 0.4'} 11197 + 11198 + table-layout@4.1.1: 11199 + resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} 11200 + engines: {node: '>=12.17'} 11102 11201 11103 11202 tapable@2.2.1: 11104 11203 resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} ··· 11437 11536 typedarray@0.0.6: 11438 11537 resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} 11439 11538 11539 + typescript@4.9.4: 11540 + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} 11541 + engines: {node: '>=4.2.0'} 11542 + hasBin: true 11543 + 11544 + typescript@4.9.5: 11545 + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} 11546 + engines: {node: '>=4.2.0'} 11547 + hasBin: true 11548 + 11440 11549 typescript@5.3.3: 11441 11550 resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 11442 11551 engines: {node: '>=14.17'} ··· 11452 11561 engines: {node: '>=14.17'} 11453 11562 hasBin: true 11454 11563 11564 + typical@4.0.0: 11565 + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} 11566 + engines: {node: '>=8'} 11567 + 11568 + typical@7.3.0: 11569 + resolution: {integrity: sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==} 11570 + engines: {node: '>=12.17'} 11571 + 11455 11572 ua-parser-js@1.0.38: 11456 11573 resolution: {integrity: sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==} 11457 11574 11458 11575 ua-parser-js@2.0.0-rc.1: 11459 11576 resolution: {integrity: sha512-H+kTJv7j04XbMuASIIrp7TwKj8rVHfGLR9dI36FAWneGHyQ6JZVwFukFgxSyM/OChmk7dxsV82R/tnEQxb1EXg==} 11577 + deprecated: You are using an early pre-release version of ua-parser-js v2.x which may be unstable. Please update to the latest stable ua-parser-js v2.x release (https://uaparser.dev) 11460 11578 hasBin: true 11461 11579 11462 11580 uc.micro@1.0.6: ··· 11672 11790 11673 11791 uri-js@4.4.1: 11674 11792 resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 11793 + 11794 + urijs@1.19.11: 11795 + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} 11675 11796 11676 11797 url-template@3.1.1: 11677 11798 resolution: {integrity: sha512-4oszoaEKE/mQOtAmdMWqIRHmkxWkUZMnXFnjQ5i01CuRSK3uluxcH1MRVVVWmhlnzT1SCDfKxxficm2G37qzCA==} ··· 11980 12101 11981 12102 wordwrap@1.0.0: 11982 12103 resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} 12104 + 12105 + wordwrapjs@5.1.0: 12106 + resolution: {integrity: sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==} 12107 + engines: {node: '>=12.17'} 11983 12108 11984 12109 wrap-ansi@6.2.0: 11985 12110 resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} ··· 15641 15766 15642 15767 '@gar/promisify@1.1.3': {} 15643 15768 15769 + '@glideapps/ts-necessities@2.2.3': {} 15770 + 15771 + '@glideapps/ts-necessities@2.4.0': {} 15772 + 15644 15773 '@google-cloud/firestore@7.9.0(encoding@0.1.13)': 15645 15774 dependencies: 15646 15775 fast-deep-equal: 3.1.3 ··· 16046 16175 dependencies: 16047 16176 cross-spawn: 7.0.3 16048 16177 16178 + '@mark.probst/typescript-json-schema@0.55.0(@swc/core@1.8.0(@swc/helpers@0.5.17))': 16179 + dependencies: 16180 + '@types/json-schema': 7.0.15 16181 + '@types/node': 16.18.126 16182 + glob: 7.2.3 16183 + path-equal: 1.2.5 16184 + safe-stable-stringify: 2.5.0 16185 + ts-node: 10.9.2(@swc/core@1.8.0(@swc/helpers@0.5.17))(@types/node@16.18.126)(typescript@4.9.4) 16186 + typescript: 4.9.4 16187 + yargs: 17.7.2 16188 + transitivePeerDependencies: 16189 + - '@swc/core' 16190 + - '@swc/wasm' 16191 + 16049 16192 '@mdx-js/mdx@3.1.0(acorn@8.14.1)': 16050 16193 dependencies: 16051 16194 '@types/estree': 1.0.7 ··· 18110 18253 dependencies: 18111 18254 '@types/node': 22.15.17 18112 18255 18256 + '@types/node@16.18.126': {} 18257 + 18113 18258 '@types/node@17.0.45': {} 18114 18259 18115 18260 '@types/node@20.16.5': ··· 18616 18761 18617 18762 aria-query@5.3.2: {} 18618 18763 18764 + array-back@3.1.0: {} 18765 + 18766 + array-back@6.2.2: {} 18767 + 18619 18768 array-buffer-byte-length@1.0.1: 18620 18769 dependencies: 18621 18770 call-bind: 1.0.7 ··· 19164 19313 dependencies: 19165 19314 base64-js: 1.5.1 19166 19315 19316 + browser-or-node@3.0.0: {} 19317 + 19167 19318 browserslist@4.24.2: 19168 19319 dependencies: 19169 19320 caniuse-lite: 1.0.30001677 ··· 19353 19504 19354 19505 ccount@2.0.1: {} 19355 19506 19507 + chalk-template@0.4.0: 19508 + dependencies: 19509 + chalk: 4.1.2 19510 + 19356 19511 chalk@2.4.2: 19357 19512 dependencies: 19358 19513 ansi-styles: 3.2.1 ··· 19530 19685 19531 19686 collapse-white-space@2.1.0: {} 19532 19687 19688 + collection-utils@1.0.1: {} 19689 + 19533 19690 color-contrast-checker@2.1.0: {} 19534 19691 19535 19692 color-convert@0.5.3: ··· 19574 19731 19575 19732 command-exists@1.2.9: {} 19576 19733 19734 + command-line-args@5.2.1: 19735 + dependencies: 19736 + array-back: 3.1.0 19737 + find-replace: 3.0.0 19738 + lodash.camelcase: 4.3.0 19739 + typical: 4.0.0 19740 + 19741 + command-line-usage@7.0.3: 19742 + dependencies: 19743 + array-back: 6.2.2 19744 + chalk-template: 0.4.0 19745 + table-layout: 4.1.1 19746 + typical: 7.3.0 19747 + 19577 19748 commander@12.1.0: {} 19578 19749 19579 19750 commander@2.20.3: {} ··· 19755 19926 transitivePeerDependencies: 19756 19927 - encoding 19757 19928 19929 + cross-fetch@4.1.0(encoding@0.1.13): 19930 + dependencies: 19931 + node-fetch: 2.7.0(encoding@0.1.13) 19932 + transitivePeerDependencies: 19933 + - encoding 19934 + 19758 19935 cross-spawn@6.0.5: 19759 19936 dependencies: 19760 19937 nice-try: 1.0.5 ··· 21137 21314 transitivePeerDependencies: 21138 21315 - supports-color 21139 21316 21317 + find-replace@3.0.0: 21318 + dependencies: 21319 + array-back: 3.1.0 21320 + 21140 21321 find-up@2.1.0: 21141 21322 dependencies: 21142 21323 locate-path: 2.0.0 ··· 21702 21883 21703 21884 graphemer@1.4.0: {} 21704 21885 21886 + graphql@0.11.7: 21887 + dependencies: 21888 + iterall: 1.1.3 21889 + 21705 21890 gtoken@7.1.0(encoding@0.1.13): 21706 21891 dependencies: 21707 21892 gaxios: 6.7.0(encoding@0.1.13) ··· 22503 22688 transitivePeerDependencies: 22504 22689 - supports-color 22505 22690 22691 + iterall@1.1.3: {} 22692 + 22506 22693 jackspeak@3.4.1: 22507 22694 dependencies: 22508 22695 '@isaacs/cliui': 8.0.2 ··· 22611 22798 22612 22799 joycon@3.1.1: {} 22613 22800 22801 + js-base64@3.7.8: {} 22802 + 22614 22803 js-tokens@4.0.0: {} 22615 22804 22616 22805 js-yaml@3.14.1: ··· 24112 24301 24113 24302 modify-values@1.0.1: {} 24114 24303 24304 + moment@2.30.1: {} 24305 + 24115 24306 mrmime@2.0.1: {} 24116 24307 24117 24308 ms@2.0.0: {} ··· 24756 24947 24757 24948 pako@0.2.9: {} 24758 24949 24950 + pako@1.0.11: {} 24951 + 24759 24952 param-case@3.0.4: 24760 24953 dependencies: 24761 24954 dot-case: 3.0.4 ··· 24846 25039 cross-spawn: 7.0.3 24847 25040 24848 25041 path-browserify@1.0.1: {} 25042 + 25043 + path-equal@1.2.5: {} 24849 25044 24850 25045 path-exists@3.0.0: {} 24851 25046 ··· 24943 25138 24944 25139 pino-abstract-transport@1.2.0: 24945 25140 dependencies: 24946 - readable-stream: 4.5.2 25141 + readable-stream: 4.7.0 24947 25142 split2: 4.2.0 24948 25143 24949 25144 pino-http@8.6.1: ··· 24987 25182 base64-js: 1.5.1 24988 25183 xmlbuilder: 15.1.1 24989 25184 25185 + pluralize@8.0.0: {} 25186 + 24990 25187 pngjs@3.4.0: {} 24991 25188 24992 25189 pngjs@5.0.0: {} ··· 25216 25413 25217 25414 quick-lru@5.1.1: {} 25218 25415 25416 + quicktype-core@23.2.6(encoding@0.1.13): 25417 + dependencies: 25418 + '@glideapps/ts-necessities': 2.2.3 25419 + browser-or-node: 3.0.0 25420 + collection-utils: 1.0.1 25421 + cross-fetch: 4.1.0(encoding@0.1.13) 25422 + is-url: 1.2.4 25423 + js-base64: 3.7.8 25424 + lodash: 4.17.21 25425 + pako: 1.0.11 25426 + pluralize: 8.0.0 25427 + readable-stream: 4.5.2 25428 + unicode-properties: 1.4.1 25429 + urijs: 1.19.11 25430 + wordwrap: 1.0.0 25431 + yaml: 2.5.1 25432 + transitivePeerDependencies: 25433 + - encoding 25434 + 25435 + quicktype-graphql-input@23.2.6(encoding@0.1.13): 25436 + dependencies: 25437 + collection-utils: 1.0.1 25438 + graphql: 0.11.7 25439 + quicktype-core: 23.2.6(encoding@0.1.13) 25440 + transitivePeerDependencies: 25441 + - encoding 25442 + 25443 + quicktype-typescript-input@23.2.6(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13): 25444 + dependencies: 25445 + '@mark.probst/typescript-json-schema': 0.55.0(@swc/core@1.8.0(@swc/helpers@0.5.17)) 25446 + quicktype-core: 23.2.6(encoding@0.1.13) 25447 + typescript: 4.9.5 25448 + transitivePeerDependencies: 25449 + - '@swc/core' 25450 + - '@swc/wasm' 25451 + - encoding 25452 + 25453 + quicktype@23.2.6(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13): 25454 + dependencies: 25455 + '@glideapps/ts-necessities': 2.4.0 25456 + chalk: 4.1.2 25457 + collection-utils: 1.0.1 25458 + command-line-args: 5.2.1 25459 + command-line-usage: 7.0.3 25460 + cross-fetch: 4.1.0(encoding@0.1.13) 25461 + graphql: 0.11.7 25462 + lodash: 4.17.21 25463 + moment: 2.30.1 25464 + quicktype-core: 23.2.6(encoding@0.1.13) 25465 + quicktype-graphql-input: 23.2.6(encoding@0.1.13) 25466 + quicktype-typescript-input: 23.2.6(@swc/core@1.8.0(@swc/helpers@0.5.17))(encoding@0.1.13) 25467 + readable-stream: 4.7.0 25468 + stream-json: 1.8.0 25469 + string-to-stream: 3.0.1 25470 + typescript: 5.8.3 25471 + transitivePeerDependencies: 25472 + - '@swc/core' 25473 + - '@swc/wasm' 25474 + - encoding 25475 + 25219 25476 quietjs-bundle@0.1.3: 25220 25477 dependencies: 25221 25478 base64-arraybuffer: 1.0.2 ··· 26564 26821 26565 26822 stream-buffers@2.2.0: {} 26566 26823 26824 + stream-chain@2.2.5: {} 26825 + 26567 26826 stream-events@1.0.5: 26568 26827 dependencies: 26569 26828 stubs: 3.0.0 ··· 26576 26835 readable-stream: 3.6.2 26577 26836 xtend: 4.0.2 26578 26837 26838 + stream-json@1.8.0: 26839 + dependencies: 26840 + stream-chain: 2.2.5 26841 + 26579 26842 stream-replace-string@2.0.0: {} 26580 26843 26581 26844 stream-shift@1.0.3: ··· 26591 26854 strict-uri-encode@2.0.0: {} 26592 26855 26593 26856 string-argv@0.3.2: {} 26857 + 26858 + string-to-stream@3.0.1: 26859 + dependencies: 26860 + readable-stream: 3.6.2 26594 26861 26595 26862 string-width@4.2.3: 26596 26863 dependencies: ··· 26757 27024 supports-color: 7.2.0 26758 27025 26759 27026 supports-preserve-symlinks-flag@1.0.0: {} 27027 + 27028 + table-layout@4.1.1: 27029 + dependencies: 27030 + array-back: 6.2.2 27031 + wordwrapjs: 5.1.0 26760 27032 26761 27033 tapable@2.2.1: {} 26762 27034 ··· 26980 27252 '@ts-morph/common': 0.25.0 26981 27253 code-block-writer: 13.0.3 26982 27254 27255 + ts-node@10.9.2(@swc/core@1.8.0(@swc/helpers@0.5.17))(@types/node@16.18.126)(typescript@4.9.4): 27256 + dependencies: 27257 + '@cspotcode/source-map-support': 0.8.1 27258 + '@tsconfig/node10': 1.0.11 27259 + '@tsconfig/node12': 1.0.11 27260 + '@tsconfig/node14': 1.0.3 27261 + '@tsconfig/node16': 1.0.4 27262 + '@types/node': 16.18.126 27263 + acorn: 8.14.1 27264 + acorn-walk: 8.3.4 27265 + arg: 4.1.3 27266 + create-require: 1.1.1 27267 + diff: 4.0.2 27268 + make-error: 1.3.6 27269 + typescript: 4.9.4 27270 + v8-compile-cache-lib: 3.0.1 27271 + yn: 3.1.1 27272 + optionalDependencies: 27273 + '@swc/core': 1.8.0(@swc/helpers@0.5.17) 27274 + 26983 27275 ts-node@10.9.2(@swc/core@1.8.0(@swc/helpers@0.5.17))(@types/node@22.15.17)(typescript@5.6.3): 26984 27276 dependencies: 26985 27277 '@cspotcode/source-map-support': 0.8.1 ··· 27130 27422 27131 27423 typedarray@0.0.6: {} 27132 27424 27425 + typescript@4.9.4: {} 27426 + 27427 + typescript@4.9.5: {} 27428 + 27133 27429 typescript@5.3.3: {} 27134 27430 27135 27431 typescript@5.6.3: {} 27136 27432 27137 27433 typescript@5.8.3: {} 27434 + 27435 + typical@4.0.0: {} 27436 + 27437 + typical@7.3.0: {} 27138 27438 27139 27439 ua-parser-js@1.0.38: {} 27140 27440 ··· 27323 27623 uri-js@4.4.1: 27324 27624 dependencies: 27325 27625 punycode: 2.3.1 27626 + 27627 + urijs@1.19.11: {} 27326 27628 27327 27629 url-template@3.1.1: {} 27328 27630 ··· 27682 27984 word-wrap@1.2.5: {} 27683 27985 27684 27986 wordwrap@1.0.0: {} 27987 + 27988 + wordwrapjs@5.1.0: {} 27685 27989 27686 27990 wrap-ansi@6.2.0: 27687 27991 dependencies:
+22
rust/export-c2pa-schema/Cargo.toml
··· 1 + [package] 2 + name = "export_c2pa_schema" 3 + authors = ["Streamplace <support@stream.place>"] 4 + license = "MIT OR Apache-2.0" 5 + edition = "2018" 6 + rust-version = "1.86.0" 7 + 8 + [lints.rust] 9 + unexpected_cfgs = { level = "warn", check-cfg = ['cfg(test)'] } 10 + # Workaround for https://github.com/est31/cargo-udeps/issues/293. 11 + 12 + [dependencies] 13 + anyhow = "1.0.40" 14 + c2pa = { git = "https://github.com/hyphacoop/c2pa-rs.git", rev = "1b84d40219b27340a30fc309250e774e8a7b7761", features = [ 15 + "openssl", 16 + "file_io", 17 + "json_schema", 18 + ] } 19 + schemars = "0.8.21" 20 + serde_json = "1.0.117" 21 + serde = { version = "1.0.197", features = ["derive"] } 22 + serde_with = "3.11.0"
+6
rust/export-c2pa-schema/README.md
··· 1 + # export-schema 2 + 3 + This is our custom version of 4 + [the c2pa-rs json-schema exporter](https://github.com/contentauth/c2pa-rs/tree/2fef92a9602d749ec570edefb406745bd60a044b/export_schema) 5 + that exports everything into one file for easier use with type generation 6 + tooling.
+33
rust/export-c2pa-schema/src/main.rs
··· 1 + use std::{fs, path::Path}; 2 + 3 + use anyhow::Result; 4 + use c2pa::{Builder, ManifestDefinition, Reader}; 5 + use schemars::JsonSchema; 6 + use schemars::{schema::RootSchema, schema_for}; 7 + use serde::{Deserialize, Serialize}; 8 + use serde_with::skip_serializing_none; 9 + 10 + fn write_schema(schema: &RootSchema, name: &str) { 11 + println!("Exporting JSON schema for {name}"); 12 + let output = serde_json::to_string_pretty(schema).expect("Failed to serialize schema"); 13 + let output_dir = Path::new("./target/schema"); 14 + fs::create_dir_all(output_dir).expect("Could not create schema directory"); 15 + let output_path = output_dir.join(format!("{name}.schema.json")); 16 + fs::write(&output_path, output).expect("Unable to write schema"); 17 + println!("Wrote schema to {}", output_path.display()); 18 + } 19 + 20 + #[skip_serializing_none] 21 + #[derive(Debug, Default, Deserialize, Serialize, JsonSchema)] 22 + pub struct Everything { 23 + pub builder: Builder, 24 + pub manifest_definition: ManifestDefinition, 25 + pub reader: Reader, 26 + } 27 + 28 + fn main() -> Result<()> { 29 + let everything = schema_for!(Everything); 30 + write_schema(&everything, "C2PA"); 31 + 32 + Ok(()) 33 + }