@layer-drone/protocol 0.5.0 → 0.6.0

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/dist/index.js CHANGED
@@ -22,6 +22,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
22
22
  var index_exports = {};
23
23
  __export(index_exports, {
24
24
  Event: () => Event,
25
+ WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER: () => WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER,
26
+ WEBHOOK_PREVIOUS_SECRET_HEADER: () => WEBHOOK_PREVIOUS_SECRET_HEADER,
27
+ WEBHOOK_SECRET_HEADER: () => WEBHOOK_SECRET_HEADER,
25
28
  alchemyControllerHandleWebhook: () => alchemyControllerHandleWebhook,
26
29
  apiControllerGetError: () => apiControllerGetError,
27
30
  apiControllerGetHello: () => apiControllerGetHello,
@@ -39,6 +42,8 @@ __export(index_exports, {
39
42
  createClient: () => createClient,
40
43
  createConfig: () => createConfig,
41
44
  dlqRedriverControllerRedriveDlq: () => dlqRedriverControllerRedriveDlq,
45
+ eventProcessorFlightReviewsSyncControllerResyncFlightReviews: () => eventProcessorFlightReviewsSyncControllerResyncFlightReviews,
46
+ eventProcessorMissionsSyncControllerResyncMissions: () => eventProcessorMissionsSyncControllerResyncMissions,
42
47
  flightPlansControllerCreate: () => flightPlansControllerCreate,
43
48
  flightPlansControllerGet: () => flightPlansControllerGet,
44
49
  flightPlansControllerGetMany: () => flightPlansControllerGetMany,
@@ -76,7 +81,10 @@ __export(index_exports, {
76
81
  webhooksControllerGetStatus: () => webhooksControllerGetStatus,
77
82
  webhooksControllerRegenerateSecret: () => webhooksControllerRegenerateSecret,
78
83
  webhooksControllerTest: () => webhooksControllerTest,
79
- webhooksControllerUpdate: () => webhooksControllerUpdate
84
+ webhooksControllerUpdate: () => webhooksControllerUpdate,
85
+ zonesControllerCreateZone: () => zonesControllerCreateZone,
86
+ zonesControllerDeleteZone: () => zonesControllerDeleteZone,
87
+ zonesControllerUpdateZone: () => zonesControllerUpdateZone
80
88
  });
81
89
  module.exports = __toCommonJS(index_exports);
82
90
 
@@ -802,6 +810,14 @@ var contractsControllerGetAllContractsResponseTransformer = /* @__PURE__ */ __na
802
810
  data = getContractsResponseDtoSchemaResponseTransformer(data);
803
811
  return data;
804
812
  }, "contractsControllerGetAllContractsResponseTransformer");
813
+ var flightDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
814
+ data.payout.createdAt = new Date(data.payout.createdAt);
815
+ return data;
816
+ }, "flightDtoSchemaResponseTransformer");
817
+ var flightsControllerGetFlightResponseTransformer = /* @__PURE__ */ __name(async (data) => {
818
+ data = flightDtoSchemaResponseTransformer(data);
819
+ return data;
820
+ }, "flightsControllerGetFlightResponseTransformer");
805
821
  var validateFlightResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
806
822
  data.flightId = BigInt(data.flightId.toString());
807
823
  return data;
@@ -862,14 +878,13 @@ var flightReviewsControllerGetFlightReviewsResponseTransformer = /* @__PURE__ */
862
878
  return data;
863
879
  }, "flightReviewsControllerGetFlightReviewsResponseTransformer");
864
880
  var getMissionResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
865
- data.mission.captureStartTime = new Date(data.mission.captureStartTime);
866
- data.mission.captureEndTime = new Date(data.mission.captureEndTime);
867
- data.mission.createdAt = new Date(data.mission.createdAt);
868
- data.mission.updatedAt = new Date(data.mission.updatedAt);
869
- if (data.vault) {
870
- data.vault.createdAt = new Date(data.vault.createdAt);
871
- data.vault.updatedAt = new Date(data.vault.updatedAt);
872
- }
881
+ data.captureStartTime = new Date(data.captureStartTime);
882
+ data.captureEndTime = new Date(data.captureEndTime);
883
+ data.createdAt = new Date(data.createdAt);
884
+ data.updatedAt = new Date(data.updatedAt);
885
+ data.payout.createdAt = new Date(data.payout.createdAt);
886
+ data.vault.createdAt = new Date(data.vault.createdAt);
887
+ data.vault.updatedAt = new Date(data.vault.updatedAt);
873
888
  return data;
