@layer-drone/protocol 0.5.0 → 0.7.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,10 +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);
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
+ if (data.payout) {
886
+ data.payout.createdAt = new Date(data.payout.createdAt);
887
+ }
869
888
  if (data.vault) {
870
889
  data.vault.createdAt = new Date(data.vault.createdAt);
871
890
  data.vault.updatedAt = new Date(data.vault.updatedAt);
@@ -878,10 +897,13 @@ var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(asy
878
897
  }, "missionsControllerGetMissionResponseTransformer");
879
898
  var getMissionsResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
880
899
  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);
900
+ item.captureStartTime = new Date(item.captureStartTime);
901
+ item.captureEndTime = new Date(item.captureEndTime);
902
+ item.createdAt = new Date(item.createdAt);
903
+ item.updatedAt = new Date(item.updatedAt);
904
+ if (item.payout) {
905
+ item.payout.createdAt = new Date(item.payout.createdAt);
906
+ }
885
907
  if (item.vault) {
886
908
  item.vault.createdAt = new Date(item.vault.createdAt);
887
909
  item.vault.updatedAt = new Date(item.vault.updatedAt);
@@ -906,6 +928,54 @@ var missionsControllerCreateMissionsResponseTransformer = /* @__PURE__ */ __name
906
928
  data = createMissionResponseDtoSchemaResponseTransformer(data);
907
929
  return data;
908
930
  }, "missionsControllerCreateMissionsResponseTransformer");
931
+ var getWebhooksResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
932
+ data = data.map((item) => {
933
+ item.previous_secret_expires_at = new Date(item.previous_secret_expires_at);
934
+ return item;
935
+ });
936
+ return data;
937
+ }, "getWebhooksResponseSchemaResponseTransformer");
938
+ var webhooksControllerGetManyResponseTransformer = /* @__PURE__ */ __name(async (data) => {
939
+ data = getWebhooksResponseSchemaResponseTransformer(data);
940
+ return data;
941
+ }, "webhooksControllerGetManyResponseTransformer");
942
+ var getWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
943
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
944
+ return data;
945
+ }, "getWebhookResponseSchemaResponseTransformer");
946
+ var webhooksControllerGetResponseTransformer = /* @__PURE__ */ __name(async (data) => {
947
+ data = getWebhookResponseSchemaResponseTransformer(data);
948
+ return data;
949
+ }, "webhooksControllerGetResponseTransformer");
950
+ var updateWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
951
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
952
+ return data;
953
+ }, "updateWebhookResponseSchemaResponseTransformer");
954
+ var webhooksControllerUpdateResponseTransformer = /* @__PURE__ */ __name(async (data) => {
955
+ data = updateWebhookResponseSchemaResponseTransformer(data);
956
+ return data;
957
+ }, "webhooksControllerUpdateResponseTransformer");
958
+ var regenerateWebhookSecretResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
959
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
960
+ return data;
961
+ }, "regenerateWebhookSecretResponseDtoSchemaResponseTransformer");
962
+ var webhooksControllerRegenerateSecretResponseTransformer = /* @__PURE__ */ __name(async (data) => {
963
+ data = regenerateWebhookSecretResponseDtoSchemaResponseTransformer(data);
964
+ return data;
965
+ }, "webhooksControllerRegenerateSecretResponseTransformer");
966
+ var zoneResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
967
+ data.created_at = new Date(data.created_at);
968
+ data.updated_at = new Date(data.updated_at);
969
+ return data;
970
+ }, "zoneResponseDtoSchemaResponseTransformer");
971
+ var zonesControllerCreateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
972
+ data = zoneResponseDtoSchemaResponseTransformer(data);
973
+ return data;
974
+ }, "zonesControllerCreateZoneResponseTransformer");
975
+ var zonesControllerUpdateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
976
+ data = zoneResponseDtoSchemaResponseTransformer(data);
977
+ return data;
978
+ }, "zonesControllerUpdateZoneResponseTransformer");
909
979
  var getInboundWebhookConfigsResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
