/**
 * @fileoverview gRPC-Web generated client stub for 
 * @enhanceable
 * @public
 */

// Code generated by protoc-gen-grpc-web. DO NOT EDIT.
// versions:
// 	protoc-gen-grpc-web v1.4.2
// 	protoc              v4.24.4
// source: api_proto/kill_switch.proto


/* eslint-disable */
// @ts-nocheck



const grpc = {};
grpc.web = require('grpc-web');


var api_proto_common_pb = require('../api_proto/common_pb.js')

var api_proto_kill_switch_objects_pb = require('../api_proto/kill_switch_objects_pb.js')
const proto = require('./kill_switch_pb.js');

/**
 * @param {string} hostname
 * @param {?Object} credentials
 * @param {?grpc.web.ClientOptions} options
 * @constructor
 * @struct
 * @final
 */
proto.KillSwitchServiceClient =
    function(hostname, credentials, options) {
  if (!options) options = {};
  options.format = 'text';

  /**
   * @private @const {!grpc.web.GrpcWebClientBase} The client
   */
  this.client_ = new grpc.web.GrpcWebClientBase(options);

  /**
   * @private @const {string} The hostname
   */
  this.hostname_ = hostname.replace(/\/+$/, '');

};


/**
 * @param {string} hostname
 * @param {?Object} credentials
 * @param {?grpc.web.ClientOptions} options
 * @constructor
 * @struct
 * @final
 */
proto.KillSwitchServicePromiseClient =
    function(hostname, credentials, options) {
  if (!options) options = {};
  options.format = 'text';

  /**
   * @private @const {!grpc.web.GrpcWebClientBase} The client
   */
  this.client_ = new grpc.web.GrpcWebClientBase(options);

  /**
   * @private @const {string} The hostname
   */
  this.hostname_ = hostname.replace(/\/+$/, '');

};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.GetKillSwitchStatusRequest,
 *   !proto.GetKillSwitchStatusResponse>}
 */