874
889
  }, "getMissionResponseDtoSchemaResponseTransformer");
875
890
  var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(async (data) => {
@@ -878,14 +893,13 @@ var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(asy
878
893
  }, "missionsControllerGetMissionResponseTransformer");
879
894
  var getMissionsResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
880
895
  data.missions = data.missions.map((item) => {
881
- item.mission.captureStartTime = new Date(item.mission.captureStartTime);
882
- item.mission.captureEndTime = new Date(item.mission.captureEndTime);
883
- item.mission.createdAt = new Date(item.mission.createdAt);
884
- item.mission.updatedAt = new Date(item.mission.updatedAt);
885
- if (item.vault) {
886
- item.vault.createdAt = new Date(item.vault.createdAt);
887
- item.vault.updatedAt = new Date(item.vault.updatedAt);
888
- }
896
+ item.captureStartTime = new Date(item.captureStartTime);
897
+ item.captureEndTime = new Date(item.captureEndTime);
898
+ item.createdAt = new Date(item.createdAt);
899
+ item.updatedAt = new Date(item.updatedAt);
900
+ item.payout.createdAt = new Date(item.payout.createdAt);
901
+ item.vault.createdAt = new Date(item.vault.createdAt);
902
+ item.vault.updatedAt = new Date(item.vault.updatedAt);
889
903
  return item;
890
904
  });
891
905
  return data;
@@ -906,6 +920,54 @@ var missionsControllerCreateMissionsResponseTransformer = /* @__PURE__ */ __name
906
920
  data = createMissionResponseDtoSchemaResponseTransformer(data);
907
921
  return data;
908
922
  }, "missionsControllerCreateMissionsResponseTransformer");
923
+ var getWebhooksResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
924
+ data = data.map((item) => {
925
+ item.previous_secret_expires_at = new Date(item.previous_secret_expires_at);
926
+ return item;
927
+ });
928
+ return data;
929
+ }, "getWebhooksResponseSchemaResponseTransformer");
930
+ var webhooksControllerGetManyResponseTransformer = /* @__PURE__ */ __name(async (data) => {
931
+ data = getWebhooksResponseSchemaResponseTransformer(data);
932
+ return data;
933
+ }, "webhooksControllerGetManyResponseTransformer");
934
+ var getWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
935
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
936
+ return data;
937
+ }, "getWebhookResponseSchemaResponseTransformer");
938
+ var webhooksControllerGetResponseTransformer = /* @__PURE__ */ __name(async (data) => {
939
+ data = getWebhookResponseSchemaResponseTransformer(data);
940
+ return data;
941
+ }, "webhooksControllerGetResponseTransformer");
942
+ var updateWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
943
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
944
+ return data;
945
+ }, "updateWebhookResponseSchemaResponseTransformer");
946
+ var webhooksControllerUpdateResponseTransformer = /* @__PURE__ */ __name(async (data) => {
947
+ data = updateWebhookResponseSchemaResponseTransformer(data);
948
+ return data;
949
+ }, "webhooksControllerUpdateResponseTransformer");
950
+ var regenerateWebhookSecretResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
951
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
952
+ return data;
953
+ }, "regenerateWebhookSecretResponseDtoSchemaResponseTransformer");
954
+ var webhooksControllerRegenerateSecretResponseTransformer = /* @__PURE__ */ __name(async (data) => {
955
+ data = regenerateWebhookSecretResponseDtoSchemaResponseTransformer(data);
956
+ return data;
957
+ }, "webhooksControllerRegenerateSecretResponseTransformer");
958
+ var zoneResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
959
+ data.created_at = new Date(data.created_at);
960
+ data.updated_at = new Date(data.updated_at);
961
+ return data;
962
+ }, "zoneResponseDtoSchemaResponseTransformer");
963
+ var zonesControllerCreateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
964
+ data = zoneResponseDtoSchemaResponseTransformer(data);
965
+ return data;
966
+ }, "zonesControllerCreateZoneResponseTransformer");
967
+ var zonesControllerUpdateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
968
+ data = zoneResponseDtoSchemaResponseTransformer(data);
969
+ return data;
970
+ }, "zonesControllerUpdateZoneResponseTransformer");
909
971
  var getInboundWebhookConfigsResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
