text: "use strict";
  // The MIT License (MIT)
  //
  // Copyright (c) 2017 Firebase
  //
  // Permission is hereby granted, free of charge, to any person obtaining a copy
  // of this software and associated documentation files (the "Software"), to deal
  // in the Software without restriction, including without limitation the rights
  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  // copies of the Software, and to permit persons to whom the Software is
  // furnished to do so, subject to the following conditions:
  //
  // The above copyright notice and this permission notice shall be included in all
  // copies or substantial portions of the Software.
  //
  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  // SOFTWARE.
  Object.defineProperty(exports, "__esModule", { value: true });
  const cloud_functions_1 = require("../cloud-functions");
  /** @internal */
  exports.provider = 'google.pubsub';
  /** @internal */
  exports.service = 'pubsub.googleapis.com';
  /** Select Cloud Pub/Sub topic to listen to.
   * @param topic Name of Pub/Sub topic, must belong to the same project as the function.
   */
  function topic(topic) {
      return _topicWithOptions(topic, {});
  }
  exports.topic = topic;
  /** @internal */
  function _topicWithOptions(topic, options) {
      if (topic.indexOf('/') !== -1) {
          throw new Error('Topic name may not have a /');
      }
      return new TopicBuilder(() => {
          if (!process.env.GCLOUD_PROJECT) {
              throw new Error('process.env.GCLOUD_PROJECT is not set.');
          }
          return `projects/${process.env.GCLOUD_PROJECT}/topics/${topic}`;
      }, options);
  }
  exports._topicWithOptions = _topicWithOptions;
  function schedule(schedule) {
      return _scheduleWithOptions(schedule, {});
  }
  exports.schedule = schedule;
  class ScheduleBuilder {
      /** @internal */
      constructor(schedule, options) {
          this.schedule = schedule;
          this.options = options;
          this._options = Object.assign({ schedule }, options);
      }
      retryConfig(config) {
          this._options.schedule.retryConfig = config;
          return this;
      }
      timeZone(timeZone) {
          this._options.schedule.timeZone = timeZone;
          return this;
      }
      onRun(handler) {
          const triggerResource = () => {
              if (!process.env.GCLOUD_PROJECT) {
                  throw new Error('process.env.GCLOUD_PROJECT is not set.');
              }
              return `projects/${process.env.GCLOUD_PROJECT}/topics`; // The CLI will append the correct topic name based on region and function name
          };
          const cloudFunction = cloud_functions_1.makeCloudFunction({
              contextOnlyHandler: handler,
              provider: exports.provider,
              service: exports.service,
              triggerResource,
              eventType: 'topic.publish',
              options: this._options,
              labels: { 'deployment-scheduled': 'true' },
          });
          return cloudFunction;
      }
  }
  exports.ScheduleBuilder = ScheduleBuilder;
  /** @internal */
  function _scheduleWithOptions(schedule, options) {
      return new ScheduleBuilder({ schedule }, options);
  }
  exports._scheduleWithOptions = _scheduleWithOptions;
  /** Builder used to create Cloud Functions for Google Pub/Sub topics. */
  class TopicBuilder {
      /** @internal */
      constructor(triggerResource, options) {
          this.triggerResource = triggerResource;
          this.options = options;
      }
      /** Handle a Pub/Sub message that was published to a Cloud Pub/Sub topic */
      onPublish(handler) {
          return cloud_functions_1.makeCloudFunction({
              handler,
              provider: exports.provider,
              service: exports.service,
              triggerResource: this.triggerResource,
              eventType: 'topic.publish',
              dataConstructor: (raw) => new Message(raw.data),
              options: this.options,
          });
      }
  }
  exports.TopicBuilder = TopicBuilder;
  /**
   * A Pub/Sub message.
   *
   * This class has an additional .json helper which will correctly deserialize any
   * message that was a JSON object when published with the JS SDK. .json will throw
   * if the message is not a base64 encoded JSON string.
   */
  class Message {
      constructor(data) {
          [this.data, this.attributes, this._json] = [
              data.data,
              data.attributes || {},
              data.json,
          ];
      }
      get json() {
          if (typeof this._json === 'undefined') {
              this._json = JSON.parse(new Buffer(this.data, 'base64').toString('utf8'));
          }
          return this._json;
      }
      toJSON() {
          return {
              data: this.data,
              attributes: this.attributes,
          };
      }
  }
  exports.Message = Message;
  