/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

include protocol PBackgroundIDBTransaction;
include protocol PBackgroundIDBVersionChangeTransaction;
include protocol PBackgroundMutableFile;
include protocol PBlob;

include PBackgroundIDBSharedTypes;

include "mozilla/dom/indexedDB/SerializationHelpers.h";

using struct mozilla::void_t
  from "ipc/IPCMessageUtils.h";

using class mozilla::dom::indexedDB::Key
  from "mozilla/dom/indexedDB/Key.h";

namespace mozilla {
namespace dom {
namespace indexedDB {

struct ObjectStoreAddResponse
{
  Key key;
};

struct ObjectStorePutResponse
{
  Key key;
};

struct ObjectStoreGetResponse
{
  SerializedStructuredCloneReadInfo cloneInfo;
};

struct ObjectStoreGetKeyResponse
{
  Key key;
};

struct ObjectStoreGetAllResponse
{
  SerializedStructuredCloneReadInfo[] cloneInfos;
};

struct ObjectStoreGetAllKeysResponse
{
  Key[] keys;
};

struct ObjectStoreDeleteResponse
{ };

struct ObjectStoreClearResponse
{ };

struct ObjectStoreCountResponse
{
  uint64_t count;
};

struct IndexGetResponse
{
  SerializedStructuredCloneReadInfo cloneInfo;
};

struct IndexGetKeyResponse
{
  Key key;
};

struct IndexGetAllResponse
{
  SerializedStructuredCloneReadInfo[] cloneInfos;
};

struct IndexGetAllKeysResponse
{
  Key[] keys;
};

struct IndexCountResponse
{
  uint64_t count;
};

union RequestResponse
{
  nsresult;
  ObjectStoreGetResponse;
  ObjectStoreGetKeyResponse;
  ObjectStoreAddResponse;
  ObjectStorePutResponse;
  ObjectStoreDeleteResponse;
  ObjectStoreClearResponse;
  ObjectStoreCountResponse;
  ObjectStoreGetAllResponse;
  ObjectStoreGetAllKeysResponse;
  IndexGetResponse;
  IndexGetKeyResponse;
  IndexGetAllResponse;
  IndexGetAllKeysResponse;
  IndexCountResponse;
};

struct WasmModulePreprocessInfo
{
  SerializedStructuredCloneFile[] files;
};

struct ObjectStoreGetPreprocessParams
{
  WasmModulePreprocessInfo preprocessInfo;
};

struct ObjectStoreGetAllPreprocessParams
{
  WasmModulePreprocessInfo[] preprocessInfos;
};

union PreprocessParams
{
  ObjectStoreGetPreprocessParams;
  ObjectStoreGetAllPreprocessParams;
};

struct ObjectStoreGetPreprocessResponse
{
};

struct ObjectStoreGetAllPreprocessResponse
{
};

// The nsresult is used if an error occurs for any preprocess request type.
// The specific response types are sent on success.
union PreprocessResponse
{
  nsresult;
  ObjectStoreGetPreprocessResponse;
  ObjectStoreGetAllPreprocessResponse;
};

protocol PBackgroundIDBRequest
{
  manager PBackgroundIDBTransaction or PBackgroundIDBVersionChangeTransaction;

parent:
  async Continue(PreprocessResponse response);

child:
  async __delete__(RequestResponse response);

  // Preprocess is used in cases where response processing needs to do something
  // asynchronous off of the child actor's thread before returning the actual
  // result to user code. This is necessary because RequestResponse processing
  // occurs in __delete__ and the PBackgroundIDBRequest implementations'
  // life-cycles are controlled by IPC and are not otherwise reference counted.
  // By introducing the (optional) Preprocess/Continue steps reference counting
  // or the introduction of additional runnables are avoided.
  async Preprocess(PreprocessParams params);
};

} // namespace indexedDB
} // namespace dom
} // namespace mozilla