910
972
  data = data.map((item) => {
911
973
  item.created_at = new Date(item.created_at);
@@ -1128,6 +1190,7 @@ var flightsControllerGetFlight = /* @__PURE__ */ __name((options) => {
1128
1190
  type: "apiKey"
1129
1191
  }
1130
1192
  ],
1193
+ responseTransformer: flightsControllerGetFlightResponseTransformer,
1131
1194
  url: "/flights/{flightId}",
1132
1195
  ...options
1133
1196
  });
@@ -1393,6 +1456,7 @@ var webhooksControllerGetMany = /* @__PURE__ */ __name((options) => {
1393
1456
  type: "apiKey"
1394
1457
  }
1395
1458
  ],
1459
+ responseTransformer: webhooksControllerGetManyResponseTransformer,
1396
1460
  url: "/org/{org_id}/webhooks",
1397
1461
  ...options
1398
1462
  });
@@ -1433,6 +1497,7 @@ var webhooksControllerGet = /* @__PURE__ */ __name((options) => {
1433
1497
  type: "apiKey"
1434
1498
  }
1435
1499
  ],
1500
+ responseTransformer: webhooksControllerGetResponseTransformer,
1436
1501
  url: "/org/{org_id}/webhooks/{id}",
1437
1502
  ...options
1438
1503
  });
@@ -1445,6 +1510,7 @@ var webhooksControllerUpdate = /* @__PURE__ */ __name((options) => {
1445
1510
  type: "apiKey"
1446
1511
  }
1447
1512
  ],
1513
+ responseTransformer: webhooksControllerUpdateResponseTransformer,
1448
1514
  url: "/org/{org_id}/webhooks/{id}",
1449
1515
  ...options,
1450
1516
  headers: {
@@ -1461,8 +1527,13 @@ var webhooksControllerRegenerateSecret = /* @__PURE__ */ __name((options) => {
1461
1527
  type: "apiKey"
1462
1528
  }
1463
1529
  ],
1530
+ responseTransformer: webhooksControllerRegenerateSecretResponseTransformer,
1464
1531
  url: "/org/{org_id}/webhooks/{id}/regenerate-secret",
1465
- ...options
1532
+ ...options,
1533
+ headers: {
1534
+ "Content-Type": "application/json",
1535
+ ...options.headers
1536
+ }
1466
1537
  });
1467
1538
  }, "webhooksControllerRegenerateSecret");
1468
1539
  var webhooksControllerTest = /* @__PURE__ */ __name((options) => {
@@ -1489,6 +1560,84 @@ var webhooksControllerGetStatus = /* @__PURE__ */ __name((options) => {
1489
1560
  ...options
1490
1561
  });
1491
1562
  }, "webhooksControllerGetStatus");