910
980
  data = data.map((item) => {
911
981
  item.created_at = new Date(item.created_at);
@@ -1128,6 +1198,7 @@ var flightsControllerGetFlight = /* @__PURE__ */ __name((options) => {
1128
1198
  type: "apiKey"
1129
1199
  }
1130
1200
  ],
1201
+ responseTransformer: flightsControllerGetFlightResponseTransformer,
1131
1202
  url: "/flights/{flightId}",
1132
1203
  ...options
1133
1204
  });
@@ -1393,6 +1464,7 @@ var webhooksControllerGetMany = /* @__PURE__ */ __name((options) => {
1393
1464
  type: "apiKey"
1394
1465
  }
1395
1466
  ],
1467
+ responseTransformer: webhooksControllerGetManyResponseTransformer,
1396
1468
  url: "/org/{org_id}/webhooks",
1397
1469
  ...options
1398
1470
  });
@@ -1433,6 +1505,7 @@ var webhooksControllerGet = /* @__PURE__ */ __name((options) => {
1433
1505
  type: "apiKey"
1434
1506
  }
1435
1507
  ],
1508
+ responseTransformer: webhooksControllerGetResponseTransformer,
1436
1509
  url: "/org/{org_id}/webhooks/{id}",
1437
1510
  ...options
1438
1511
  });
@@ -1445,6 +1518,7 @@ var webhooksControllerUpdate = /* @__PURE__ */ __name((options) => {
1445
1518
  type: "apiKey"
1446
1519
  }
1447
1520
  ],
1521
+ responseTransformer: webhooksControllerUpdateResponseTransformer,
1448
1522
  url: "/org/{org_id}/webhooks/{id}",
1449
1523
  ...options,
1450
1524
  headers: {
@@ -1461,8 +1535,13 @@ var webhooksControllerRegenerateSecret = /* @__PURE__ */ __name((options) => {
1461
1535
  type: "apiKey"
1462
1536
  }
1463
1537
  ],
1538
+ responseTransformer: webhooksControllerRegenerateSecretResponseTransformer,
1464
1539
  url: "/org/{org_id}/webhooks/{id}/regenerate-secret",
1465
- ...options
1540
+ ...options,
1541
+ headers: {
1542
+ "Content-Type": "application/json",
1543
+ ...options.headers
1544
+ }
1466
1545
  });
1467
1546
  }, "webhooksControllerRegenerateSecret");
1468
1547
  var webhooksControllerTest = /* @__PURE__ */ __name((options) => {
@@ -1489,6 +1568,84 @@ var webhooksControllerGetStatus = /* @__PURE__ */ __name((options) => {
1489
1568
  ...options
1490
1569
  });
1491
1570
  }, "webhooksControllerGetStatus");
