@trillboards/api-client 0.1.3 → 0.2.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Trillboards, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.d.mts CHANGED
@@ -641,6 +641,389 @@ declare const Webhooks: {
641
641
  */
642
642
  declare const VERSION = "0.1.3";
643
643
 
644
- declare const generatedTypes: {};
644
+ type BleScanResultData = {
645
+ appleContinuitySubtype?: number | null;
646
+ deviceType?: number | null;
647
+ ibeaconMajor?: number | null;
648
+ ibeaconMinor?: number | null;
649
+ ibeaconUuid?: string | null;
650
+ manufacturerCompanyId?: number | null;
651
+ rawAddress: string;
652
+ rssi: number;
653
+ serviceUuids?: Array<string> | null;
654
+ stableManufacturerPayloadHex?: string | null;
655
+ txPowerDbm?: number | null;
656
+ [key: string]: unknown;
657
+ };
658
+ type DeviceCapabilityPayload = {
659
+ agentType?: string | null;
660
+ agentVersion?: string | null;
661
+ audienceSensing?: {
662
+ cameraAvailable?: boolean | null;
663
+ cameraCount?: number | null;
664
+ cameraHealth?: {
665
+ lastFailureClass?: string | null;
666
+ lastFailureMessage?: string | null;
667
+ lastFrameAtMs?: number | null;
668
+ retryCount?: number | null;
669
+ state?: string | null;
670
+ [key: string]: unknown;
671
+ } | null;
672
+ cameraType?: string | null;
673
+ microphoneAvailable?: boolean | null;
674
+ sensingMode?: string | null;
675
+ [key: string]: unknown;
676
+ } | null;
677
+ audioControl?: {
678
+ mute?: boolean | null;
679
+ volume?: boolean | null;
680
+ [key: string]: unknown;
681
+ } | null;
682
+ capabilitiesVersion?: number | null;
683
+ environmentSensors?: {
684
+ ambientLight?: boolean | null;
685
+ temperature?: boolean | null;
686
+ [key: string]: unknown;
687
+ } | null;
688
+ inputControl?: {
689
+ appSwitch?: boolean | null;
690
+ hdmi?: boolean | null;
691
+ [key: string]: unknown;
692
+ } | null;
693
+ isDeviceOwner?: boolean | null;
694
+ managementCapabilities?: {
695
+ clearCache?: boolean | null;
696
+ installApk?: boolean | null;
697
+ kioskMode?: boolean | null;
698
+ reboot?: boolean | null;
699
+ restart?: boolean | null;
700
+ screenshot?: boolean | null;
701
+ wipe?: boolean | null;
702
+ [key: string]: unknown;
703
+ } | null;
704
+ mlCapabilities?: {
705
+ availableRamMb?: number | null;
706
+ chipsetName?: string | null;
707
+ chipsetVendor?: string | null;
708
+ cpuAbi?: string | null;
709
+ densityDpi?: number | null;
710
+ gpuDelegateSupported?: boolean | null;
711
+ gpuName?: string | null;
712
+ hasNpu?: boolean | null;
713
+ maxVlmSizeMb?: number | null;
714
+ nnapiSupported?: boolean | null;
715
+ npuName?: string | null;
716
+ osApiLevel?: number | null;
717
+ recommendedModelTier?: string | null;
718
+ screenHeightPx?: number | null;
719
+ screenWidthPx?: number | null;
720
+ totalRamMb?: number | null;
721
+ [key: string]: unknown;
722
+ } | null;
723
+ powerControl?: {
724
+ cec?: boolean | null;
725
+ softBlackout?: boolean | null;
726
+ wol?: boolean | null;
727
+ [key: string]: unknown;
728
+ } | null;
729
+ wifiCsiSensing?: {
730
+ csiAvailable?: boolean | null;
731
+ csiHardwareType?: string | null;
732
+ csiNodeCount?: number | null;
733
+ [key: string]: unknown;
734
+ } | null;
735
+ [key: string]: unknown;
736
+ };
737
+ type HttpProbeResult = {
738
+ host: string;
739
+ port?: number | null;
740
+ server?: string | null;
741
+ [key: string]: unknown;
742
+ };
743
+ type MdnsNetworkDevice = {
744
+ host?: string | null;
745
+ instanceName: string;
746
+ mdnsModel?: string | null;
747
+ mdnsSoftwareVersion?: string | null;
748
+ mdnsVendor?: string | null;
749
+ port?: number | null;
750
+ serviceType: string;
751
+ [key: string]: unknown;
752
+ };
753
+ type PartnerAdDeliveryProfile = {
754
+ android_api_level?: number | null;
755
+ auto_recovery_enabled?: boolean;
756
+ ima_integration?: "android_native" | "html5_webview" | "disabled" | "unknown";
757
+ mode?: "ima_sdk" | "vast_fallback";
758
+ notes?: Array<string>;
759
+ reason?: string;
760
+ webview_chromium_major?: number | null;
761
+ };
762
+ /**
763
+ * Heartbeat payload from agent-core / agent-core-lite Android partner
764
+ * SDKs. Only includes fields verified populated in production
765
+ * `signal_observations` (last 30 days). Stub fields wired in Kotlin but
766
+ * never observed in CH are intentionally excluded; re-add only after
767
+ * telemetry confirms >1% population over 7 days.
768
+ *
769
+ */
770
+ type PartnerDeviceHeartbeatBody = {
771
+ advertisingId?: string | null;
772
+ advertisingIdType?: "gaid" | "idfa" | null | null;
773
+ bleDeviceCount?: number;
774
+ capabilities?: DeviceCapabilityPayload;
775
+ discoveredNetworkDevices?: Array<MdnsNetworkDevice> | null;
776
+ fingerprint?: string;
777
+ gatewayIpHash?: string | null;
778
+ httpProbes?: Array<HttpProbeResult> | null;
779
+ limitAdTracking?: boolean | null;
780
+ metadata?: Record<string, unknown>;
781
+ /** Capped at 50 devices (RSSI-sorted, strongest first). */
782
+ nearbyBleDevices?: Array<BleScanResultData> | null;
783
+ nearbyWifiNetworks?: Array<WifiScanResult> | null;
784
+ networkDeviceCount?: number;
785
+ /** Heartbeat schema version (1=baseline, 2=nativeSensorSnapshot) */
786
+ schemaVersion?: number;
787
+ screenId?: string | null;
788
+ /** Per-source skip-reason counter map. Shape `{source: {reason: count}}`. */
789
+ skipReasonCounts?: Record<string, Record<string, number>>;
790
+ ssdpDevices?: Array<SsdpDeviceInfo> | null;
791
+ status?: string;
792
+ wifiBssidHash?: string | null;
793
+ wifiEnvironment?: WifiEnvironmentSnapshot;
794
+ wifiNetworkCount?: number;
795
+ wifiSsidHash?: string | null;
796
+ [key: string]: unknown;
797
+ };
798
+ type PartnerHeartbeatCommand = {
799
+ /** Command normalized for partner SDK compatibility. */
800
+ command?: string;
801
+ id?: string;
802
+ payload?: Record<string, unknown>;
803
+ queued_at?: string;
804
+ };
805
+ type PartnerHeartbeatData = {
806
+ ad_delivery_profile?: PartnerAdDeliveryProfile;
807
+ commands?: Array<PartnerHeartbeatCommand>;
808
+ last_seen_at?: string;
809
+ status?: "online" | "offline";
810
+ };
811
+ type PartnerHeartbeatMeasurementMetadata = {
812
+ ageSeconds?: number | null;
813
+ cachedAt?: string | null;
814
+ receivedAt?: string | null;
815
+ source?: "redis_twin" | "pg_fallback" | "unknown";
816
+ [key: string]: unknown;
817
+ };
818
+ type PartnerHeartbeatQueryData = {
819
+ adDeliveryProfile?: PartnerAdDeliveryProfile;
820
+ deviceId: string;
821
+ lastHeartbeatAt?: string | null;
822
+ measurementMetadata?: PartnerHeartbeatMeasurementMetadata;
823
+ stalenessSeconds?: number | null;
824
+ telemetry?: PartnerSafeHeartbeatTelemetry;
825
+ [key: string]: unknown;
826
+ };
827
+ type PartnerHeartbeatQueryResponse = {
828
+ data?: PartnerHeartbeatQueryData;
829
+ success?: boolean;
830
+ };
831
+ /**
832
+ * Optional heartbeat payload. Nested telemetry objects are preferred; legacy flat keys
833
+ * are still accepted for backward compatibility.
834
+ *
835
+ */
836
+ type PartnerHeartbeatRequest = {
837
+ ad?: {
838
+ last_vast_request_at?: string;
839
+ last_vast_response_at?: string;
840
+ proof_of_play_enabled?: boolean;
841
+ };
842
+ agent_status?: string;
843
+ agent_version?: string;
844
+ android_api_level?: number;
845
+ brightness?: number;
846
+ desugaring_enabled?: boolean;
847
+ device?: {
848
+ android_api_level?: number;
849
+ make?: string;
850
+ model?: string;
851
+ os?: string;
852
+ osv?: string;
853
+ webview_chromium_major?: number;
854
+ };
855
+ ima_integration?: "android_native" | "html5_webview" | "disabled" | "unknown";
856
+ ima_sdk_version?: string;
857
+ ima_support_reason?: string;
858
+ ima_supported?: boolean;
859
+ input_source?: string;
860
+ last_ima_error_code?: number;
861
+ last_vast_error_code?: number;
862
+ last_vast_request_at?: string;
863
+ last_vast_response_at?: string;
864
+ /** Alternate namespace for telemetry keys (legacy support). */
865
+ metadata?: Record<string, unknown>;
866
+ muted?: boolean;
867
+ network?: {
868
+ bandwidthMbps?: number;
869
+ connectionType?: string;
870
+ downlinkMbps?: number;
871
+ effectiveType?: string;
872
+ latencyRtt?: number;
873
+ rtt?: number;
874
+ saveData?: boolean;
875
+ };
876
+ network_strength_dbm?: number;
877
+ power_state?: "on" | "standby" | "off" | "unknown";
878
+ proof_of_play_enabled?: boolean;
879
+ sdk?: {
880
+ android_api_level?: number;
881
+ desugaring_enabled?: boolean;
882
+ ima_integration?: "android_native" | "html5_webview" | "disabled" | "unknown";
883
+ ima_sdk_version?: string;
884
+ ima_supported?: boolean;
885
+ version?: string;
886
+ webview_chromium_major?: number;
887
+ };
888
+ sdk_version?: string;
889
+ telemetry?: PartnerHeartbeatTelemetry;
890
+ temperature_c?: number;
891
+ uptime_seconds?: number;
892
+ volume?: number;
893
+ webview_chromium_major?: number;
894
+ };
895
+ type PartnerHeartbeatResponse = {
896
+ data?: PartnerHeartbeatData;
897
+ success?: boolean;
898
+ };
899
+ type PartnerHeartbeatTelemetry = {
900
+ agentStatus?: string;
901
+ agentVersion?: string;
902
+ android_api_level?: number;
903
+ bandwidthMbps?: number;
904
+ brightness?: number;
905
+ connectionType?: string;
906
+ desugaring_enabled?: boolean;
907
+ downlinkMbps?: number;
908
+ ima_integration?: "android_native" | "html5_webview" | "disabled" | "unknown";
909
+ ima_sdk_version?: string;
910
+ ima_support_reason?: string;
911
+ ima_supported?: boolean;
912
+ inputSource?: string;
913
+ last_ima_error_code?: number;
914
+ last_vast_error_code?: number;
915
+ last_vast_request_at?: string;
916
+ last_vast_response_at?: string;
917
+ latencyRtt?: number;
918
+ make?: string;
919
+ model?: string;
920
+ muted?: boolean;
921
+ networkConnectionType?: string;
922
+ networkEffectiveType?: string;
923
+ networkStrengthDbm?: number;
924
+ os?: string;
925
+ osVersion?: string;
926
+ osv?: string;
927
+ powerState?: "on" | "standby" | "off" | "unknown";
928
+ proof_of_play_enabled?: boolean;
929
+ rtt?: number;
930
+ saveData?: boolean;
931
+ temperatureC?: number;
932
+ uptimeSeconds?: number;
933
+ volume?: number;
934
+ webview_chromium_major?: number;
935
+ [key: string]: unknown;
936
+ };
937
+ /**
938
+ * Partner-safe subset of device telemetry. Strips MDM compliance,
939
+ * Vertex embeddings, identity-correction internals, partner identifiers,
940
+ * and Mongo `_id` so partners only see what they need to decide
941
+ * whether a device is healthy enough to receive ads.
942
+ *
943
+ */
944
+ type PartnerSafeHeartbeatTelemetry = {
945
+ agentStatus?: string | null;
946
+ agentVersion?: string | null;
947
+ bandwidthMbps?: number | null;
948
+ brightness?: number | null;
949
+ connectionType?: string | null;
950
+ consecutiveAdFailures?: number | null;
951
+ effectiveType?: string | null;
952
+ latencyRtt?: number | null;
953
+ make?: string | null;
954
+ model?: string | null;
955
+ muted?: boolean | null;
956
+ networkStrengthDbm?: number | null;
957
+ onlineStatus?: "online" | "offline" | "standby" | "unknown" | null;
958
+ os?: string | null;
959
+ osv?: string | null;
960
+ powerState?: string | null;
961
+ temperatureC?: number | null;
962
+ ua?: string | null;
963
+ uptimeSeconds?: number | null;
964
+ visibilityState?: string | null;
965
+ volume?: number | null;
966
+ [key: string]: unknown;
967
+ };
968
+ type SsdpDeviceInfo = {
969
+ friendlyName?: string | null;
970
+ location: string;
971
+ manufacturer?: string | null;
972
+ modelName?: string | null;
973
+ server?: string | null;
974
+ st: string;
975
+ udn?: string | null;
976
+ [key: string]: unknown;
977
+ };
978
+ type WifiEnvironmentSnapshot = {
979
+ channelCongestionRatio?: number | null;
980
+ connectedChannelWidthMhz?: number | null;
981
+ connectedFrequencyMhz?: number | null;
982
+ connectedLinkSpeedMbps?: number | null;
983
+ connectedSignalDbm?: number | null;
984
+ frequencyBand?: string | null;
985
+ medianSignalDbm?: number | null;
986
+ networkCount?: number | null;
987
+ rssiVariance?: number | null;
988
+ scanTimestampMs?: number | null;
989
+ signalSpreadDbm?: number | null;
990
+ uniqueBssidCount?: number | null;
991
+ [key: string]: unknown;
992
+ } | null;
993
+ type WifiScanResult = {
994
+ channelWidthMhz?: number | null;
995
+ frequencyMhz: number;
996
+ rawBssid: string;
997
+ signalStrengthDbm: number;
998
+ [key: string]: unknown;
999
+ };
1000
+ /**
1001
+ * Read live device heartbeat state
1002
+ * GET /device/{deviceId}/heartbeat
1003
+ */
1004
+ interface getDeviceHeartbeatOperation {
1005
+ readonly path: "/device/{deviceId}/heartbeat";
1006
+ readonly method: "GET";
1007
+ request: never;
1008
+ response: PartnerHeartbeatQueryResponse;
1009
+ }
1010
+ /**
1011
+ * Device heartbeat
1012
+ * POST /device/{deviceId}/heartbeat
1013
+ */
1014
+ interface heartbeatOperation {
1015
+ readonly path: "/device/{deviceId}/heartbeat";
1016
+ readonly method: "POST";
1017
+ request: PartnerHeartbeatRequest | PartnerDeviceHeartbeatBody;
1018
+ response: PartnerHeartbeatResponse;
1019
+ }
1020
+ declare const generatedTypes: {
1021
+ readonly schemaCount: 67;
1022
+ readonly operationCount: 132;
1023
+ readonly schemas: readonly ["Ad", "AdSettings", "AudienceAnalyticsResponse", "AudienceExportResponse", "AudienceMetricsResponse", "AudienceSegment", "BatchResult", "BleScanResultData", "ChangelogEntry", "ChangelogResponse", "ContentPreferencesInput", "ContentPreferencesResponse", "ContentPreset", "DashboardResponse", "DemographicsResponse", "Device", "DeviceCapabilityPayload", "DeviceSummary", "DisplaySettingsInput", "DisplaySettingsResponse", "EarningsBreakdownResponse", "EarningsResponse", "Error", "HeaderBiddingSettings", "HttpProbeResult", "MdnsNetworkDevice", "Pagination", "Partner", "PartnerAdDeliveryProfile", "PartnerDefaultStream", "PartnerDefaultStreamCreate", "PartnerDefaultStreamUpdate", "PartnerDeviceHeartbeatBody", "PartnerHeartbeatCommand", "PartnerHeartbeatData", "PartnerHeartbeatMeasurementMetadata", "PartnerHeartbeatQueryData", "PartnerHeartbeatQueryResponse", "PartnerHeartbeatRequest", "PartnerHeartbeatResponse", "PartnerHeartbeatTelemetry", "PartnerLBarContent", "PartnerLBarDisplayPreferences", "PartnerLBarSettings", "PartnerSafeHeartbeatTelemetry", "PartnerSelfPromoAd", "PartnerSelfPromoCreate", "PartnerSelfPromoPlacement", "PartnerStats", "PayoutResponse", "PlaygroundResult", "PlaygroundValidationError", "ProgrammaticSettingsInput", "ProgrammaticSettingsResponse", "RequestMetadataResponse", "RolePermissions", "SDKConfig", "ScreenAnalyticsResponse", "SsdpDeviceInfo", "TeamInviteResponse", "TeamMember", "Transaction", "Webhook", "WebhookDelivery", "WebhookEvent", "WifiEnvironmentSnapshot", "WifiScanResult"];
1024
+ readonly operations: readonly ["listPartnerSelfPromoAds", "createPartnerSelfPromoAd", "listPartnerSelfPromoPlacements", "schedulePartnerSelfPromo", "createPartnerSelfPromoUpload", "disablePartnerSelfPromo", "registerAgent", "getAnalytics", "rotateApiKey", "getAudienceAnalytics", "exportAudienceData", "getAudienceHeatmap", "getLiveAudience", "getLookalikeScreens", "predictScreenAudience", "listAudienceSegments", "createAudienceSegment", "deleteAudienceSegment", "getAudienceSegment", "updateAudienceSegment", "matchAudienceSegment", "estimateSegmentReach", "generateSegmentVastTag", "getAudienceStats", "purchaseCredits", "createCreditCheckout", "setupBilling", "getUsageSummary", "getConnectDashboard", "getConnectEarningsChart", "getConnectScreenHealth", "listContentPresets", "getContentPreset", "getDashboard", "registerDevice", "deleteDevice", "getDevice", "updateDevice", "getAdsForDevice", "ackDeviceCommand", "getDeviceHeartbeat", "heartbeat", "recordProgrammaticEvent", "listDevices", "registerDevicesBatch", "batchUpdateDeviceOrientation", "getEarnings", "getEarningsBreakdown", "requestPayout", "getTransactions", "getActiveSSEConnections", "subscribeToEvents", "getFleetAnalytics", "pushFleetCommand", "getFleetOverview", "updateFleetSettings", "recordImpressionGet", "recordImpressionPost", "recordImpressionsBatch", "getPartnerInfo", "listIntentCategories", "getIntentCategory", "getIntentPricing", "getNetworkConfig", "patchNetworkConfig", "updateNetworkConfig", "recordAdComplete", "getPricing", "quickStart", "registerPartner", "generateSandboxEvent", "resetSandbox", "createSandboxScreen", "getSandboxStatus", "batchUpdateContentPreferences", "batchUpdateDisplaySettings", "batchUpdateProgrammaticSettings", "resolvePartnerScreen", "getScreenAnalytics", "applyContentPreset", "getAudienceMetrics", "getContentPreferences", "patchContentPreferences", "updateContentPreferences", "listPartnerDefaultStreams", "createPartnerDefaultStream", "createPartnerDefaultStreamImages", "reorderPartnerDefaultStreams", "createPartnerDefaultStreamUpload", "deletePartnerDefaultStream", "updatePartnerDefaultStream", "getScreenDemographics", "getDisplaySettings", "patchDisplaySettings", "updateDisplaySettings", "getPartnerLBarSettings", "updatePartnerLBarSettings", "updatePartnerLBarLiveUpdates", "getProgrammaticSettings", "patchProgrammaticSettings", "updateProgrammaticSettings", "createStripeConnectAccount", "getStripeLoginLink", "getStripeOnboardingLink", "requestStripePayout", "getStripePayoutHistory", "getStripeAccountStatus", "handleStripeWebhook", "listTeamMembers", "acceptInvitation", "inviteTeamMember", "getInvitationByToken", "resendInvitation", "removeTeamMember", "changeTeamMemberRole", "getTrackingPublicKey", "recordTrackingBatch", "upgradeToPartner", "getUsageSummary__get__usage", "getUsageDashboard", "getRateLimitStatus", "queryChangelog", "playgroundDryRun", "getRequestMetadata", "getVastConfig", "getVenueIntelligence", "listWebhooks", "createWebhook", "deleteWebhook", "updateWebhook", "getWebhookDeliveries", "testWebhook"];
1025
+ };
1026
+ type GeneratedSchemaName = (typeof generatedTypes.schemas)[number];
1027
+ type GeneratedOperationName = (typeof generatedTypes.operations)[number];
645
1028
 
646
- export { AnalyticsClient, type AnalyticsData, type ApiErrorType, AudienceClient, type AudienceData, BillingClient, type BillingInfo, type ClientOptions, DataClient, type Device, DevicesClient, EarningsClient, type EarningsData, type ErrorDetail, type ErrorEntry, type ErrorResponseBody, ErrorsClient, FleetClient, type FleetCommand, type Impression, ImpressionsClient, type ListResponse, type RequestOptions, type Screen, ScreensClient, TrillboardsClient, TrillboardsError, type TrillboardsErrorOptions, VERSION, type Webhook, type WebhookEvent, Webhooks, WebhooksClient, constructEvent, generatedTypes };
1029
+ export { AnalyticsClient, type AnalyticsData, type ApiErrorType, AudienceClient, type AudienceData, BillingClient, type BillingInfo, type BleScanResultData, type ClientOptions, DataClient, type Device, type DeviceCapabilityPayload, DevicesClient, EarningsClient, type EarningsData, type ErrorDetail, type ErrorEntry, type ErrorResponseBody, ErrorsClient, FleetClient, type FleetCommand, type GeneratedOperationName, type GeneratedSchemaName, type HttpProbeResult, type Impression, ImpressionsClient, type ListResponse, type MdnsNetworkDevice, type PartnerAdDeliveryProfile, type PartnerDeviceHeartbeatBody, type PartnerHeartbeatMeasurementMetadata, type PartnerHeartbeatQueryData, type PartnerHeartbeatQueryResponse, type PartnerHeartbeatRequest, type PartnerHeartbeatResponse, type PartnerSafeHeartbeatTelemetry, type RequestOptions, type Screen, ScreensClient, type SsdpDeviceInfo, TrillboardsClient, TrillboardsError, type TrillboardsErrorOptions, VERSION, type Webhook, type WebhookEvent, Webhooks, WebhooksClient, type WifiEnvironmentSnapshot, type WifiScanResult, constructEvent, generatedTypes, type getDeviceHeartbeatOperation, type heartbeatOperation };