1563
+ var zonesControllerCreateZone = /* @__PURE__ */ __name((options) => {
1564
+ return (options.client ?? client).post({
1565
+ security: [
1566
+ {
1567
+ name: "x-api-token",
1568
+ type: "apiKey"
1569
+ }
1570
+ ],
1571
+ responseTransformer: zonesControllerCreateZoneResponseTransformer,
1572
+ url: "/zones",
1573
+ ...options,
1574
+ headers: {
1575
+ "Content-Type": "application/json",
1576
+ ...options.headers
1577
+ }
1578
+ });
1579
+ }, "zonesControllerCreateZone");
1580
+ var zonesControllerDeleteZone = /* @__PURE__ */ __name((options) => {
1581
+ return (options.client ?? client).delete({
1582
+ security: [
1583
+ {
1584
+ name: "x-api-token",
1585
+ type: "apiKey"
1586
+ }
1587
+ ],
1588
+ url: "/zones/{id}",
1589
+ ...options
1590
+ });
1591
+ }, "zonesControllerDeleteZone");
1592
+ var zonesControllerUpdateZone = /* @__PURE__ */ __name((options) => {
1593
+ return (options.client ?? client).put({
1594
+ security: [
1595
+ {
1596
+ name: "x-api-token",
1597
+ type: "apiKey"
1598
+ }
1599
+ ],
1600
+ responseTransformer: zonesControllerUpdateZoneResponseTransformer,
1601
+ url: "/zones/{id}",
1602
+ ...options,
1603
+ headers: {
1604
+ "Content-Type": "application/json",
1605
+ ...options.headers
1606
+ }
1607
+ });
1608
+ }, "zonesControllerUpdateZone");
1609
+ var eventProcessorMissionsSyncControllerResyncMissions = /* @__PURE__ */ __name((options) => {
1610
+ return (options.client ?? client).put({
1611
+ security: [
1612
+ {
1613
+ name: "x-api-token",
1614
+ type: "apiKey"
1615
+ }
1616
+ ],
1617
+ url: "/event-processor/missions/sync",
1618
+ ...options,
1619
+ headers: {
1620
+ "Content-Type": "application/json",
1621
+ ...options.headers
1622
+ }
1623
+ });
1624
+ }, "eventProcessorMissionsSyncControllerResyncMissions");
1625
+ var eventProcessorFlightReviewsSyncControllerResyncFlightReviews = /* @__PURE__ */ __name((options) => {
1626
+ return (options.client ?? client).put({
1627
+ security: [
1628
+ {
1629
+ name: "x-api-token",
1630
+ type: "apiKey"
1631
+ }
1632
+ ],
1633
+ url: "/event-processor/flightreviews",
1634
+ ...options,
1635
+ headers: {
1636
+ "Content-Type": "application/json",
1637
+ ...options.headers
1638
+ }
1639
+ });
1640
+ }, "eventProcessorFlightReviewsSyncControllerResyncFlightReviews");
1492
1641
  var alchemyControllerHandleWebhook = /* @__PURE__ */ __name((options) => {
1493
1642
  return (options.client ?? client).post({
1494
1643
  url: "/webhooks/inbound/alchemy",
@@ -1702,31 +1851,52 @@ var Event = import_zod.z.union([
1702
1851
 
1703
1852
  // src/event/parser.ts
1704
1853
  var WEBHOOK_SECRET_HEADER = "X-Webhook-Secret";
1854
+ var WEBHOOK_PREVIOUS_SECRET_HEADER = "X-Webhook-Previous-Secret";
1855
+ var WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER = "X-Webhook-Previous-Secret-Expires-At";
1705
1856
  function parseWebhookEvent(req, webhookSecret) {
1706
- const secret = getSecretHeader(req.headers);
1707
- if (typeof secret !== "string") {
1857
+ const incoming = getFirstHeader(req.headers, WEBHOOK_SECRET_HEADER);
1858
+ if (typeof incoming !== "string") {
1708
1859
  throw new Error("Webhook request signature is not a string");
1709
1860
  }
1710
1861
  if (!Buffer.isBuffer(req.body)) {
1711
1862
  throw new Error("Webhook request body is not a Buffer");
1712
1863
  }
1713
- if (secret !== webhookSecret) {
1864
+ if (incoming === webhookSecret) {
1865
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1866
+ }
1867
+ const announcedPrevious = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_HEADER);
1868
+ const expiresRaw = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER);
1869
+ if (announcedPrevious === void 0 || expiresRaw === void 0) {
1870
+ throw new Error("Invalid webhook secret");
1871
+ }
1872
+ const expiresAt = new Date(expiresRaw);
1873
+ if (Number.isNaN(expiresAt.getTime())) {
1714
1874
  throw new Error("Invalid webhook secret");
1715
1875
  }
1716
- return Event.parse(JSON.parse(req.body.toString("utf-8")));
1876
+ if (Date.now() >= expiresAt.getTime()) {
1877
+ throw new Error("Invalid webhook secret");
1878
+ }
1879
+ if (webhookSecret === announcedPrevious) {
1880
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1881
+ }
1882
+ throw new Error("Invalid webhook secret");
1717
1883
  }
1718
1884
  __name(parseWebhookEvent, "parseWebhookEvent");
1719
- function getSecretHeader(headers) {
1720
- let value = headers[WEBHOOK_SECRET_HEADER] ?? headers[WEBHOOK_SECRET_HEADER.toLowerCase()];
1885
+ function getFirstHeader(headers, canonicalName) {
1886
+ const lower = canonicalName.toLowerCase();
1887
+ let value = headers[canonicalName] ?? headers[lower];
1721
1888
  if (Array.isArray(value)) {
1722
1889
  value = value[0];
1723
1890
  }
1724
- return value;
1891
+ return typeof value === "string" ? value : void 0;
1725
1892
  }
1726
- __name(getSecretHeader, "getSecretHeader");
1893
+ __name(getFirstHeader, "getFirstHeader");
1727
1894
  // Annotate the CommonJS export names for ESM import in node:
1728
1895
  0 && (module.exports = {
1729
1896
  Event,
1897
+ WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER,
1898
+ WEBHOOK_PREVIOUS_SECRET_HEADER,
1899
+ WEBHOOK_SECRET_HEADER,
1730
1900
  alchemyControllerHandleWebhook,
1731
1901
  apiControllerGetError,
1732
1902
  apiControllerGetHello,
@@ -1744,6 +1914,8 @@ __name(getSecretHeader, "getSecretHeader");
1744
1914
  createClient,
1745
1915
  createConfig,
1746
1916
  dlqRedriverControllerRedriveDlq,
1917
+ eventProcessorFlightReviewsSyncControllerResyncFlightReviews,
1918
+ eventProcessorMissionsSyncControllerResyncMissions,
1747
1919
  flightPlansControllerCreate,
1748
1920
  flightPlansControllerGet,
1749
1921
  flightPlansControllerGetMany,
@@ -1781,5 +1953,8 @@ __name(getSecretHeader, "getSecretHeader");
1781
1953
  webhooksControllerGetStatus,
1782
1954
  webhooksControllerRegenerateSecret,
1783
1955
  webhooksControllerTest,
1784
- webhooksControllerUpdate
1956
+ webhooksControllerUpdate,
1957
+ zonesControllerCreateZone,
1958
+ zonesControllerDeleteZone,
1959
+ zonesControllerUpdateZone
1785
1960
  });
package/dist/index.mjs CHANGED
@@ -723,6 +723,14 @@ var contractsControllerGetAllContractsResponseTransformer = /* @__PURE__ */ __na
723
723
  data = getContractsResponseDtoSchemaResponseTransformer(data);
724
724
  return data;
725
725
  }, "contractsControllerGetAllContractsResponseTransformer");
726
+ var flightDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
727
+ data.payout.createdAt = new Date(data.payout.createdAt);
728
+ return data;
729
+ }, "flightDtoSchemaResponseTransformer");
730
+ var flightsControllerGetFlightResponseTransformer = /* @__PURE__ */ __name(async (data) => {
731
+ data = flightDtoSchemaResponseTransformer(data);
732
+ return data;
733
+ }, "flightsControllerGetFlightResponseTransformer");
726
734
  var validateFlightResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
727
735
  data.flightId = BigInt(data.flightId.toString());
728
736
  return data;
@@ -783,14 +791,13 @@ var flightReviewsControllerGetFlightReviewsResponseTransformer = /* @__PURE__ */
783
791
  return data;
784
792
  }, "flightReviewsControllerGetFlightReviewsResponseTransformer");
785
793
  var getMissionResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
786
- data.mission.captureStartTime = new Date(data.mission.captureStartTime);
787
- data.mission.captureEndTime = new Date(data.mission.captureEndTime);
788
- data.mission.createdAt = new Date(data.mission.createdAt);
789
- data.mission.updatedAt = new Date(data.mission.updatedAt);
790
- if (data.vault) {
791
- data.vault.createdAt = new Date(data.vault.createdAt);
792
- data.vault.updatedAt = new Date(data.vault.updatedAt);
793
- }
794
+ data.captureStartTime = new Date(data.captureStartTime);
795
+ data.captureEndTime = new Date(data.captureEndTime);
796
+ data.createdAt = new Date(data.createdAt);
797
+ data.updatedAt = new Date(data.updatedAt);
798
+ data.payout.createdAt = new Date(data.payout.createdAt);
799
+ data.vault.createdAt = new Date(data.vault.createdAt);
800
+ data.vault.updatedAt = new Date(data.vault.updatedAt);
794
801
  return data;
795
802
  }, "getMissionResponseDtoSchemaResponseTransformer");