1571
+ var zonesControllerCreateZone = /* @__PURE__ */ __name((options) => {
1572
+ return (options.client ?? client).post({
1573
+ security: [
1574
+ {
1575
+ name: "x-api-token",
1576
+ type: "apiKey"
1577
+ }
1578
+ ],
1579
+ responseTransformer: zonesControllerCreateZoneResponseTransformer,
1580
+ url: "/zones",
1581
+ ...options,
1582
+ headers: {
1583
+ "Content-Type": "application/json",
1584
+ ...options.headers
1585
+ }
1586
+ });
1587
+ }, "zonesControllerCreateZone");
1588
+ var zonesControllerDeleteZone = /* @__PURE__ */ __name((options) => {
1589
+ return (options.client ?? client).delete({
1590
+ security: [
1591
+ {
1592
+ name: "x-api-token",
1593
+ type: "apiKey"
1594
+ }
1595
+ ],
1596
+ url: "/zones/{id}",
1597
+ ...options
1598
+ });
1599
+ }, "zonesControllerDeleteZone");
1600
+ var zonesControllerUpdateZone = /* @__PURE__ */ __name((options) => {
1601
+ return (options.client ?? client).put({
1602
+ security: [
1603
+ {
1604
+ name: "x-api-token",
1605
+ type: "apiKey"
1606
+ }
1607
+ ],
1608
+ responseTransformer: zonesControllerUpdateZoneResponseTransformer,
1609
+ url: "/zones/{id}",
1610
+ ...options,
1611
+ headers: {
1612
+ "Content-Type": "application/json",
1613
+ ...options.headers
1614
+ }
1615
+ });
1616
+ }, "zonesControllerUpdateZone");
1617
+ var eventProcessorMissionsSyncControllerResyncMissions = /* @__PURE__ */ __name((options) => {
1618
+ return (options.client ?? client).put({
1619
+ security: [
1620
+ {
1621
+ name: "x-api-token",
1622
+ type: "apiKey"
1623
+ }
1624
+ ],
1625
+ url: "/event-processor/missions/sync",
1626
+ ...options,
1627
+ headers: {
1628
+ "Content-Type": "application/json",
1629
+ ...options.headers
1630
+ }
1631
+ });
1632
+ }, "eventProcessorMissionsSyncControllerResyncMissions");
1633
+ var eventProcessorFlightReviewsSyncControllerResyncFlightReviews = /* @__PURE__ */ __name((options) => {
1634
+ return (options.client ?? client).put({
1635
+ security: [
1636
+ {
1637
+ name: "x-api-token",
1638
+ type: "apiKey"
1639
+ }
1640
+ ],
1641
+ url: "/event-processor/flightreviews",
1642
+ ...options,
1643
+ headers: {
1644
+ "Content-Type": "application/json",
1645
+ ...options.headers
1646
+ }
1647
+ });
1648
+ }, "eventProcessorFlightReviewsSyncControllerResyncFlightReviews");
1492
1649
  var alchemyControllerHandleWebhook = /* @__PURE__ */ __name((options) => {
1493
1650
  return (options.client ?? client).post({
1494
1651
  url: "/webhooks/inbound/alchemy",
@@ -1702,31 +1859,52 @@ var Event = import_zod.z.union([
1702
1859
 
1703
1860
  // src/event/parser.ts
1704
1861
  var WEBHOOK_SECRET_HEADER = "X-Webhook-Secret";
1862
+ var WEBHOOK_PREVIOUS_SECRET_HEADER = "X-Webhook-Previous-Secret";
1863
+ var WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER = "X-Webhook-Previous-Secret-Expires-At";
1705
1864
  function parseWebhookEvent(req, webhookSecret) {
1706
- const secret = getSecretHeader(req.headers);
1707
- if (typeof secret !== "string") {
1865
+ const incoming = getFirstHeader(req.headers, WEBHOOK_SECRET_HEADER);
1866
+ if (typeof incoming !== "string") {
1708
1867
  throw new Error("Webhook request signature is not a string");
1709
1868
  }
1710
1869
  if (!Buffer.isBuffer(req.body)) {
1711
1870
  throw new Error("Webhook request body is not a Buffer");
1712
1871
  }
1713
- if (secret !== webhookSecret) {
1872
+ if (incoming === webhookSecret) {
1873
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1874
+ }
1875
+ const announcedPrevious = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_HEADER);
1876
+ const expiresRaw = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER);
1877
+ if (announcedPrevious === void 0 || expiresRaw === void 0) {
1878
+ throw new Error("Invalid webhook secret");
1879
+ }
1880
+ const expiresAt = new Date(expiresRaw);
1881
+ if (Number.isNaN(expiresAt.getTime())) {
1714
1882
  throw new Error("Invalid webhook secret");
1715
1883
  }
1716
- return Event.parse(JSON.parse(req.body.toString("utf-8")));
1884
+ if (Date.now() >= expiresAt.getTime()) {
1885
+ throw new Error("Invalid webhook secret");
1886
+ }
1887
+ if (webhookSecret === announcedPrevious) {
1888
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1889
+ }
1890
+ throw new Error("Invalid webhook secret");
1717
1891
  }
1718
1892
  __name(parseWebhookEvent, "parseWebhookEvent");
1719
- function getSecretHeader(headers) {
1720
- let value = headers[WEBHOOK_SECRET_HEADER] ?? headers[WEBHOOK_SECRET_HEADER.toLowerCase()];
1893
+ function getFirstHeader(headers, canonicalName) {
1894
+ const lower = canonicalName.toLowerCase();
1895
+ let value = headers[canonicalName] ?? headers[lower];
1721
1896
  if (Array.isArray(value)) {
1722
1897
  value = value[0];
1723
1898
  }
1724
- return value;
1899
+ return typeof value === "string" ? value : void 0;
1725
1900
  }
1726
- __name(getSecretHeader, "getSecretHeader");
1901
+ __name(getFirstHeader, "getFirstHeader");
1727
1902
  // Annotate the CommonJS export names for ESM import in node:
1728
1903
  0 && (module.exports = {
1729
1904
  Event,
1905
+ WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER,
1906
+ WEBHOOK_PREVIOUS_SECRET_HEADER,
1907
+ WEBHOOK_SECRET_HEADER,
1730
1908
  alchemyControllerHandleWebhook,
1731
1909
  apiControllerGetError,
1732
1910
  apiControllerGetHello,
@@ -1744,6 +1922,8 @@ __name(getSecretHeader, "getSecretHeader");
1744
1922
  createClient,
1745
1923
  createConfig,
1746
1924
  dlqRedriverControllerRedriveDlq,
1925
+ eventProcessorFlightReviewsSyncControllerResyncFlightReviews,
1926
+ eventProcessorMissionsSyncControllerResyncMissions,
1747
1927
  flightPlansControllerCreate,
1748
1928
  flightPlansControllerGet,
1749
1929
  flightPlansControllerGetMany,
@@ -1781,5 +1961,8 @@ __name(getSecretHeader, "getSecretHeader");
1781
1961
  webhooksControllerGetStatus,
1782
1962
  webhooksControllerRegenerateSecret,
1783
1963
  webhooksControllerTest,
1784
- webhooksControllerUpdate
1964
+ webhooksControllerUpdate,
1965
+ zonesControllerCreateZone,
1966
+ zonesControllerDeleteZone,
1967
+ zonesControllerUpdateZone
1785
1968
  });
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,10 +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);
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
+ if (data.payout) {
799
+ data.payout.createdAt = new Date(data.payout.createdAt);
800
+ }
790
801
  if (data.vault) {
791
802
  data.vault.createdAt = new Date(data.vault.createdAt);
792
803
  data.vault.updatedAt = new Date(data.vault.updatedAt);
@@ -799,10 +810,13 @@ var missionsControllerGetMissionResponseTransformer = /* @__PURE__ */ __name(asy
799
810
  }, "missionsControllerGetMissionResponseTransformer");
800
811
  var getMissionsResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
801
812
  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);
813
+ item.captureStartTime = new Date(item.captureStartTime);
814
+ item.captureEndTime = new Date(item.captureEndTime);
815
+ item.createdAt = new Date(item.createdAt);
816
+ item.updatedAt = new Date(item.updatedAt);
817
+ if (item.payout) {
818
+ item.payout.createdAt = new Date(item.payout.createdAt);
819
+ }
806
820
  if (item.vault) {
807
821
  item.vault.createdAt = new Date(item.vault.createdAt);
808
822
  item.vault.updatedAt = new Date(item.vault.updatedAt);
@@ -827,6 +841,54 @@ var missionsControllerCreateMissionsResponseTransformer = /* @__PURE__ */ __name
827
841
  data = createMissionResponseDtoSchemaResponseTransformer(data);
828
842
  return data;
829
843
  }, "missionsControllerCreateMissionsResponseTransformer");
844
+ var getWebhooksResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
845
+ data = data.map((item) => {
846
+ item.previous_secret_expires_at = new Date(item.previous_secret_expires_at);
847
+ return item;
848
+ });
849
+ return data;
850
+ }, "getWebhooksResponseSchemaResponseTransformer");
851
+ var webhooksControllerGetManyResponseTransformer = /* @__PURE__ */ __name(async (data) => {
852
+ data = getWebhooksResponseSchemaResponseTransformer(data);
853
+ return data;
854
+ }, "webhooksControllerGetManyResponseTransformer");
855
+ var getWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
856
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
857
+ return data;
858
+ }, "getWebhookResponseSchemaResponseTransformer");
859
+ var webhooksControllerGetResponseTransformer = /* @__PURE__ */ __name(async (data) => {
860
+ data = getWebhookResponseSchemaResponseTransformer(data);
861
+ return data;
862
+ }, "webhooksControllerGetResponseTransformer");
863
+ var updateWebhookResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
864
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
865
+ return data;
866
+ }, "updateWebhookResponseSchemaResponseTransformer");
867
+ var webhooksControllerUpdateResponseTransformer = /* @__PURE__ */ __name(async (data) => {
868
+ data = updateWebhookResponseSchemaResponseTransformer(data);
869
+ return data;
870
+ }, "webhooksControllerUpdateResponseTransformer");
871
+ var regenerateWebhookSecretResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
872
+ data.previous_secret_expires_at = new Date(data.previous_secret_expires_at);
873
+ return data;
874
+ }, "regenerateWebhookSecretResponseDtoSchemaResponseTransformer");
875
+ var webhooksControllerRegenerateSecretResponseTransformer = /* @__PURE__ */ __name(async (data) => {
876
+ data = regenerateWebhookSecretResponseDtoSchemaResponseTransformer(data);
877
+ return data;
878
+ }, "webhooksControllerRegenerateSecretResponseTransformer");
879
+ var zoneResponseDtoSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
880
+ data.created_at = new Date(data.created_at);
881
+ data.updated_at = new Date(data.updated_at);
882
+ return data;
883
+ }, "zoneResponseDtoSchemaResponseTransformer");
884
+ var zonesControllerCreateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
885
+ data = zoneResponseDtoSchemaResponseTransformer(data);
886
+ return data;
887
+ }, "zonesControllerCreateZoneResponseTransformer");
888
+ var zonesControllerUpdateZoneResponseTransformer = /* @__PURE__ */ __name(async (data) => {
889
+ data = zoneResponseDtoSchemaResponseTransformer(data);
890
+ return data;
891
+ }, "zonesControllerUpdateZoneResponseTransformer");
830
892
  var getInboundWebhookConfigsResponseSchemaResponseTransformer = /* @__PURE__ */ __name((data) => {
831
893
  data = data.map((item) => {
832
894
  item.created_at = new Date(item.created_at);
@@ -1049,6 +1111,7 @@ var flightsControllerGetFlight = /* @__PURE__ */ __name((options) => {
1049
1111
  type: "apiKey"
1050
1112
  }
1051
1113
  ],
1114
+ responseTransformer: flightsControllerGetFlightResponseTransformer,
1052
1115
  url: "/flights/{flightId}",
1053
1116
  ...options
1054
1117
  });
@@ -1314,6 +1377,7 @@ var webhooksControllerGetMany = /* @__PURE__ */ __name((options) => {
1314
1377
  type: "apiKey"
1315
1378
  }
1316
1379
  ],
1380
+ responseTransformer: webhooksControllerGetManyResponseTransformer,
1317
1381
  url: "/org/{org_id}/webhooks",
1318
1382
  ...options
1319
1383
  });