const methodDescriptor_KillSwitchService_GetKillSwitchStatus = new grpc.web.MethodDescriptor(
  '/KillSwitchService/GetKillSwitchStatus',
  grpc.web.MethodType.UNARY,
  proto.GetKillSwitchStatusRequest,
  proto.GetKillSwitchStatusResponse,
  /**
   * @param {!proto.GetKillSwitchStatusRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.GetKillSwitchStatusResponse.deserializeBinary
);


/**
 * @param {!proto.GetKillSwitchStatusRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.GetKillSwitchStatusResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.GetKillSwitchStatusResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.getKillSwitchStatus =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/GetKillSwitchStatus',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_GetKillSwitchStatus,
      callback);
};


/**
 * @param {!proto.GetKillSwitchStatusRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.GetKillSwitchStatusResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.getKillSwitchStatus =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/GetKillSwitchStatus',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_GetKillSwitchStatus);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.GetKillSwitchOverviewRequest,
 *   !proto.GetKillSwitchOverviewResponse>}
 */
const methodDescriptor_KillSwitchService_GetKillSwitchOverview = new grpc.web.MethodDescriptor(
  '/KillSwitchService/GetKillSwitchOverview',
  grpc.web.MethodType.UNARY,
  proto.GetKillSwitchOverviewRequest,
  proto.GetKillSwitchOverviewResponse,
  /**
   * @param {!proto.GetKillSwitchOverviewRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.GetKillSwitchOverviewResponse.deserializeBinary
);


/**
 * @param {!proto.GetKillSwitchOverviewRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.GetKillSwitchOverviewResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.GetKillSwitchOverviewResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.getKillSwitchOverview =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/GetKillSwitchOverview',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_GetKillSwitchOverview,
      callback);
};


/**
 * @param {!proto.GetKillSwitchOverviewRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.GetKillSwitchOverviewResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.getKillSwitchOverview =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/GetKillSwitchOverview',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_GetKillSwitchOverview);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.ListFeaturesRequest,
 *   !proto.ListFeaturesResponse>}
 */
const methodDescriptor_KillSwitchService_ListFeatures = new grpc.web.MethodDescriptor(
  '/KillSwitchService/ListFeatures',
  grpc.web.MethodType.UNARY,
  proto.ListFeaturesRequest,
  proto.ListFeaturesResponse,
  /**
   * @param {!proto.ListFeaturesRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.ListFeaturesResponse.deserializeBinary
);


/**
 * @param {!proto.ListFeaturesRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.ListFeaturesResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.ListFeaturesResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.listFeatures =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/ListFeatures',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_ListFeatures,
      callback);
};


/**
 * @param {!proto.ListFeaturesRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.ListFeaturesResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.listFeatures =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/ListFeatures',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_ListFeatures);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.SyncFeaturesRequest,
 *   !proto.SyncFeaturesResponse>}
 */
const methodDescriptor_KillSwitchService_SyncFeatures = new grpc.web.MethodDescriptor(
  '/KillSwitchService/SyncFeatures',
  grpc.web.MethodType.UNARY,
  proto.SyncFeaturesRequest,
  proto.SyncFeaturesResponse,
  /**
   * @param {!proto.SyncFeaturesRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.SyncFeaturesResponse.deserializeBinary
);


/**
 * @param {!proto.SyncFeaturesRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.SyncFeaturesResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.SyncFeaturesResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.syncFeatures =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/SyncFeatures',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_SyncFeatures,
      callback);
};


/**
 * @param {!proto.SyncFeaturesRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.SyncFeaturesResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.syncFeatures =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/SyncFeatures',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_SyncFeatures);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.EnableKillSwitchRequest,
 *   !proto.EnableKillSwitchResponse>}
 */
const methodDescriptor_KillSwitchService_EnableKillSwitch = new grpc.web.MethodDescriptor(
  '/KillSwitchService/EnableKillSwitch',
  grpc.web.MethodType.UNARY,
  proto.EnableKillSwitchRequest,
  proto.EnableKillSwitchResponse,
  /**
   * @param {!proto.EnableKillSwitchRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.EnableKillSwitchResponse.deserializeBinary
);


/**
 * @param {!proto.EnableKillSwitchRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.EnableKillSwitchResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.EnableKillSwitchResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.enableKillSwitch =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/EnableKillSwitch',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_EnableKillSwitch,
      callback);
};


/**
 * @param {!proto.EnableKillSwitchRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.EnableKillSwitchResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.enableKillSwitch =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/EnableKillSwitch',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_EnableKillSwitch);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.DisableKillSwitchRequest,
 *   !proto.DisableKillSwitchResponse>}
 */
const methodDescriptor_KillSwitchService_DisableKillSwitch = new grpc.web.MethodDescriptor(
  '/KillSwitchService/DisableKillSwitch',
  grpc.web.MethodType.UNARY,
  proto.DisableKillSwitchRequest,
  proto.DisableKillSwitchResponse,
  /**
   * @param {!proto.DisableKillSwitchRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.DisableKillSwitchResponse.deserializeBinary
);


/**
 * @param {!proto.DisableKillSwitchRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.DisableKillSwitchResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.DisableKillSwitchResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.disableKillSwitch =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/DisableKillSwitch',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_DisableKillSwitch,
      callback);
};


/**
 * @param {!proto.DisableKillSwitchRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.DisableKillSwitchResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.disableKillSwitch =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/DisableKillSwitch',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_DisableKillSwitch);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.ListAuthorizedUsersRequest,
 *   !proto.ListAuthorizedUsersResponse>}
 */
const methodDescriptor_KillSwitchService_ListAuthorizedUsers = new grpc.web.MethodDescriptor(
  '/KillSwitchService/ListAuthorizedUsers',
  grpc.web.MethodType.UNARY,
  proto.ListAuthorizedUsersRequest,
  proto.ListAuthorizedUsersResponse,
  /**
   * @param {!proto.ListAuthorizedUsersRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.ListAuthorizedUsersResponse.deserializeBinary
);


/**
 * @param {!proto.ListAuthorizedUsersRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.ListAuthorizedUsersResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.ListAuthorizedUsersResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.listAuthorizedUsers =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/ListAuthorizedUsers',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_ListAuthorizedUsers,
      callback);
};


/**
 * @param {!proto.ListAuthorizedUsersRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.ListAuthorizedUsersResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.listAuthorizedUsers =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/ListAuthorizedUsers',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_ListAuthorizedUsers);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.AddAuthorizedUserRequest,
 *   !proto.AddAuthorizedUserResponse>}
 */
const methodDescriptor_KillSwitchService_AddAuthorizedUser = new grpc.web.MethodDescriptor(
  '/KillSwitchService/AddAuthorizedUser',
  grpc.web.MethodType.UNARY,
  proto.AddAuthorizedUserRequest,
  proto.AddAuthorizedUserResponse,
  /**
   * @param {!proto.AddAuthorizedUserRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.AddAuthorizedUserResponse.deserializeBinary
);


/**
 * @param {!proto.AddAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.AddAuthorizedUserResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.AddAuthorizedUserResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.addAuthorizedUser =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/AddAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_AddAuthorizedUser,
      callback);
};


/**
 * @param {!proto.AddAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.AddAuthorizedUserResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.addAuthorizedUser =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/AddAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_AddAuthorizedUser);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.UpdateAuthorizedUserRequest,
 *   !proto.UpdateAuthorizedUserResponse>}
 */
const methodDescriptor_KillSwitchService_UpdateAuthorizedUser = new grpc.web.MethodDescriptor(
  '/KillSwitchService/UpdateAuthorizedUser',
  grpc.web.MethodType.UNARY,
  proto.UpdateAuthorizedUserRequest,
  proto.UpdateAuthorizedUserResponse,
  /**
   * @param {!proto.UpdateAuthorizedUserRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.UpdateAuthorizedUserResponse.deserializeBinary
);


/**
 * @param {!proto.UpdateAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.UpdateAuthorizedUserResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.UpdateAuthorizedUserResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.updateAuthorizedUser =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/UpdateAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_UpdateAuthorizedUser,
      callback);
};


/**
 * @param {!proto.UpdateAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.UpdateAuthorizedUserResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.updateAuthorizedUser =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/UpdateAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_UpdateAuthorizedUser);
};


/**
 * @const
 * @type {!grpc.web.MethodDescriptor<
 *   !proto.DeleteAuthorizedUserRequest,
 *   !proto.DeleteAuthorizedUserResponse>}
 */
const methodDescriptor_KillSwitchService_DeleteAuthorizedUser = new grpc.web.MethodDescriptor(
  '/KillSwitchService/DeleteAuthorizedUser',
  grpc.web.MethodType.UNARY,
  proto.DeleteAuthorizedUserRequest,
  proto.DeleteAuthorizedUserResponse,
  /**
   * @param {!proto.DeleteAuthorizedUserRequest} request
   * @return {!Uint8Array}
   */
  function(request) {
    return request.serializeBinary();
  },
  proto.DeleteAuthorizedUserResponse.deserializeBinary
);


/**
 * @param {!proto.DeleteAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>} metadata User defined
 *     call metadata
 * @param {function(?grpc.web.RpcError, ?proto.DeleteAuthorizedUserResponse)}
 *     callback The callback function(error, response)
 * @return {!grpc.web.ClientReadableStream<!proto.DeleteAuthorizedUserResponse>|undefined}
 *     The XHR Node Readable Stream
 */
proto.KillSwitchServiceClient.prototype.deleteAuthorizedUser =
    function(request, metadata, callback) {
  return this.client_.rpcCall(this.hostname_ +
      '/KillSwitchService/DeleteAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_DeleteAuthorizedUser,
      callback);
};


/**
 * @param {!proto.DeleteAuthorizedUserRequest} request The
 *     request proto
 * @param {?Object<string, string>=} metadata User defined
 *     call metadata
 * @return {!Promise<!proto.DeleteAuthorizedUserResponse>}
 *     Promise that resolves to the response
 */
proto.KillSwitchServicePromiseClient.prototype.deleteAuthorizedUser =
    function(request, metadata) {
  return this.client_.unaryCall(this.hostname_ +
      '/KillSwitchService/DeleteAuthorizedUser',
      request,
      metadata || {},
      methodDescriptor_KillSwitchService_DeleteAuthorizedUser);
};


module.exports = proto;