796
803
  var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(async (data) => {
@@ -799,14 +806,13 @@ var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(asy
799
806
  }, "missionsControllerGetMissionResponseTransformer");
800
807
  var getMissionsResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
801
808
  data.missions = data.missions.map((item) => {
802
- item.mission.captureStartTime = new Date(item.mission.captureStartTime);
803
- item.mission.captureEndTime = new Date(item.mission.captureEndTime);
804
- item.mission.createdAt = new Date(item.mission.createdAt);
805
- item.mission.updatedAt = new Date(item.mission.updatedAt);
806
- if (item.vault) {
807
- item.vault.createdAt = new Date(item.vault.createdAt);
808
- item.vault.updatedAt = new Date(item.vault.updatedAt);
809
- }
809
+ item.captureStartTime = new Date(item.captureStartTime);
810
+ item.captureEndTime = new Date(item.captureEndTime);
811
+ item.createdAt = new Date(item.createdAt);
812
+ item.updatedAt = new Date(item.updatedAt);
813
+ item.payout.createdAt = new Date(item.payout.createdAt);
814
+ item.vault.createdAt = new Date(item.vault.createdAt);
815
+ item.vault.updatedAt = new Date(item.vault.updatedAt);
810
816
  return item;
811
817
  });
812
818
  return data;
@@ -827,6 +833,54 @@ var missionsControllerCreateMissionsResponseTransformer = /* @__PURE__ */ __name
827
833
  data = createMissionResponseDtoSchemaResponseTransformer(data);
828
834
  return data;
829
835
  }, "missionsControllerCreateMissionsResponseTransformer");