@@ -1354,6 +1418,7 @@ var webhooksControllerGet = /* @__PURE__ */ __name((options) => {
1354
1418
  type: "apiKey"
1355
1419
  }
1356
1420
  ],
1421
+ responseTransformer: webhooksControllerGetResponseTransformer,
1357
1422
  url: "/org/{org_id}/webhooks/{id}",
1358
1423
  ...options
1359
1424
  });
@@ -1366,6 +1431,7 @@ var webhooksControllerUpdate = /* @__PURE__ */ __name((options) => {
1366
1431
  type: "apiKey"
1367
1432
  }
1368
1433
  ],
1434
+ responseTransformer: webhooksControllerUpdateResponseTransformer,
1369
1435
  url: "/org/{org_id}/webhooks/{id}",
1370
1436
  ...options,
1371
1437
  headers: {
@@ -1382,8 +1448,13 @@ var webhooksControllerRegenerateSecret = /* @__PURE__ */ __name((options) => {
1382
1448
  type: "apiKey"
1383
1449
  }
1384
1450
  ],
1451
+ responseTransformer: webhooksControllerRegenerateSecretResponseTransformer,
1385
1452
  url: "/org/{org_id}/webhooks/{id}/regenerate-secret",
1386
- ...options
1453
+ ...options,
1454
+ headers: {
1455
+ "Content-Type": "application/json",
1456
+ ...options.headers
1457
+ }
1387
1458
  });
