@tiangong-ai/cli 0.0.51 → 0.0.55
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/AGENTS.md +22 -2
- package/README.md +171 -7
- package/dist/cli.js +10 -1
- package/dist/cli.js.map +1 -1
- package/dist/data/builtins.d.ts +1 -0
- package/dist/data/builtins.js +40 -0
- package/dist/data/builtins.js.map +1 -0
- package/dist/data/catalog.d.ts +25 -0
- package/dist/data/catalog.js +305 -0
- package/dist/data/catalog.js.map +1 -0
- package/dist/data/commands.d.ts +9 -0
- package/dist/data/commands.js +307 -0
- package/dist/data/commands.js.map +1 -0
- package/dist/data/connectors/airnow-hourly-observations.d.ts +2 -0
- package/dist/data/connectors/airnow-hourly-observations.js +522 -0
- package/dist/data/connectors/airnow-hourly-observations.js.map +1 -0
- package/dist/data/connectors/airnow-hourly-observations.schemas.d.ts +299 -0
- package/dist/data/connectors/airnow-hourly-observations.schemas.js +188 -0
- package/dist/data/connectors/airnow-hourly-observations.schemas.js.map +1 -0
- package/dist/data/connectors/bluesky-public-posts.d.ts +2 -0
- package/dist/data/connectors/bluesky-public-posts.js +705 -0
- package/dist/data/connectors/bluesky-public-posts.js.map +1 -0
- package/dist/data/connectors/bluesky-public-posts.schemas.d.ts +733 -0
- package/dist/data/connectors/bluesky-public-posts.schemas.js +422 -0
- package/dist/data/connectors/bluesky-public-posts.schemas.js.map +1 -0
- package/dist/data/connectors/epa-eis-records.d.ts +2 -0
- package/dist/data/connectors/epa-eis-records.js +566 -0
- package/dist/data/connectors/epa-eis-records.js.map +1 -0
- package/dist/data/connectors/epa-eis-records.schemas.d.ts +199 -0
- package/dist/data/connectors/epa-eis-records.schemas.js +146 -0
- package/dist/data/connectors/epa-eis-records.schemas.js.map +1 -0
- package/dist/data/connectors/federal-register-documents.d.ts +2 -0
- package/dist/data/connectors/federal-register-documents.js +517 -0
- package/dist/data/connectors/federal-register-documents.js.map +1 -0
- package/dist/data/connectors/federal-register-documents.schemas.d.ts +357 -0
- package/dist/data/connectors/federal-register-documents.schemas.js +243 -0
- package/dist/data/connectors/federal-register-documents.schemas.js.map +1 -0
- package/dist/data/connectors/gdelt-doc-search.d.ts +2 -0
- package/dist/data/connectors/gdelt-doc-search.js +658 -0
- package/dist/data/connectors/gdelt-doc-search.js.map +1 -0
- package/dist/data/connectors/gdelt-doc-search.schemas.d.ts +446 -0
- package/dist/data/connectors/gdelt-doc-search.schemas.js +330 -0
- package/dist/data/connectors/gdelt-doc-search.schemas.js.map +1 -0
- package/dist/data/connectors/gdelt-file-feeds.d.ts +4 -0
- package/dist/data/connectors/gdelt-file-feeds.js +591 -0
- package/dist/data/connectors/gdelt-file-feeds.js.map +1 -0
- package/dist/data/connectors/gdelt-file-feeds.schemas.d.ts +40 -0
- package/dist/data/connectors/gdelt-file-feeds.schemas.js +256 -0
- package/dist/data/connectors/gdelt-file-feeds.schemas.js.map +1 -0
- package/dist/data/connectors/nasa-firms-fire.d.ts +2 -0
- package/dist/data/connectors/nasa-firms-fire.js +578 -0
- package/dist/data/connectors/nasa-firms-fire.js.map +1 -0
- package/dist/data/connectors/nasa-firms-fire.schemas.d.ts +369 -0
- package/dist/data/connectors/nasa-firms-fire.schemas.js +238 -0
- package/dist/data/connectors/nasa-firms-fire.schemas.js.map +1 -0
- package/dist/data/connectors/open-meteo-air-quality.d.ts +2 -0
- package/dist/data/connectors/open-meteo-air-quality.js +401 -0
- package/dist/data/connectors/open-meteo-air-quality.js.map +1 -0
- package/dist/data/connectors/open-meteo-air-quality.schemas.d.ts +335 -0
- package/dist/data/connectors/open-meteo-air-quality.schemas.js +225 -0
- package/dist/data/connectors/open-meteo-air-quality.schemas.js.map +1 -0
- package/dist/data/connectors/open-meteo-flood.d.ts +2 -0
- package/dist/data/connectors/open-meteo-flood.js +446 -0
- package/dist/data/connectors/open-meteo-flood.js.map +1 -0
- package/dist/data/connectors/open-meteo-flood.schemas.d.ts +388 -0
- package/dist/data/connectors/open-meteo-flood.schemas.js +227 -0
- package/dist/data/connectors/open-meteo-flood.schemas.js.map +1 -0
- package/dist/data/connectors/open-meteo-historical-weather.d.ts +2 -0
- package/dist/data/connectors/open-meteo-historical-weather.js +468 -0
- package/dist/data/connectors/open-meteo-historical-weather.js.map +1 -0
- package/dist/data/connectors/open-meteo-historical-weather.schemas.d.ts +420 -0
- package/dist/data/connectors/open-meteo-historical-weather.schemas.js +282 -0
- package/dist/data/connectors/open-meteo-historical-weather.schemas.js.map +1 -0
- package/dist/data/connectors/openaq-air-quality.d.ts +2 -0
- package/dist/data/connectors/openaq-air-quality.js +734 -0
- package/dist/data/connectors/openaq-air-quality.js.map +1 -0
- package/dist/data/connectors/openaq-air-quality.schemas.d.ts +1067 -0
- package/dist/data/connectors/openaq-air-quality.schemas.js +512 -0
- package/dist/data/connectors/openaq-air-quality.schemas.js.map +1 -0
- package/dist/data/connectors/regulations-gov-attachments.d.ts +2 -0
- package/dist/data/connectors/regulations-gov-attachments.js +486 -0
- package/dist/data/connectors/regulations-gov-attachments.js.map +1 -0
- package/dist/data/connectors/regulations-gov-attachments.schemas.d.ts +270 -0
- package/dist/data/connectors/regulations-gov-attachments.schemas.js +181 -0
- package/dist/data/connectors/regulations-gov-attachments.schemas.js.map +1 -0
- package/dist/data/connectors/regulations-gov-comments.d.ts +2 -0
- package/dist/data/connectors/regulations-gov-comments.js +718 -0
- package/dist/data/connectors/regulations-gov-comments.js.map +1 -0
- package/dist/data/connectors/regulations-gov-comments.schemas.d.ts +717 -0
- package/dist/data/connectors/regulations-gov-comments.schemas.js +389 -0
- package/dist/data/connectors/regulations-gov-comments.schemas.js.map +1 -0
- package/dist/data/connectors/usbr-project-records.d.ts +2 -0
- package/dist/data/connectors/usbr-project-records.js +467 -0
- package/dist/data/connectors/usbr-project-records.js.map +1 -0
- package/dist/data/connectors/usbr-project-records.schemas.d.ts +194 -0
- package/dist/data/connectors/usbr-project-records.schemas.js +137 -0
- package/dist/data/connectors/usbr-project-records.schemas.js.map +1 -0
- package/dist/data/connectors/usbr-rise.d.ts +2 -0
- package/dist/data/connectors/usbr-rise.js +625 -0
- package/dist/data/connectors/usbr-rise.js.map +1 -0
- package/dist/data/connectors/usbr-rise.schemas.d.ts +623 -0
- package/dist/data/connectors/usbr-rise.schemas.js +407 -0
- package/dist/data/connectors/usbr-rise.schemas.js.map +1 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.d.ts +2 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.js +521 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.js.map +1 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.schemas.d.ts +496 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.schemas.js +309 -0
- package/dist/data/connectors/usgs-water-instantaneous-values.schemas.js.map +1 -0
- package/dist/data/connectors/youtube-public-content.d.ts +2 -0
- package/dist/data/connectors/youtube-public-content.js +974 -0
- package/dist/data/connectors/youtube-public-content.js.map +1 -0
- package/dist/data/connectors/youtube-public-content.schemas.d.ts +773 -0
- package/dist/data/connectors/youtube-public-content.schemas.js +567 -0
- package/dist/data/connectors/youtube-public-content.schemas.js.map +1 -0
- package/dist/data/contracts.d.ts +374 -0
- package/dist/data/contracts.js +10 -0
- package/dist/data/contracts.js.map +1 -0
- package/dist/data/runtime/artifacts.d.ts +6 -0
- package/dist/data/runtime/artifacts.js +103 -0
- package/dist/data/runtime/artifacts.js.map +1 -0
- package/dist/data/runtime/bounded-http.d.ts +10 -0
- package/dist/data/runtime/bounded-http.js +403 -0
- package/dist/data/runtime/bounded-http.js.map +1 -0
- package/dist/data/runtime/canonical-json.d.ts +3 -0
- package/dist/data/runtime/canonical-json.js +59 -0
- package/dist/data/runtime/canonical-json.js.map +1 -0
- package/dist/data/runtime/credentials.d.ts +14 -0
- package/dist/data/runtime/credentials.js +67 -0
- package/dist/data/runtime/credentials.js.map +1 -0
- package/dist/data/runtime/csv.d.ts +4 -0
- package/dist/data/runtime/csv.js +51 -0
- package/dist/data/runtime/csv.js.map +1 -0
- package/dist/data/runtime/errors.d.ts +22 -0
- package/dist/data/runtime/errors.js +101 -0
- package/dist/data/runtime/errors.js.map +1 -0
- package/dist/data/runtime/execute.d.ts +11 -0
- package/dist/data/runtime/execute.js +358 -0
- package/dist/data/runtime/execute.js.map +1 -0
- package/dist/data/runtime/receipts.d.ts +13 -0
- package/dist/data/runtime/receipts.js +38 -0
- package/dist/data/runtime/receipts.js.map +1 -0
- package/dist/data/schemas/catalog.v1.json +73 -0
- package/dist/data/schemas/core-receipt.v1.json +117 -0
- package/dist/data/schemas/describe.v1.json +24 -0
- package/dist/data/schemas/discovery.v1.json +130 -0
- package/dist/data/schemas/doctor.v1.json +40 -0
- package/dist/data/schemas/error.v1.json +48 -0
- package/dist/data/schemas/manifest.v1.json +174 -0
- package/dist/data/schemas/run-request.v1.json +37 -0
- package/dist/data/schemas/run-result.v1.json +77 -0
- package/dist/data/schemas.d.ts +27 -0
- package/dist/data/schemas.js +69 -0
- package/dist/data/schemas.js.map +1 -0
- package/dist/env.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/http.js.map +1 -1
- package/dist/kb/config.js.map +1 -1
- package/dist/kb/pipeline-health.js.map +1 -1
- package/dist/research/orchestration.js +54 -7
- package/dist/research/orchestration.js.map +1 -1
- package/dist/research/workspace/acquisition.js.map +1 -1
- package/dist/research/workspace/audit-bundle.js +7 -2
- package/dist/research/workspace/audit-bundle.js.map +1 -1
- package/dist/research/workspace/broker.js.map +1 -1
- package/dist/research/workspace/constants.js.map +1 -1
- package/dist/research/workspace/credentials.d.ts +3 -0
- package/dist/research/workspace/credentials.js +20 -3
- package/dist/research/workspace/credentials.js.map +1 -1
- package/dist/research/workspace/data-evidence-adapter.d.ts +60 -0
- package/dist/research/workspace/data-evidence-adapter.js +314 -0
- package/dist/research/workspace/data-evidence-adapter.js.map +1 -0
- package/dist/research/workspace/discovery-status.js +10 -7
- package/dist/research/workspace/discovery-status.js.map +1 -1
- package/dist/research/workspace/discovery.js +12 -11
- package/dist/research/workspace/discovery.js.map +1 -1
- package/dist/research/workspace/evidence-ledger.d.ts +8 -1
- package/dist/research/workspace/evidence-ledger.js +46 -2
- package/dist/research/workspace/evidence-ledger.js.map +1 -1
- package/dist/research/workspace/evidence.d.ts +31 -0
- package/dist/research/workspace/evidence.js +77 -0
- package/dist/research/workspace/evidence.js.map +1 -1
- package/dist/research/workspace/executor.js.map +1 -1
- package/dist/research/workspace/external-skills.d.ts +49 -49
- package/dist/research/workspace/external-skills.js.map +1 -1
- package/dist/research/workspace/platform-capabilities.js.map +1 -1
- package/dist/research/workspace/preflight.d.ts +4 -4
- package/dist/research/workspace/preflight.js +33 -8
- package/dist/research/workspace/preflight.js.map +1 -1
- package/dist/research/workspace/projects.js.map +1 -1
- package/dist/research/workspace/publication.js.map +1 -1
- package/dist/research/workspace/research-policy-wizard.js.map +1 -1
- package/dist/research/workspace/research-policy.js.map +1 -1
- package/dist/research/workspace/runtime.d.ts +7 -0
- package/dist/research/workspace/runtime.js +77 -20
- package/dist/research/workspace/runtime.js.map +1 -1
- package/dist/research/workspace/sanitization.js.map +1 -1
- package/dist/research/workspace/schemas.js +1 -1
- package/dist/research/workspace/schemas.js.map +1 -1
- package/dist/research/workspace/scientific-design.js.map +1 -1
- package/dist/research/workspace/scientific-review.js.map +1 -1
- package/dist/research/workspace/setup-catalog.d.ts +9 -9
- package/dist/research/workspace/setup-catalog.js +2 -2
- package/dist/research/workspace/setup-catalog.js.map +1 -1
- package/dist/research/workspace/setup-declarative.js.map +1 -1
- package/dist/research/workspace/setup-instructions.d.ts +42 -0
- package/dist/research/workspace/setup-instructions.js +413 -0
- package/dist/research/workspace/setup-instructions.js.map +1 -0
- package/dist/research/workspace/setup-invocation.js.map +1 -1
- package/dist/research/workspace/setup-wizard.js +7 -0
- package/dist/research/workspace/setup-wizard.js.map +1 -1
- package/dist/research/workspace/setup.d.ts +18 -15
- package/dist/research/workspace/setup.js +68 -3
- package/dist/research/workspace/setup.js.map +1 -1
- package/dist/research/workspace/workspace.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { inflateRawSync } from "node:zlib";
|
|
3
|
+
import { DATA_MANIFEST_SCHEMA_VERSION } from "../contracts.js";
|
|
4
|
+
import { DataRuntimeError } from "../runtime/errors.js";
|
|
5
|
+
import { GDELT_EVENT_FIELDS, GDELT_EVENTS_OUTPUT_SCHEMA, GDELT_FILE_FEED_INPUT_SCHEMA, GDELT_GKG_FIELDS, GDELT_GKG_OUTPUT_SCHEMA, GDELT_MENTION_FIELDS, GDELT_MENTIONS_OUTPUT_SCHEMA, } from "./gdelt-file-feeds.schemas.js";
|
|
6
|
+
const DATA_PATH = "/gdeltv2/";
|
|
7
|
+
const LAST_UPDATE_PATH = `${DATA_PATH}lastupdate.txt`;
|
|
8
|
+
const FIFTEEN_MINUTES_MS = 15 * 60 * 1_000;
|
|
9
|
+
const MAX_UNCOMPRESSED_BYTES = 64 * 1_024 * 1_024;
|
|
10
|
+
const MAX_FILES = 20;
|
|
11
|
+
const CRC32_TABLE = buildCrc32Table();
|
|
12
|
+
const FEED_DEFINITIONS = {
|
|
13
|
+
events: {
|
|
14
|
+
kind: "events",
|
|
15
|
+
capabilityId: "gdelt.events",
|
|
16
|
+
suffix: ".export.CSV.zip",
|
|
17
|
+
fields: GDELT_EVENT_FIELDS,
|
|
18
|
+
outputSchema: GDELT_EVENTS_OUTPUT_SCHEMA,
|
|
19
|
+
summary: "Fetch bounded GDELT 2.0 coded event records from 15-minute export files.",
|
|
20
|
+
granularity: "One automatically coded event mention aggregation row in an export file.",
|
|
21
|
+
useCase: "Inspect bounded event-code records and their source URLs for a short UTC interval.",
|
|
22
|
+
documentation: [
|
|
23
|
+
{
|
|
24
|
+
title: "GDELT 2.0 Event Codebook",
|
|
25
|
+
url: "https://data.gdeltproject.org/documentation/GDELT-Event_Codebook-V2.0.pdf",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
gkg: {
|
|
30
|
+
kind: "gkg",
|
|
31
|
+
capabilityId: "gdelt.gkg",
|
|
32
|
+
suffix: ".gkg.csv.zip",
|
|
33
|
+
fields: GDELT_GKG_FIELDS,
|
|
34
|
+
outputSchema: GDELT_GKG_OUTPUT_SCHEMA,
|
|
35
|
+
summary: "Fetch bounded GDELT 2.0 Global Knowledge Graph records from 15-minute files.",
|
|
36
|
+
granularity: "One source-document knowledge-graph row with machine-extracted themes and entities.",
|
|
37
|
+
useCase: "Inspect bounded GKG themes, entities, locations, and document identifiers.",
|
|
38
|
+
documentation: [
|
|
39
|
+
{
|
|
40
|
+
title: "GDELT Global Knowledge Graph 2.1 Codebook",
|
|
41
|
+
url: "https://data.gdeltproject.org/documentation/GDELT-Global_Knowledge_Graph_Codebook-V2.1.pdf",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
mentions: {
|
|
46
|
+
kind: "mentions",
|
|
47
|
+
capabilityId: "gdelt.mentions",
|
|
48
|
+
suffix: ".mentions.CSV.zip",
|
|
49
|
+
fields: GDELT_MENTION_FIELDS,
|
|
50
|
+
outputSchema: GDELT_MENTIONS_OUTPUT_SCHEMA,
|
|
51
|
+
summary: "Fetch bounded GDELT 2.0 event-mention records from 15-minute files.",
|
|
52
|
+
granularity: "One document-level mention of an automatically coded GDELT event.",
|
|
53
|
+
useCase: "Trace bounded event records to document mentions and coding confidence metadata.",
|
|
54
|
+
documentation: [
|
|
55
|
+
{
|
|
56
|
+
title: "GDELT 2.0 introduction",
|
|
57
|
+
url: "https://blog.gdeltproject.org/gdelt-2-0-our-global-world-in-realtime/",
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export const gdeltEventsConnector = createFeedConnector(FEED_DEFINITIONS.events);
|
|
63
|
+
export const gdeltGkgConnector = createFeedConnector(FEED_DEFINITIONS.gkg);
|
|
64
|
+
export const gdeltMentionsConnector = createFeedConnector(FEED_DEFINITIONS.mentions);
|
|
65
|
+
function createFeedConnector(definition) {
|
|
66
|
+
return {
|
|
67
|
+
schemaVersion: DATA_MANIFEST_SCHEMA_VERSION,
|
|
68
|
+
capabilityId: definition.capabilityId,
|
|
69
|
+
capabilityVersion: "1.0.0",
|
|
70
|
+
minimumCliVersion: "0.0.55",
|
|
71
|
+
provider: { providerId: "gdelt", name: "GDELT Project" },
|
|
72
|
+
sourceCategory: "global-news-structured-feed",
|
|
73
|
+
endpoints: [
|
|
74
|
+
{
|
|
75
|
+
endpointId: "gdelt-data",
|
|
76
|
+
baseUrl: "https://data.gdeltproject.org",
|
|
77
|
+
pathPrefixes: [DATA_PATH],
|
|
78
|
+
allowedMethods: ["GET"],
|
|
79
|
+
allowedContentTypes: ["text/plain", "application/zip", "application/octet-stream"],
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
license: {
|
|
83
|
+
name: "GDELT Project data",
|
|
84
|
+
url: "https://www.gdeltproject.org/about.html",
|
|
85
|
+
restrictions: [
|
|
86
|
+
"GDELT records are generated through automated monitoring and coding of source material.",
|
|
87
|
+
"Source-specific rights still apply to linked content identified in GDELT records.",
|
|
88
|
+
"This connector normalizes bounded rows in memory and does not persist downloaded source files.",
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
credentials: [],
|
|
92
|
+
limits: {
|
|
93
|
+
timeoutMs: 60_000,
|
|
94
|
+
maxRequestBytes: 1_024,
|
|
95
|
+
maxResponseBytes: 10_000_000,
|
|
96
|
+
maxPages: MAX_FILES,
|
|
97
|
+
maxRecords: 5_000,
|
|
98
|
+
maxRetries: 4,
|
|
99
|
+
maxRetryDelayMs: 120_000,
|
|
100
|
+
maxRedirects: 2,
|
|
101
|
+
},
|
|
102
|
+
diagnostics: { static: true, live: false },
|
|
103
|
+
freshness: {
|
|
104
|
+
kind: "provider-current",
|
|
105
|
+
description: "GDELT 2.0 publishes core feed files on an approximately 15-minute cadence.",
|
|
106
|
+
},
|
|
107
|
+
limitations: [
|
|
108
|
+
"Events, entities, themes, locations, tone, and mention links are automatically coded and may be inaccurate.",
|
|
109
|
+
"Monitored-source coverage varies across countries, languages, outlets, and time.",
|
|
110
|
+
"A bounded range is generated from documented 15-minute paths and is not a completeness claim about the full archive.",
|
|
111
|
+
],
|
|
112
|
+
discovery: {
|
|
113
|
+
source: {
|
|
114
|
+
maintainedBy: "The GDELT Project",
|
|
115
|
+
summary: `GDELT 2.0 ${definition.kind} 15-minute structured data feed.`,
|
|
116
|
+
description: `The GDELT Project publishes ${definition.kind} ZIP files as part of its automatically generated near-real-time global-news data feeds.`,
|
|
117
|
+
coverage: {
|
|
118
|
+
geographic: "Global monitored news sources, with uneven source and language coverage.",
|
|
119
|
+
temporal: "GDELT 2.0 15-minute file timestamps; this operation accepts at most 20 files per run.",
|
|
120
|
+
granularity: definition.granularity,
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
summary: definition.summary,
|
|
124
|
+
description: "Selects either the provider's latest feed entry or the first published 15-minute snapshots inside an explicit inclusive UTC range, verifies bounded single-member ZIP bytes, and emits closed named columns.",
|
|
125
|
+
provides: [
|
|
126
|
+
`Normalized ${definition.kind} rows with exact named fields from the published codebook layout.`,
|
|
127
|
+
"Latest-file MD5 and compressed-size verification when the provider advertises them.",
|
|
128
|
+
"ZIP member, size, CRC32, UTF-8, and column-count validation for every accepted file.",
|
|
129
|
+
],
|
|
130
|
+
doesNotProvide: [
|
|
131
|
+
"Article full text, article body retrieval, media bytes, or persisted downloaded files.",
|
|
132
|
+
"A representative sample of all news, ground-truth facts, or complete global coverage.",
|
|
133
|
+
"Causal interpretation or confirmation that automatically coded events and relationships occurred.",
|
|
134
|
+
],
|
|
135
|
+
selectionHints: [
|
|
136
|
+
`Choose this capability when the ${definition.kind} table is the intended GDELT schema.`,
|
|
137
|
+
"Choose GDELT DOC search for recent article discovery or aggregate timelines instead of raw feed rows.",
|
|
138
|
+
"Use latest for the current provider file; range bounds may be unaligned, and selection starts at the first 15-minute snapshot at or after the lower bound.",
|
|
139
|
+
],
|
|
140
|
+
typicalUseCases: [definition.useCase],
|
|
141
|
+
sourceDocumentation: [
|
|
142
|
+
...definition.documentation,
|
|
143
|
+
{
|
|
144
|
+
title: "GDELT 2.0 data directory",
|
|
145
|
+
url: "https://data.gdeltproject.org/gdeltv2/",
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
operations: [
|
|
150
|
+
{
|
|
151
|
+
operationId: "fetch",
|
|
152
|
+
operationVersion: "1.0.0",
|
|
153
|
+
summary: `Fetch latest or bounded-range GDELT ${definition.kind} rows.`,
|
|
154
|
+
description: "Uses only same-origin HTTPS feed paths, validates the ZIP and table layout, and stops before another request when the runtime record cap is reached.",
|
|
155
|
+
inputSchema: GDELT_FILE_FEED_INPUT_SCHEMA,
|
|
156
|
+
outputSchema: definition.outputSchema,
|
|
157
|
+
execute: (context) => executeFeed(context, definition),
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
async function executeFeed(context, definition) {
|
|
163
|
+
const query = normalizeFeedQuery(context.input);
|
|
164
|
+
const observations = [];
|
|
165
|
+
const effectiveFileLimit = Math.min(query.maxFiles, context.limits.maxPages);
|
|
166
|
+
const plan = query.mode === "latest"
|
|
167
|
+
? {
|
|
168
|
+
candidates: [await resolveLatestCandidate(context, definition, observations)],
|
|
169
|
+
truncated: false,
|
|
170
|
+
}
|
|
171
|
+
: rangeCandidates(query, definition, effectiveFileLimit);
|
|
172
|
+
const candidates = plan.candidates;
|
|
173
|
+
const stoppedAtFileCap = plan.truncated;
|
|
174
|
+
const files = [];
|
|
175
|
+
const records = [];
|
|
176
|
+
const failures = [];
|
|
177
|
+
let firstFailure;
|
|
178
|
+
let stoppedAtRecordCap = false;
|
|
179
|
+
for (const candidate of candidates) {
|
|
180
|
+
if (records.length >= context.limits.maxRecords) {
|
|
181
|
+
stoppedAtRecordCap = true;
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
const response = await context.http.request({
|
|
186
|
+
endpointId: "gdelt-data",
|
|
187
|
+
method: "GET",
|
|
188
|
+
path: `${DATA_PATH}${candidate.fileName}`,
|
|
189
|
+
});
|
|
190
|
+
observations.push({ ...response.observation, sourceId: `file:${candidate.fileName}` });
|
|
191
|
+
const bytes = Buffer.from(response.bytes);
|
|
192
|
+
verifyAdvertisedFile(bytes, candidate);
|
|
193
|
+
const memberName = candidate.fileName.slice(0, -4);
|
|
194
|
+
const parsed = parseSingleEntryZip(bytes, memberName);
|
|
195
|
+
const parsedRows = parseRows(parsed.content, definition.fields, candidate.fileName);
|
|
196
|
+
const remaining = context.limits.maxRecords - records.length;
|
|
197
|
+
const emittedRows = parsedRows.rows.slice(0, remaining);
|
|
198
|
+
for (const fields of emittedRows) {
|
|
199
|
+
records.push({
|
|
200
|
+
recordIndex: records.length,
|
|
201
|
+
sourceFileTimestamp: candidate.timestamp,
|
|
202
|
+
sourceFileName: candidate.fileName,
|
|
203
|
+
fields,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
files.push({
|
|
207
|
+
timestamp: candidate.timestamp,
|
|
208
|
+
fileName: candidate.fileName,
|
|
209
|
+
compressedBytes: bytes.byteLength,
|
|
210
|
+
sha256: createHash("sha256").update(bytes).digest("hex"),
|
|
211
|
+
uncompressedBytes: parsed.uncompressedBytes,
|
|
212
|
+
rowCount: parsedRows.totalRows,
|
|
213
|
+
validRowCount: parsedRows.rows.length,
|
|
214
|
+
invalidRowCount: parsedRows.invalidRowCount,
|
|
215
|
+
validationIssues: parsedRows.issues,
|
|
216
|
+
verifiedMd5: candidate.expectedMd5 === null ? null : true,
|
|
217
|
+
crc32Verified: parsed.crc32Verified,
|
|
218
|
+
});
|
|
219
|
+
if (emittedRows.length < parsedRows.rows.length) {
|
|
220
|
+
stoppedAtRecordCap = true;
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
firstFailure ??= error;
|
|
226
|
+
const normalized = normalizeFailure(error);
|
|
227
|
+
failures.push({ fileName: candidate.fileName, ...normalized });
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (files.length === 0 && firstFailure !== undefined) {
|
|
231
|
+
throw firstFailure instanceof DataRuntimeError
|
|
232
|
+
? firstFailure
|
|
233
|
+
: new DataRuntimeError("provider-response-invalid", "No GDELT feed file could be retrieved and validated.");
|
|
234
|
+
}
|
|
235
|
+
const partial = failures.length > 0;
|
|
236
|
+
const truncated = stoppedAtRecordCap || stoppedAtFileCap;
|
|
237
|
+
const stopReason = partial
|
|
238
|
+
? "partial"
|
|
239
|
+
: truncated
|
|
240
|
+
? stoppedAtRecordCap
|
|
241
|
+
? "max-records"
|
|
242
|
+
: "max-files"
|
|
243
|
+
: records.length === 0
|
|
244
|
+
? "no-results"
|
|
245
|
+
: "completed";
|
|
246
|
+
const errors = partial
|
|
247
|
+
? [
|
|
248
|
+
{
|
|
249
|
+
code: "partial-result",
|
|
250
|
+
message: "One or more GDELT feed files could not be retrieved or validated.",
|
|
251
|
+
retryable: failures.some((failure) => failure.retryable),
|
|
252
|
+
userActionRequired: false,
|
|
253
|
+
details: { missingFiles: failures.map((failure) => failure.fileName) },
|
|
254
|
+
},
|
|
255
|
+
]
|
|
256
|
+
: [];
|
|
257
|
+
return {
|
|
258
|
+
status: partial ? "partial" : "success",
|
|
259
|
+
data: {
|
|
260
|
+
source: {
|
|
261
|
+
providerId: "gdelt",
|
|
262
|
+
dataset: definition.kind,
|
|
263
|
+
cadence: "15 minutes",
|
|
264
|
+
metadataOnly: false,
|
|
265
|
+
},
|
|
266
|
+
query,
|
|
267
|
+
files,
|
|
268
|
+
records,
|
|
269
|
+
failures,
|
|
270
|
+
stopReason,
|
|
271
|
+
},
|
|
272
|
+
summary: {
|
|
273
|
+
recordCount: records.length,
|
|
274
|
+
pageCount: files.length,
|
|
275
|
+
chunkCount: files.length,
|
|
276
|
+
truncated,
|
|
277
|
+
completeness: partial ? "partial" : "complete",
|
|
278
|
+
...(partial
|
|
279
|
+
? {
|
|
280
|
+
missing: [
|
|
281
|
+
{ kind: "file", identifiers: failures.map((item) => item.fileName) },
|
|
282
|
+
],
|
|
283
|
+
}
|
|
284
|
+
: {}),
|
|
285
|
+
},
|
|
286
|
+
warnings: [
|
|
287
|
+
"GDELT feed rows are automatically coded from uneven monitored-news coverage.",
|
|
288
|
+
"Normalized records are not ground-truth facts or representative population measures.",
|
|
289
|
+
...(truncated
|
|
290
|
+
? [
|
|
291
|
+
stoppedAtRecordCap
|
|
292
|
+
? "The operation stopped before another file after reaching the record limit."
|
|
293
|
+
: "The operation stopped at the runtime file/page limit.",
|
|
294
|
+
]
|
|
295
|
+
: []),
|
|
296
|
+
...(files.some((file) => Number(file.invalidRowCount) > 0)
|
|
297
|
+
? ["One or more source rows failed UTF-8 or column-count validation and were omitted."]
|
|
298
|
+
: []),
|
|
299
|
+
],
|
|
300
|
+
errors,
|
|
301
|
+
observations,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function normalizeFeedQuery(input) {
|
|
305
|
+
const maxFiles = input.maxFiles ?? 1;
|
|
306
|
+
if (input.mode === "latest") {
|
|
307
|
+
if (input.startDateTime !== undefined || input.endDateTime !== undefined) {
|
|
308
|
+
throw new DataRuntimeError("invalid-request", "GDELT latest mode does not accept startDateTime or endDateTime.");
|
|
309
|
+
}
|
|
310
|
+
return { mode: "latest", startDateTime: null, endDateTime: null, maxFiles };
|
|
311
|
+
}
|
|
312
|
+
if (input.startDateTime === undefined || input.endDateTime === undefined) {
|
|
313
|
+
throw new DataRuntimeError("invalid-request", "GDELT range mode requires startDateTime and endDateTime.");
|
|
314
|
+
}
|
|
315
|
+
const start = parseAlignedDateTime(input.startDateTime, "startDateTime");
|
|
316
|
+
const end = parseAlignedDateTime(input.endDateTime, "endDateTime");
|
|
317
|
+
if (start.getTime() > end.getTime()) {
|
|
318
|
+
throw new DataRuntimeError("invalid-request", "GDELT startDateTime must not follow endDateTime.");
|
|
319
|
+
}
|
|
320
|
+
return {
|
|
321
|
+
mode: "range",
|
|
322
|
+
startDateTime: canonicalDateTime(start),
|
|
323
|
+
endDateTime: canonicalDateTime(end),
|
|
324
|
+
maxFiles,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
async function resolveLatestCandidate(context, definition, observations) {
|
|
328
|
+
const response = await context.http.request({
|
|
329
|
+
endpointId: "gdelt-data",
|
|
330
|
+
method: "GET",
|
|
331
|
+
path: LAST_UPDATE_PATH,
|
|
332
|
+
});
|
|
333
|
+
observations.push({ ...response.observation, sourceId: "index:lastupdate" });
|
|
334
|
+
for (const line of response.text().split(/\r?\n/)) {
|
|
335
|
+
const match = /^(\d+)\s+([a-fA-F0-9]{32})\s+https?:\/\/data\.gdeltproject\.org\/gdeltv2\/(\d{14}[^\s/]+\.zip)$/.exec(line.trim());
|
|
336
|
+
if (!match)
|
|
337
|
+
continue;
|
|
338
|
+
const [, compressedBytesText, md5, fileName] = match;
|
|
339
|
+
if (!compressedBytesText || !md5 || !fileName || !fileName.endsWith(definition.suffix))
|
|
340
|
+
continue;
|
|
341
|
+
const timestamp = fileName.slice(0, 14);
|
|
342
|
+
if (fileName !== `${timestamp}${definition.suffix}`)
|
|
343
|
+
continue;
|
|
344
|
+
const expectedCompressedBytes = Number(compressedBytesText);
|
|
345
|
+
if (!Number.isSafeInteger(expectedCompressedBytes) || expectedCompressedBytes <= 0)
|
|
346
|
+
break;
|
|
347
|
+
return {
|
|
348
|
+
timestamp,
|
|
349
|
+
fileName,
|
|
350
|
+
expectedCompressedBytes,
|
|
351
|
+
expectedMd5: md5.toLowerCase(),
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
throw new DataRuntimeError("provider-response-invalid", `GDELT lastupdate.txt did not contain a valid ${definition.kind} entry.`);
|
|
355
|
+
}
|
|
356
|
+
function rangeCandidates(query, definition, limit) {
|
|
357
|
+
const start = new Date(query.startDateTime);
|
|
358
|
+
const end = new Date(query.endDateTime);
|
|
359
|
+
const firstTimestamp = Math.ceil(start.getTime() / FIFTEEN_MINUTES_MS) * FIFTEEN_MINUTES_MS;
|
|
360
|
+
const availableCount = firstTimestamp > end.getTime()
|
|
361
|
+
? 0
|
|
362
|
+
: Math.floor((end.getTime() - firstTimestamp) / FIFTEEN_MINUTES_MS) + 1;
|
|
363
|
+
const candidates = [];
|
|
364
|
+
for (let time = firstTimestamp; time <= end.getTime() && candidates.length < limit; time += FIFTEEN_MINUTES_MS) {
|
|
365
|
+
const timestamp = gdeltTimestamp(new Date(time));
|
|
366
|
+
candidates.push({
|
|
367
|
+
timestamp,
|
|
368
|
+
fileName: `${timestamp}${definition.suffix}`,
|
|
369
|
+
expectedCompressedBytes: null,
|
|
370
|
+
expectedMd5: null,
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
return { candidates, truncated: availableCount > candidates.length };
|
|
374
|
+
}
|
|
375
|
+
function verifyAdvertisedFile(bytes, candidate) {
|
|
376
|
+
if (candidate.expectedCompressedBytes !== null &&
|
|
377
|
+
bytes.byteLength !== candidate.expectedCompressedBytes) {
|
|
378
|
+
throw providerInvalid("GDELT feed bytes do not match the compressed size advertised by lastupdate.txt.");
|
|
379
|
+
}
|
|
380
|
+
if (candidate.expectedMd5 !== null) {
|
|
381
|
+
const digest = createHash("md5").update(bytes).digest("hex");
|
|
382
|
+
if (digest !== candidate.expectedMd5) {
|
|
383
|
+
throw providerInvalid("GDELT feed bytes do not match the MD5 advertised by lastupdate.txt.");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
function parseSingleEntryZip(bytes, expectedMemberName) {
|
|
388
|
+
const eocdOffset = findEndOfCentralDirectory(bytes);
|
|
389
|
+
if (eocdOffset < 0 || eocdOffset + 22 !== bytes.byteLength)
|
|
390
|
+
throw providerInvalid("GDELT ZIP has an invalid end-of-central-directory record.");
|
|
391
|
+
if (readU16(bytes, eocdOffset + 4) !== 0 || readU16(bytes, eocdOffset + 6) !== 0)
|
|
392
|
+
throw providerInvalid("Multi-disk GDELT ZIP files are not supported.");
|
|
393
|
+
if (readU16(bytes, eocdOffset + 8) !== 1 || readU16(bytes, eocdOffset + 10) !== 1)
|
|
394
|
+
throw providerInvalid("GDELT ZIP must contain exactly one member.");
|
|
395
|
+
if (readU16(bytes, eocdOffset + 20) !== 0)
|
|
396
|
+
throw providerInvalid("GDELT ZIP comments are not accepted.");
|
|
397
|
+
const centralSize = readU32(bytes, eocdOffset + 12);
|
|
398
|
+
const centralOffset = readU32(bytes, eocdOffset + 16);
|
|
399
|
+
if (centralOffset + centralSize !== eocdOffset || centralOffset + 46 > bytes.byteLength)
|
|
400
|
+
throw providerInvalid("GDELT ZIP central directory is out of bounds.");
|
|
401
|
+
if (readU32(bytes, centralOffset) !== 0x02014b50)
|
|
402
|
+
throw providerInvalid("GDELT ZIP central directory signature is invalid.");
|
|
403
|
+
const flags = readU16(bytes, centralOffset + 8);
|
|
404
|
+
const method = readU16(bytes, centralOffset + 10);
|
|
405
|
+
const expectedCrc = readU32(bytes, centralOffset + 16);
|
|
406
|
+
const compressedSize = readU32(bytes, centralOffset + 20);
|
|
407
|
+
const uncompressedSize = readU32(bytes, centralOffset + 24);
|
|
408
|
+
const nameLength = readU16(bytes, centralOffset + 28);
|
|
409
|
+
const extraLength = readU16(bytes, centralOffset + 30);
|
|
410
|
+
const commentLength = readU16(bytes, centralOffset + 32);
|
|
411
|
+
const diskStart = readU16(bytes, centralOffset + 34);
|
|
412
|
+
const localOffset = readU32(bytes, centralOffset + 42);
|
|
413
|
+
if ((flags & 0x0009) !== 0 || ![0, 8].includes(method))
|
|
414
|
+
throw providerInvalid("GDELT ZIP encryption and data descriptors are not accepted.");
|
|
415
|
+
if (diskStart !== 0 || extraLength > 4_096 || commentLength !== 0 || localOffset !== 0)
|
|
416
|
+
throw providerInvalid("GDELT ZIP contains unsupported directory metadata.");
|
|
417
|
+
if (compressedSize === 0xffffffff ||
|
|
418
|
+
uncompressedSize === 0xffffffff ||
|
|
419
|
+
uncompressedSize > MAX_UNCOMPRESSED_BYTES)
|
|
420
|
+
throw providerInvalid("GDELT ZIP size is unsupported or exceeds the decompression limit.");
|
|
421
|
+
const centralNameStart = centralOffset + 46;
|
|
422
|
+
const centralNameEnd = centralNameStart + nameLength;
|
|
423
|
+
if (centralNameEnd + extraLength + commentLength !== eocdOffset)
|
|
424
|
+
throw providerInvalid("GDELT ZIP central directory length is inconsistent.");
|
|
425
|
+
const centralName = decodeUtf8(bytes.subarray(centralNameStart, centralNameEnd), "ZIP member name");
|
|
426
|
+
if (centralName !== expectedMemberName || !isSafeMemberName(centralName))
|
|
427
|
+
throw providerInvalid("GDELT ZIP member name is unsafe or does not match the selected feed file.");
|
|
428
|
+
if (readU32(bytes, 0) !== 0x04034b50)
|
|
429
|
+
throw providerInvalid("GDELT ZIP local header signature is invalid.");
|
|
430
|
+
const localFlags = readU16(bytes, 6);
|
|
431
|
+
const localMethod = readU16(bytes, 8);
|
|
432
|
+
const localCrc = readU32(bytes, 14);
|
|
433
|
+
const localCompressedSize = readU32(bytes, 18);
|
|
434
|
+
const localUncompressedSize = readU32(bytes, 22);
|
|
435
|
+
const localNameLength = readU16(bytes, 26);
|
|
436
|
+
const localExtraLength = readU16(bytes, 28);
|
|
437
|
+
if (localFlags !== flags ||
|
|
438
|
+
localMethod !== method ||
|
|
439
|
+
localCrc !== expectedCrc ||
|
|
440
|
+
localCompressedSize !== compressedSize ||
|
|
441
|
+
localUncompressedSize !== uncompressedSize ||
|
|
442
|
+
localExtraLength > 4_096)
|
|
443
|
+
throw providerInvalid("GDELT ZIP local and central headers disagree.");
|
|
444
|
+
const localNameStart = 30;
|
|
445
|
+
const localNameEnd = localNameStart + localNameLength;
|
|
446
|
+
if (decodeUtf8(bytes.subarray(localNameStart, localNameEnd), "ZIP local member name") !==
|
|
447
|
+
centralName)
|
|
448
|
+
throw providerInvalid("GDELT ZIP member names disagree.");
|
|
449
|
+
const compressedStart = localNameEnd + localExtraLength;
|
|
450
|
+
const compressedEnd = compressedStart + compressedSize;
|
|
451
|
+
if (compressedEnd !== centralOffset)
|
|
452
|
+
throw providerInvalid("GDELT ZIP compressed member bounds are inconsistent.");
|
|
453
|
+
const compressed = bytes.subarray(compressedStart, compressedEnd);
|
|
454
|
+
let content;
|
|
455
|
+
try {
|
|
456
|
+
content =
|
|
457
|
+
method === 0
|
|
458
|
+
? Buffer.from(compressed)
|
|
459
|
+
: inflateRawSync(compressed, { maxOutputLength: MAX_UNCOMPRESSED_BYTES });
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
throw providerInvalid("GDELT ZIP member could not be decompressed within the declared limit.");
|
|
463
|
+
}
|
|
464
|
+
if (content.byteLength !== uncompressedSize || crc32(content) !== expectedCrc)
|
|
465
|
+
throw providerInvalid("GDELT ZIP member size or CRC32 validation failed.");
|
|
466
|
+
return {
|
|
467
|
+
content,
|
|
468
|
+
uncompressedBytes: content.byteLength,
|
|
469
|
+
crc32Verified: true,
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
function parseRows(content, fields, fileName) {
|
|
473
|
+
const rows = [];
|
|
474
|
+
const issues = [];
|
|
475
|
+
let totalRows = 0;
|
|
476
|
+
let invalidRowCount = 0;
|
|
477
|
+
let lineStart = 0;
|
|
478
|
+
for (let offset = 0; offset <= content.length; offset += 1) {
|
|
479
|
+
if (offset < content.length && content[offset] !== 0x0a)
|
|
480
|
+
continue;
|
|
481
|
+
let lineEnd = offset;
|
|
482
|
+
if (lineEnd > lineStart && content[lineEnd - 1] === 0x0d)
|
|
483
|
+
lineEnd -= 1;
|
|
484
|
+
if (lineStart === content.length || (lineEnd === lineStart && offset === content.length))
|
|
485
|
+
break;
|
|
486
|
+
totalRows += 1;
|
|
487
|
+
const lineBytes = content.subarray(lineStart, lineEnd);
|
|
488
|
+
lineStart = offset + 1;
|
|
489
|
+
let line;
|
|
490
|
+
try {
|
|
491
|
+
line = new TextDecoder("utf-8", { fatal: true }).decode(lineBytes);
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
invalidRowCount += 1;
|
|
495
|
+
addRowIssue(issues, `Row ${totalRows} is not valid UTF-8.`);
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
if (!line || line.includes("\0")) {
|
|
499
|
+
invalidRowCount += 1;
|
|
500
|
+
addRowIssue(issues, `Row ${totalRows} is empty or contains a NUL byte.`);
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
const values = line.split("\t");
|
|
504
|
+
if (values.length !== fields.length) {
|
|
505
|
+
invalidRowCount += 1;
|
|
506
|
+
addRowIssue(issues, `Row ${totalRows} has ${values.length} columns; expected ${fields.length}.`);
|
|
507
|
+
continue;
|
|
508
|
+
}
|
|
509
|
+
rows.push(Object.fromEntries(fields.map((field, index) => [field, values[index]])));
|
|
510
|
+
}
|
|
511
|
+
return { rows, totalRows, invalidRowCount, issues };
|
|
512
|
+
}
|
|
513
|
+
function parseAlignedDateTime(value, field) {
|
|
514
|
+
if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(value))
|
|
515
|
+
throw new DataRuntimeError("invalid-request", `${field} must be a canonical UTC timestamp.`);
|
|
516
|
+
const parsed = new Date(value);
|
|
517
|
+
if (!Number.isFinite(parsed.getTime()) || canonicalDateTime(parsed) !== value) {
|
|
518
|
+
throw new DataRuntimeError("invalid-request", `${field} must be a valid canonical UTC timestamp.`);
|
|
519
|
+
}
|
|
520
|
+
return parsed;
|
|
521
|
+
}
|
|
522
|
+
function addRowIssue(issues, issue) {
|
|
523
|
+
if (issues.length < 20)
|
|
524
|
+
issues.push(issue);
|
|
525
|
+
}
|
|
526
|
+
function canonicalDateTime(value) {
|
|
527
|
+
return value.toISOString().replace(".000Z", "Z");
|
|
528
|
+
}
|
|
529
|
+
function gdeltTimestamp(value) {
|
|
530
|
+
return canonicalDateTime(value).replace(/[-:TZ]/g, "");
|
|
531
|
+
}
|
|
532
|
+
function findEndOfCentralDirectory(bytes) {
|
|
533
|
+
const minimum = Math.max(0, bytes.byteLength - 65_557);
|
|
534
|
+
for (let offset = bytes.byteLength - 22; offset >= minimum; offset -= 1) {
|
|
535
|
+
if (readU32(bytes, offset) === 0x06054b50)
|
|
536
|
+
return offset;
|
|
537
|
+
}
|
|
538
|
+
return -1;
|
|
539
|
+
}
|
|
540
|
+
function readU16(bytes, offset) {
|
|
541
|
+
if (offset < 0 || offset + 2 > bytes.byteLength)
|
|
542
|
+
throw providerInvalid("GDELT ZIP structure is truncated.");
|
|
543
|
+
return bytes.readUInt16LE(offset);
|
|
544
|
+
}
|
|
545
|
+
function readU32(bytes, offset) {
|
|
546
|
+
if (offset < 0 || offset + 4 > bytes.byteLength)
|
|
547
|
+
throw providerInvalid("GDELT ZIP structure is truncated.");
|
|
548
|
+
return bytes.readUInt32LE(offset);
|
|
549
|
+
}
|
|
550
|
+
function decodeUtf8(bytes, field) {
|
|
551
|
+
try {
|
|
552
|
+
return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
throw providerInvalid(`${field} is not valid UTF-8.`);
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
function isSafeMemberName(value) {
|
|
559
|
+
return (Boolean(value) &&
|
|
560
|
+
!value.includes("/") &&
|
|
561
|
+
!value.includes("\\") &&
|
|
562
|
+
!value.includes("..") &&
|
|
563
|
+
!/[\u0000-\u001f\u007f]/.test(value));
|
|
564
|
+
}
|
|
565
|
+
function crc32(bytes) {
|
|
566
|
+
let crc = 0xffffffff;
|
|
567
|
+
for (const byte of bytes) {
|
|
568
|
+
crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ byte) & 0xff];
|
|
569
|
+
}
|
|
570
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
571
|
+
}
|
|
572
|
+
function buildCrc32Table() {
|
|
573
|
+
const table = new Uint32Array(256);
|
|
574
|
+
for (let index = 0; index < table.length; index += 1) {
|
|
575
|
+
let value = index;
|
|
576
|
+
for (let bit = 0; bit < 8; bit += 1) {
|
|
577
|
+
value = (value >>> 1) ^ (value & 1 ? 0xedb88320 : 0);
|
|
578
|
+
}
|
|
579
|
+
table[index] = value >>> 0;
|
|
580
|
+
}
|
|
581
|
+
return table;
|
|
582
|
+
}
|
|
583
|
+
function normalizeFailure(error) {
|
|
584
|
+
return error instanceof DataRuntimeError
|
|
585
|
+
? { code: error.code, retryable: error.options.retryable ?? false }
|
|
586
|
+
: { code: "provider-response-invalid", retryable: false };
|
|
587
|
+
}
|
|
588
|
+
function providerInvalid(message) {
|
|
589
|
+
return new DataRuntimeError("provider-response-invalid", message);
|
|
590
|
+
}
|
|
591
|
+
//# sourceMappingURL=gdelt-file-feeds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gdelt-file-feeds.js","sourceRoot":"","sources":["../../../src/data/connectors/gdelt-file-feeds.ts"],"names":[],"mappings":"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"}
|