836
+ var getWebhooksResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
837
+ data = data.map((item) => {
838
+ item.previous_secret_expires_at = new Date(item.previous_secret_expires_at);
839
+ return item;
840
+ });
841
+ return data;
842
+ }, "getWebhooksResponseSchemaResponseTransformer");
843
+ var webhooksControllerGetManyResponseTransformer = /* @__PURE__ */ __name(async (data) => {
844
+ data = getWebhooksResponseSchemaResponseTransformer(data);
845
+ return data;
846
+ }, "webhooksControllerGetManyResponseTransformer");
847
+ var getWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
848
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
849
+ return data;
850
+ }, "getWebhookResponseSchemaResponseTransformer");
851
+ var webhooksControllerGetResponseTransformer = /* @__PURE__ */ __name(async (data) => {
852
+ data = getWebhookResponseSchemaResponseTransformer(data);
853
+ return data;
854
+ }, "webhooksControllerGetResponseTransformer");
855
+ var updateWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
856
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
857
+ return data;
858
+ }, "updateWebhookResponseSchemaResponseTransformer");
859
+ var webhooksControllerUpdateResponseTransformer = /* @__PURE__ */ __name(async (data) => {
860
+ data = updateWebhookResponseSchemaResponseTransformer(data);
861
+ return data;
862
+ }, "webhooksControllerUpdateResponseTransformer");
863
+ var regenerateWebhookSecretResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
864
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
865
+ return data;
866
+ }, "regenerateWebhookSecretResponseDtoSchemaResponseTransformer");
867
+ var webhooksControllerRegenerateSecretResponseTransformer = /* @__PURE__ */ __name(async (data) => {
868
+ data = regenerateWebhookSecretResponseDtoSchemaResponseTransformer(data);
869
+ return data;
870
+ }, "webhooksControllerRegenerateSecretResponseTransformer");
871
+ var zoneResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
872
+ data.created_at = new Date(data.created_at);
873
+ data.updated_at = new Date(data.updated_at);
874
+ return data;
875
+ }, "zoneResponseDtoSchemaResponseTransformer");
876
+ var zonesControllerCreateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
877
+ data = zoneResponseDtoSchemaResponseTransformer(data);
878
+ return data;
879
+ }, "zonesControllerCreateZoneResponseTransformer");
880
+ var zonesControllerUpdateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
881
+ data = zoneResponseDtoSchemaResponseTransformer(data);
882
+ return data;
883
+ }, "zonesControllerUpdateZoneResponseTransformer");
830
884
  var getInboundWebhookConfigsResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
831
885
  data = data.map((item) => {
832
886
  item.created_at = new Date(item.created_at);
@@ -1049,6 +1103,7 @@ var flightsControllerGetFlight = /* @__PURE__ */ __name((options) => {
1049
1103
  type: "apiKey"
1050
1104
  }
1051
1105
  ],
1106
+ responseTransformer: flightsControllerGetFlightResponseTransformer,
1052
1107
  url: "/flights/{flightId}",
1053
1108
  ...options
1054
1109
  });
@@ -1314,6 +1369,7 @@ var webhooksControllerGetMany = /* @__PURE__ */ __name((options) => {
1314
1369
  type: "apiKey"
1315
1370
  }
1316
1371
  ],
1372
+ responseTransformer: webhooksControllerGetManyResponseTransformer,
1317
1373
  url: "/org/{org_id}/webhooks",
1318
1374
  ...options
1319
1375
  });
@@ -1354,6 +1410,7 @@ var webhooksControllerGet = /* @__PURE__ */ __name((options) => {
1354
1410
  type: "apiKey"
1355
1411
  }
1356
1412
  ],
1413
+ responseTransformer: webhooksControllerGetResponseTransformer,
1357
1414
  url: "/org/{org_id}/webhooks/{id}",
1358
1415
  ...options
1359
1416
  });