1388
1459
  }, "webhooksControllerRegenerateSecret");
1389
1460
  var webhooksControllerTest = /* @__PURE__ */ __name((options) => {
@@ -1410,6 +1481,84 @@ var webhooksControllerGetStatus = /* @__PURE__ */ __name((options) => {
1410
1481
  ...options
1411
1482
  });
1412
1483
  }, "webhooksControllerGetStatus");
1484
+ var zonesControllerCreateZone = /* @__PURE__ */ __name((options) => {
1485
+ return (options.client ?? client).post({
1486
+ security: [
1487
+ {
1488
+ name: "x-api-token",
1489
+ type: "apiKey"
1490
+ }
1491
+ ],
1492
+ responseTransformer: zonesControllerCreateZoneResponseTransformer,
1493
+ url: "/zones",
1494
+ ...options,
1495
+ headers: {
1496
+ "Content-Type": "application/json",
1497
+ ...options.headers
1498
+ }
1499
+ });
1500
+ }, "zonesControllerCreateZone");
1501
+ var zonesControllerDeleteZone = /* @__PURE__ */ __name((options) => {
1502
+ return (options.client ?? client).delete({
1503
+ security: [
1504
+ {
1505
+ name: "x-api-token",
1506
+ type: "apiKey"
1507
+ }
1508
+ ],
1509
+ url: "/zones/{id}",
1510
+ ...options
1511
+ });
1512
+ }, "zonesControllerDeleteZone");
1513
+ var zonesControllerUpdateZone = /* @__PURE__ */ __name((options) => {
1514
+ return (options.client ?? client).put({
1515
+ security: [
1516
+ {
1517
+ name: "x-api-token",
1518
+ type: "apiKey"
1519
+ }
1520
+ ],
1521
+ responseTransformer: zonesControllerUpdateZoneResponseTransformer,
1522
+ url: "/zones/{id}",
1523
+ ...options,
1524
+ headers: {
1525
+ "Content-Type": "application/json",
1526
+ ...options.headers
1527
+ }
1528
+ });
1529
+ }, "zonesControllerUpdateZone");
1530
+ var eventProcessorMissionsSyncControllerResyncMissions = /* @__PURE__ */ __name((options) => {
1531
+ return (options.client ?? client).put({
1532
+ security: [
1533
+ {
1534
+ name: "x-api-token",
1535
+ type: "apiKey"
1536
+ }
1537
+ ],
1538
+ url: "/event-processor/missions/sync",
1539
+ ...options,
1540
+ headers: {
1541
+ "Content-Type": "application/json",
1542
+ ...options.headers
1543
+ }
1544
+ });
1545
+ }, "eventProcessorMissionsSyncControllerResyncMissions");
1546
+ var eventProcessorFlightReviewsSyncControllerResyncFlightReviews = /* @__PURE__ */ __name((options) => {
1547
+ return (options.client ?? client).put({
1548
+ security: [
1549
+ {
1550
+ name: "x-api-token",
1551
+ type: "apiKey"
1552
+ }
1553
+ ],
1554
+ url: "/event-processor/flightreviews",
1555
+ ...options,
1556
+ headers: {
1557
+ "Content-Type": "application/json",
1558
+ ...options.headers
1559
+ }
1560
+ });
1561
+ }, "eventProcessorFlightReviewsSyncControllerResyncFlightReviews");
1413
1562
  var alchemyControllerHandleWebhook = /* @__PURE__ */ __name((options) => {
1414
1563
  return (options.client ?? client).post({
1415
1564
  url: "/webhooks/inbound/alchemy",
@@ -1623,30 +1772,51 @@ var Event = z.union([
1623
1772
 
1624
1773
  // src/event/parser.ts
1625
1774
  var WEBHOOK_SECRET_HEADER = "X-Webhook-Secret";
1775
+ var WEBHOOK_PREVIOUS_SECRET_HEADER = "X-Webhook-Previous-Secret";
1776
+ var WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER = "X-Webhook-Previous-Secret-Expires-At";
1626
1777
  function parseWebhookEvent(req, webhookSecret) {
1627
- const secret = getSecretHeader(req.headers);
1628
- if (typeof secret !== "string") {
1778
+ const incoming = getFirstHeader(req.headers, WEBHOOK_SECRET_HEADER);
1779
+ if (typeof incoming !== "string") {
1629
1780
  throw new Error("Webhook request signature is not a string");
1630
1781
  }
1631
1782
  if (!Buffer.isBuffer(req.body)) {
1632
1783
  throw new Error("Webhook request body is not a Buffer");
1633
1784
  }
1634
- if (secret !== webhookSecret) {
1785
+ if (incoming === webhookSecret) {
1786
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1787
+ }
1788
+ const announcedPrevious = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_HEADER);
1789
+ const expiresRaw = getFirstHeader(req.headers, WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER);
1790
+ if (announcedPrevious === void 0 || expiresRaw === void 0) {
1791
+ throw new Error("Invalid webhook secret");
1792
+ }
1793
+ const expiresAt = new Date(expiresRaw);
1794
+ if (Number.isNaN(expiresAt.getTime())) {
1635
1795
  throw new Error("Invalid webhook secret");
1636
1796
  }
1637
- return Event.parse(JSON.parse(req.body.toString("utf-8")));
1797
+ if (Date.now() >= expiresAt.getTime()) {
1798
+ throw new Error("Invalid webhook secret");
1799
+ }
1800
+ if (webhookSecret === announcedPrevious) {
1801
+ return Event.parse(JSON.parse(req.body.toString("utf-8")));
1802
+ }
1803
+ throw new Error("Invalid webhook secret");
1638
1804
  }
1639
1805
  __name(parseWebhookEvent, "parseWebhookEvent");
1640
- function getSecretHeader(headers) {
1641
- let value = headers[WEBHOOK_SECRET_HEADER] ?? headers[WEBHOOK_SECRET_HEADER.toLowerCase()];
1806
+ function getFirstHeader(headers, canonicalName) {
1807
+ const lower = canonicalName.toLowerCase();
1808
+ let value = headers[canonicalName] ?? headers[lower];
1642
1809
  if (Array.isArray(value)) {
1643
1810
  value = value[0];
1644
1811
  }
1645
- return value;
1812
+ return typeof value === "string" ? value : void 0;
1646
1813
  }
1647
- __name(getSecretHeader, "getSecretHeader");
1814
+ __name(getFirstHeader, "getFirstHeader");
1648
1815
  export {
1649
1816
  Event,
1817
+ WEBHOOK_PREVIOUS_SECRET_EXPIRES_AT_HEADER,
1818
+ WEBHOOK_PREVIOUS_SECRET_HEADER,
1819
+ WEBHOOK_SECRET_HEADER,
1650
1820
  alchemyControllerHandleWebhook,
1651
1821
  apiControllerGetError,
1652
1822
  apiControllerGetHello,
@@ -1664,6 +1834,8 @@ export {
1664
1834
  createClient,
1665
1835
  createConfig,
1666
1836
  dlqRedriverControllerRedriveDlq,
1837
+ eventProcessorFlightReviewsSyncControllerResyncFlightReviews,
1838
+ eventProcessorMissionsSyncControllerResyncMissions,
1667
1839
  flightPlansControllerCreate,
1668
1840
  flightPlansControllerGet,
1669
1841
  flightPlansControllerGetMany,
@@ -1701,5 +1873,8 @@ export {
1701
1873
  webhooksControllerGetStatus,
1702
1874
  webhooksControllerRegenerateSecret,
1703
1875
  webhooksControllerTest,
1704
- webhooksControllerUpdate
1876
+ webhooksControllerUpdate,
1877
+ zonesControllerCreateZone,
1878
+ zonesControllerDeleteZone,
1879
+ zonesControllerUpdateZone
1705
1880
  };
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.7.0",
5
5
  "license": "MIT",
6
6
  "files": [
7
7
  "dist",