@@ -1366,6 +1423,7 @@ var webhooksControllerUpdate = /* @__PURE__ */ __name((options) => {
1366
1423
  type: "apiKey"
1367
1424
  }
1368
1425
  ],
1426
+ responseTransformer: webhooksControllerUpdateResponseTransformer,
1369
1427
  url: "/org/{org_id}/webhooks/{id}",
1370
1428
  ...options,
1371
1429
  headers: {
@@ -1382,8 +1440,13 @@ var webhooksControllerRegenerateSecret = /* @__PURE__ */ __name((options) => {
1382
1440
  type: "apiKey"
1383
1441
  }
1384
1442
  ],
1443
+ responseTransformer: webhooksControllerRegenerateSecretResponseTransformer,
1385
1444
  url: "/org/{org_id}/webhooks/{id}/regenerate-secret",
1386
- ...options
1445
+ ...options,
1446
+ headers: {
1447
+ "Content-Type": "application/json",
1448
+ ...options.headers
1449
+ }
1387
1450
  });
1388
1451
  }, "webhooksControllerRegenerateSecret");
1389
1452
  var webhooksControllerTest = /* @__PURE__ */ __name((options) => {
@@ -1410,6 +1473,84 @@ var webhooksControllerGetStatus = /* @__PURE__ */ __name((options) => {
1410
1473
  ...options
1411
1474
  });
1412
1475
  }, "webhooksControllerGetStatus");
1476
+ var zonesControllerCreateZone = /* @__PURE__ */ __name((options) => {
1477
+ return (options.client ?? client).post({
1478
+ security: [
1479
+ {
1480
+ name: "x-api-token",
1481
+ type: "apiKey"
1482
+ }
1483
+ ],
1484
+ responseTransformer: zonesControllerCreateZoneResponseTransformer,
1485
+ url: "/zones",
1486
+ ...options,
1487
+ headers: {
1488
+ "Content-Type": "application/json",
1489
+ ...options.headers
1490
+ }
1491
+ });
1492
+ }, "zonesControllerCreateZone");
1493
+ var zonesControllerDeleteZone = /* @__PURE__ */ __name((options) => {
1494
+ return (options.client ?? client).delete({
1495
+ security: [
1496
+ {
1497
+ name: "x-api-token",
1498
+ type: "apiKey"
1499
+ }
1500
+ ],
1501
+ url: "/zones/{id}",
1502
+ ...options
1503
+ });
1504
+ }, "zonesControllerDeleteZone");
1505
+ var zonesControllerUpdateZone = /* @__PURE__ */ __name((options) => {
1506
+ return (options.client ?? client).put({
1507
+ security: [
1508
+ {
1509
+ name: "x-api-token",
1510
+ type: "apiKey"
1511
+ }
1512
+ ],
1513
+ responseTransformer: zonesControllerUpdateZoneResponseTransformer,
1514
+ url: "/zones/{id}",
1515
+ ...options,
1516
+ headers: {
1517
+ "Content-Type": "application/json",
1518
+ ...options.headers
1519
+ }
1520
+ });
1521
+ }, "zonesControllerUpdateZone");
1522
+ var eventProcessorMissionsSyncControllerResyncMissions = /* @__PURE__ */ __name((options) => {
1523
+ return (options.client ?? client).put({
1524
+ security: [
1525
+ {
1526
+ name: "x-api-token",
1527
+ type: "apiKey"
1528
+ }
1529
+ ],
1530
+ url: "/event-processor/missions/sync",
1531
+ ...options,
1532
+ headers: {
1533
+ "Content-Type": "application/json",
1534
+ ...options.headers
1535
+ }
1536
+ });
1537
+ }, "eventProcessorMissionsSyncControllerResyncMissions");
1538
+ var eventProcessorFlightReviewsSyncControllerResyncFlightReviews = /* @__PURE__ */ __name((options) => {
1539
+ return (options.client ?? client).put({
1540
+ security: [
1541
+ {
1542
+ name: "x-api-token",
1543
+ type: "apiKey"
1544
+ }
1545
+ ],
1546
+ url: "/event-processor/flightreviews",
1547
+ ...options,
1548
+ headers: {
1549
+ "Content-Type": "application/json",
1550
+ ...options.headers
1551
+ }
1552
+ });
1553
+ }, "eventProcessorFlightReviewsSyncControllerResyncFlightReviews");
1413
1554
  var alchemyControllerHandleWebhook = /* @__PURE__ */ __name((options) => {
1414
1555
  return (options.client ?? client).post({
1415
1556
  url: "/webhooks/inbound/alchemy",
@@ -1623,30 +1764,51 @@ var Event = z.union([
1623
1764
 
1624
1765
  // src/event/parser.ts
1625
1766
  var WEBHOOK_SECRET_HEADER = "X-Webhook-Secret";
1767
+ var WEBHOOK_PREVIOUS_SECRET_HEADER = "X-Webhook-Previous-Secret";
1768
+ var WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER = "X-Webhook-Previous-Secret-Expires-At";
1626
1769
  function parseWebhookEvent(req, webhookSecret) {
1627
- const secret = getSecretHeader(req.headers);
1628
- if (typeof secret !== "string") {
1770
+ const incoming = getFirstHeader(req.headers, WEBHOOK_SECRET_HEADER);
1771
+ if (typeof incoming !== "string") {
1629
1772
  throw new Error("Webhook request signature is not a string");
1630
1773
  }
1631
1774
  if (!Buffer.isBuffer(req.body)) {
1632
1775
  throw new Error("Webhook request body is not a Buffer");
1633
1776
  }
1634
- if (secret !== webhookSecret) {
1777
+ if (incoming === webhookSecret) {
1778
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1779
+ }
1780
+ const announcedPrevious = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_HEADER);
1781
+ const expiresRaw = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER);
1782
+ if (announcedPrevious === void 0 || expiresRaw === void 0) {
1783
+ throw new Error("Invalid webhook secret");
1784
+ }
1785
+ const expiresAt = new Date(expiresRaw);
1786
+ if (Number.isNaN(expiresAt.getTime())) {
1635
1787
  throw new Error("Invalid webhook secret");
1636
1788
  }
1637
- return Event.parse(JSON.parse(req.body.toString("utf-8")));
1789
+ if (Date.now() >= expiresAt.getTime()) {
1790
+ throw new Error("Invalid webhook secret");
1791
+ }
1792
+ if (webhookSecret === announcedPrevious) {
1793
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1794
+ }
1795
+ throw new Error("Invalid webhook secret");
1638
1796
  }
1639
1797
  __name(parseWebhookEvent, "parseWebhookEvent");
1640
- function getSecretHeader(headers) {
1641
- let value = headers[WEBHOOK_SECRET_HEADER] ?? headers[WEBHOOK_SECRET_HEADER.toLowerCase()];
1798
+ function getFirstHeader(headers, canonicalName) {
1799
+ const lower = canonicalName.toLowerCase();
1800
+ let value = headers[canonicalName] ?? headers[lower];
1642
1801
  if (Array.isArray(value)) {
1643
1802
  value = value[0];
1644
1803
  }
1645
- return value;
1804
+ return typeof value === "string" ? value : void 0;
1646
1805
  }
1647
- __name(getSecretHeader, "getSecretHeader");
1806
+ __name(getFirstHeader, "getFirstHeader");
1648
1807
  export {
1649
1808
  Event,
1809
+ WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER,
1810
+ WEBHOOK_PREVIOUS_SECRET_HEADER,
1811
+ WEBHOOK_SECRET_HEADER,
1650
1812
  alchemyControllerHandleWebhook,
1651
1813
  apiControllerGetError,
1652
1814
  apiControllerGetHello,
@@ -1664,6 +1826,8 @@ export {
1664
1826
  createClient,
1665
1827
  createConfig,
1666
1828
  dlqRedriverControllerRedriveDlq,
1829
+ eventProcessorFlightReviewsSyncControllerResyncFlightReviews,
1830
+ eventProcessorMissionsSyncControllerResyncMissions,
1667
1831
  flightPlansControllerCreate,
1668
1832
  flightPlansControllerGet,
1669
1833
  flightPlansControllerGetMany,
@@ -1701,5 +1865,8 @@ export {
1701
1865
  webhooksControllerGetStatus,
1702
1866
  webhooksControllerRegenerateSecret,
1703
1867
  webhooksControllerTest,
1704
- webhooksControllerUpdate
1868
+ webhooksControllerUpdate,
1869
+ zonesControllerCreateZone,
1870
+ zonesControllerDeleteZone,
1871
+ zonesControllerUpdateZone
1705
1872
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@layer-drone/protocol",
3
3
  "description": "Layer Drone protocol SDK with typed API client and event parsing",
4
- "version": "0.5.0",
4
+ "version": "0.6.0",
5
5
  "license": "MIT",
6
6
  "files": [
7
7
  "dist",