go.temporal.io/server@v1.23.0/common/persistence/serialization/task_serializer.go (about)

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inc.
     6  //
     7  // Permission is hereby granted, free of charge, to any person obtaining a copy
     8  // of this software and associated documentation files (the "Software"), to deal
     9  // in the Software without restriction, including without limitation the rights
    10  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    11  // copies of the Software, and to permit persons to whom the Software is
    12  // furnished to do so, subject to the following conditions:
    13  //
    14  // The above copyright notice and this permission notice shall be included in
    15  // all copies or substantial portions of the Software.
    16  //
    17  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    18  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    19  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    20  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    21  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    22  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    23  // THE SOFTWARE.
    24  
    25  package serialization
    26  
    27  import (
    28  	"fmt"
    29  	"time"
    30  
    31  	commonpb "go.temporal.io/api/common/v1"
    32  	enumspb "go.temporal.io/api/enums/v1"
    33  	"go.temporal.io/api/serviceerror"
    34  	"google.golang.org/protobuf/types/known/timestamppb"
    35  
    36  	enumsspb "go.temporal.io/server/api/enums/v1"
    37  	persistencespb "go.temporal.io/server/api/persistence/v1"
    38  	"go.temporal.io/server/common/definition"
    39  	"go.temporal.io/server/service/history/tasks"
    40  )
    41  
    42  type (
    43  	TaskSerializer struct {
    44  	}
    45  )
    46  
    47  func NewTaskSerializer() *TaskSerializer {
    48  	return &TaskSerializer{}
    49  }
    50  
    51  func (s *TaskSerializer) SerializeTask(
    52  	task tasks.Task,
    53  ) (*commonpb.DataBlob, error) {
    54  	category := task.GetCategory()
    55  	switch category.ID() {
    56  	case tasks.CategoryIDTransfer:
    57  		return s.serializeTransferTask(task)
    58  	case tasks.CategoryIDTimer:
    59  		return s.serializeTimerTask(task)
    60  	case tasks.CategoryIDVisibility:
    61  		return s.serializeVisibilityTask(task)
    62  	case tasks.CategoryIDReplication:
    63  		return s.serializeReplicationTask(task)
    64  	case tasks.CategoryIDArchival:
    65  		return s.serializeArchivalTask(task)
    66  	default:
    67  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown task category: %v", category))
    68  	}
    69  }
    70  
    71  func (s *TaskSerializer) DeserializeTask(
    72  	category tasks.Category,
    73  	blob *commonpb.DataBlob,
    74  ) (tasks.Task, error) {
    75  	switch category.ID() {
    76  	case tasks.CategoryIDTransfer:
    77  		return s.deserializeTransferTasks(blob)
    78  	case tasks.CategoryIDTimer:
    79  		return s.deserializeTimerTasks(blob)
    80  	case tasks.CategoryIDVisibility:
    81  		return s.deserializeVisibilityTasks(blob)
    82  	case tasks.CategoryIDReplication:
    83  		return s.deserializeReplicationTasks(blob)
    84  	case tasks.CategoryIDArchival:
    85  		return s.deserializeArchivalTasks(blob)
    86  	default:
    87  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown task category: %v", category))
    88  	}
    89  }
    90  
    91  func (s *TaskSerializer) serializeTransferTask(
    92  	task tasks.Task,
    93  ) (*commonpb.DataBlob, error) {
    94  	var transferTask *persistencespb.TransferTaskInfo
    95  	switch task := task.(type) {
    96  	case *tasks.WorkflowTask:
    97  		transferTask = s.transferWorkflowTaskToProto(task)
    98  	case *tasks.ActivityTask:
    99  		transferTask = s.transferActivityTaskToProto(task)
   100  	case *tasks.CancelExecutionTask:
   101  		transferTask = s.transferRequestCancelTaskToProto(task)
   102  	case *tasks.SignalExecutionTask:
   103  		transferTask = s.transferSignalTaskToProto(task)
   104  	case *tasks.StartChildExecutionTask:
   105  		transferTask = s.transferChildWorkflowTaskToProto(task)
   106  	case *tasks.CloseExecutionTask:
   107  		transferTask = s.transferCloseTaskToProto(task)
   108  	case *tasks.ResetWorkflowTask:
   109  		transferTask = s.transferResetTaskToProto(task)
   110  	case *tasks.DeleteExecutionTask:
   111  		transferTask = s.transferDeleteExecutionTaskToProto(task)
   112  	default:
   113  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown transfer task type: %v", task))
   114  	}
   115  
   116  	return TransferTaskInfoToBlob(transferTask)
   117  }
   118  
   119  func (s *TaskSerializer) deserializeTransferTasks(
   120  	blob *commonpb.DataBlob,
   121  ) (tasks.Task, error) {
   122  	transferTask, err := TransferTaskInfoFromBlob(blob.Data, blob.EncodingType.String())
   123  	if err != nil {
   124  		return nil, err
   125  	}
   126  
   127  	var task tasks.Task
   128  	switch transferTask.TaskType {
   129  	case enumsspb.TASK_TYPE_TRANSFER_WORKFLOW_TASK:
   130  		task = s.transferWorkflowTaskFromProto(transferTask)
   131  	case enumsspb.TASK_TYPE_TRANSFER_ACTIVITY_TASK:
   132  		task = s.transferActivityTaskFromProto(transferTask)
   133  	case enumsspb.TASK_TYPE_TRANSFER_CANCEL_EXECUTION:
   134  		task = s.transferRequestCancelTaskFromProto(transferTask)
   135  	case enumsspb.TASK_TYPE_TRANSFER_SIGNAL_EXECUTION:
   136  		task = s.transferSignalTaskFromProto(transferTask)
   137  	case enumsspb.TASK_TYPE_TRANSFER_START_CHILD_EXECUTION:
   138  		task = s.transferChildWorkflowTaskFromProto(transferTask)
   139  	case enumsspb.TASK_TYPE_TRANSFER_CLOSE_EXECUTION:
   140  		task = s.transferCloseTaskFromProto(transferTask)
   141  	case enumsspb.TASK_TYPE_TRANSFER_RESET_WORKFLOW:
   142  		task = s.transferResetTaskFromProto(transferTask)
   143  	case enumsspb.TASK_TYPE_TRANSFER_DELETE_EXECUTION:
   144  		task = s.transferDeleteExecutionTaskFromProto(transferTask)
   145  	default:
   146  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown transfer task type: %v", transferTask.TaskType))
   147  	}
   148  	return task, nil
   149  }
   150  
   151  func (s *TaskSerializer) serializeTimerTask(
   152  	task tasks.Task,
   153  ) (*commonpb.DataBlob, error) {
   154  	var timerTask *persistencespb.TimerTaskInfo
   155  	switch task := task.(type) {
   156  	case *tasks.WorkflowTaskTimeoutTask:
   157  		timerTask = s.timerWorkflowTaskToProto(task)
   158  	case *tasks.WorkflowBackoffTimerTask:
   159  		timerTask = s.timerWorkflowDelayTaskToProto(task)
   160  	case *tasks.ActivityTimeoutTask:
   161  		timerTask = s.timerActivityTaskToProto(task)
   162  	case *tasks.ActivityRetryTimerTask:
   163  		timerTask = s.timerActivityRetryTaskToProto(task)
   164  	case *tasks.UserTimerTask:
   165  		timerTask = s.timerUserTaskToProto(task)
   166  	case *tasks.WorkflowTimeoutTask:
   167  		timerTask = s.timerWorkflowRunToProto(task)
   168  	case *tasks.DeleteHistoryEventTask:
   169  		timerTask = s.timerWorkflowCleanupTaskToProto(task)
   170  	default:
   171  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown timer task type: %v", task))
   172  	}
   173  
   174  	return TimerTaskInfoToBlob(timerTask)
   175  }
   176  
   177  func (s *TaskSerializer) deserializeTimerTasks(
   178  	blob *commonpb.DataBlob,
   179  ) (tasks.Task, error) {
   180  	timerTask, err := TimerTaskInfoFromBlob(blob.Data, blob.EncodingType.String())
   181  	if err != nil {
   182  		return nil, err
   183  	}
   184  
   185  	var timer tasks.Task
   186  	switch timerTask.TaskType {
   187  	case enumsspb.TASK_TYPE_WORKFLOW_TASK_TIMEOUT:
   188  		timer = s.timerWorkflowTaskFromProto(timerTask)
   189  	case enumsspb.TASK_TYPE_WORKFLOW_BACKOFF_TIMER:
   190  		timer = s.timerWorkflowDelayTaskFromProto(timerTask)
   191  	case enumsspb.TASK_TYPE_ACTIVITY_TIMEOUT:
   192  		timer = s.timerActivityTaskFromProto(timerTask)
   193  	case enumsspb.TASK_TYPE_ACTIVITY_RETRY_TIMER:
   194  		timer = s.timerActivityRetryTaskFromProto(timerTask)
   195  	case enumsspb.TASK_TYPE_USER_TIMER:
   196  		timer = s.timerUserTaskFromProto(timerTask)
   197  	case enumsspb.TASK_TYPE_WORKFLOW_RUN_TIMEOUT:
   198  		timer = s.timerWorkflowRunFromProto(timerTask)
   199  	case enumsspb.TASK_TYPE_DELETE_HISTORY_EVENT:
   200  		timer = s.timerWorkflowCleanupTaskFromProto(timerTask)
   201  	default:
   202  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown timer task type: %v", timerTask.TaskType))
   203  	}
   204  	return timer, nil
   205  }
   206  
   207  func (s *TaskSerializer) serializeVisibilityTask(
   208  	task tasks.Task,
   209  ) (*commonpb.DataBlob, error) {
   210  	var visibilityTask *persistencespb.VisibilityTaskInfo
   211  	switch task := task.(type) {
   212  	case *tasks.StartExecutionVisibilityTask:
   213  		visibilityTask = s.visibilityStartTaskToProto(task)
   214  	case *tasks.UpsertExecutionVisibilityTask:
   215  		visibilityTask = s.visibilityUpsertTaskToProto(task)
   216  	case *tasks.CloseExecutionVisibilityTask:
   217  		visibilityTask = s.visibilityCloseTaskToProto(task)
   218  	case *tasks.DeleteExecutionVisibilityTask:
   219  		visibilityTask = s.visibilityDeleteTaskToProto(task)
   220  	default:
   221  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown visibility task type: %v", task))
   222  	}
   223  
   224  	return VisibilityTaskInfoToBlob(visibilityTask)
   225  }
   226  
   227  func (s *TaskSerializer) deserializeVisibilityTasks(
   228  	blob *commonpb.DataBlob,
   229  ) (tasks.Task, error) {
   230  	visibilityTask, err := VisibilityTaskInfoFromBlob(blob.Data, blob.EncodingType.String())
   231  	if err != nil {
   232  		return nil, err
   233  	}
   234  
   235  	var visibility tasks.Task
   236  	switch visibilityTask.TaskType {
   237  	case enumsspb.TASK_TYPE_VISIBILITY_START_EXECUTION:
   238  		visibility = s.visibilityStartTaskFromProto(visibilityTask)
   239  	case enumsspb.TASK_TYPE_VISIBILITY_UPSERT_EXECUTION:
   240  		visibility = s.visibilityUpsertTaskFromProto(visibilityTask)
   241  	case enumsspb.TASK_TYPE_VISIBILITY_CLOSE_EXECUTION:
   242  		visibility = s.visibilityCloseTaskFromProto(visibilityTask)
   243  	case enumsspb.TASK_TYPE_VISIBILITY_DELETE_EXECUTION:
   244  		visibility = s.visibilityDeleteTaskFromProto(visibilityTask)
   245  	default:
   246  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown visibility task type: %v", visibilityTask.TaskType))
   247  	}
   248  	return visibility, nil
   249  }
   250  
   251  func (s *TaskSerializer) serializeReplicationTask(
   252  	task tasks.Task,
   253  ) (*commonpb.DataBlob, error) {
   254  	var replicationTask *persistencespb.ReplicationTaskInfo
   255  	switch task := task.(type) {
   256  	case *tasks.SyncActivityTask:
   257  		replicationTask = s.replicationActivityTaskToProto(task)
   258  	case *tasks.HistoryReplicationTask:
   259  		replicationTask = s.replicationHistoryTaskToProto(task)
   260  	case *tasks.SyncWorkflowStateTask:
   261  		replicationTask = s.replicationSyncWorkflowStateTaskToProto(task)
   262  	default:
   263  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown repication task type: %v", task))
   264  	}
   265  
   266  	return ReplicationTaskInfoToBlob(replicationTask)
   267  }
   268  
   269  func (s *TaskSerializer) deserializeReplicationTasks(
   270  	blob *commonpb.DataBlob,
   271  ) (tasks.Task, error) {
   272  	replicationTask, err := ReplicationTaskInfoFromBlob(blob.Data, blob.EncodingType.String())
   273  	if err != nil {
   274  		return nil, err
   275  	}
   276  	return s.ParseReplicationTask(replicationTask)
   277  }
   278  
   279  func (s *TaskSerializer) ParseReplicationTask(replicationTask *persistencespb.ReplicationTaskInfo) (tasks.Task, error) {
   280  	switch replicationTask.TaskType {
   281  	case enumsspb.TASK_TYPE_REPLICATION_SYNC_ACTIVITY:
   282  		return s.replicationActivityTaskFromProto(replicationTask), nil
   283  	case enumsspb.TASK_TYPE_REPLICATION_HISTORY:
   284  		return s.replicationHistoryTaskFromProto(replicationTask), nil
   285  	case enumsspb.TASK_TYPE_REPLICATION_SYNC_WORKFLOW_STATE:
   286  		return s.replicationSyncWorkflowStateTaskFromProto(replicationTask), nil
   287  	default:
   288  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown replication task type: %v", replicationTask.TaskType))
   289  	}
   290  }
   291  
   292  func (s *TaskSerializer) serializeArchivalTask(
   293  	task tasks.Task,
   294  ) (*commonpb.DataBlob, error) {
   295  	var archivalTaskInfo *persistencespb.ArchivalTaskInfo
   296  	switch task := task.(type) {
   297  	case *tasks.ArchiveExecutionTask:
   298  		archivalTaskInfo = s.archiveExecutionTaskToProto(task)
   299  	default:
   300  		return nil, serviceerror.NewInternal(fmt.Sprintf(
   301  			"Unknown archival task type while serializing: %v", task))
   302  	}
   303  
   304  	return ArchivalTaskInfoToBlob(archivalTaskInfo)
   305  }
   306  
   307  func (s *TaskSerializer) deserializeArchivalTasks(
   308  	blob *commonpb.DataBlob,
   309  ) (tasks.Task, error) {
   310  	archivalTask, err := ArchivalTaskInfoFromBlob(blob.Data, blob.EncodingType.String())
   311  	if err != nil {
   312  		return nil, err
   313  	}
   314  	var task tasks.Task
   315  	switch archivalTask.TaskType {
   316  	case enumsspb.TASK_TYPE_ARCHIVAL_ARCHIVE_EXECUTION:
   317  		task = s.archiveExecutionTaskFromProto(archivalTask)
   318  	default:
   319  		return nil, serviceerror.NewInternal(fmt.Sprintf("Unknown archival task type while deserializing: %v", task))
   320  	}
   321  	return task, nil
   322  }
   323  
   324  func (s *TaskSerializer) transferActivityTaskToProto(
   325  	activityTask *tasks.ActivityTask,
   326  ) *persistencespb.TransferTaskInfo {
   327  	return &persistencespb.TransferTaskInfo{
   328  		NamespaceId:             activityTask.WorkflowKey.NamespaceID,
   329  		WorkflowId:              activityTask.WorkflowKey.WorkflowID,
   330  		RunId:                   activityTask.WorkflowKey.RunID,
   331  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_ACTIVITY_TASK,
   332  		TargetNamespaceId:       activityTask.WorkflowKey.NamespaceID,
   333  		TargetWorkflowId:        "",
   334  		TargetRunId:             "",
   335  		TargetChildWorkflowOnly: false,
   336  		TaskQueue:               activityTask.TaskQueue,
   337  		ScheduledEventId:        activityTask.ScheduledEventID,
   338  		Version:                 activityTask.Version,
   339  		TaskId:                  activityTask.TaskID,
   340  		VisibilityTime:          timestamppb.New(activityTask.VisibilityTimestamp),
   341  	}
   342  }
   343  
   344  func (s *TaskSerializer) transferActivityTaskFromProto(
   345  	activityTask *persistencespb.TransferTaskInfo,
   346  ) *tasks.ActivityTask {
   347  	return &tasks.ActivityTask{
   348  		WorkflowKey: definition.NewWorkflowKey(
   349  			activityTask.NamespaceId,
   350  			activityTask.WorkflowId,
   351  			activityTask.RunId,
   352  		),
   353  		VisibilityTimestamp: activityTask.VisibilityTime.AsTime(),
   354  		TaskID:              activityTask.TaskId,
   355  		TaskQueue:           activityTask.TaskQueue,
   356  		ScheduledEventID:    activityTask.ScheduledEventId,
   357  		Version:             activityTask.Version,
   358  	}
   359  }
   360  
   361  func (s *TaskSerializer) transferWorkflowTaskToProto(
   362  	workflowTask *tasks.WorkflowTask,
   363  ) *persistencespb.TransferTaskInfo {
   364  	return &persistencespb.TransferTaskInfo{
   365  		NamespaceId:             workflowTask.WorkflowKey.NamespaceID,
   366  		WorkflowId:              workflowTask.WorkflowKey.WorkflowID,
   367  		RunId:                   workflowTask.WorkflowKey.RunID,
   368  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_WORKFLOW_TASK,
   369  		TargetNamespaceId:       workflowTask.NamespaceID,
   370  		TargetWorkflowId:        "",
   371  		TargetRunId:             "",
   372  		TargetChildWorkflowOnly: false,
   373  		TaskQueue:               workflowTask.TaskQueue,
   374  		ScheduledEventId:        workflowTask.ScheduledEventID,
   375  		Version:                 workflowTask.Version,
   376  		TaskId:                  workflowTask.TaskID,
   377  		VisibilityTime:          timestamppb.New(workflowTask.VisibilityTimestamp),
   378  	}
   379  }
   380  
   381  func (s *TaskSerializer) transferWorkflowTaskFromProto(
   382  	workflowTask *persistencespb.TransferTaskInfo,
   383  ) *tasks.WorkflowTask {
   384  	return &tasks.WorkflowTask{
   385  		WorkflowKey: definition.NewWorkflowKey(
   386  			workflowTask.NamespaceId,
   387  			workflowTask.WorkflowId,
   388  			workflowTask.RunId,
   389  		),
   390  		VisibilityTimestamp: workflowTask.VisibilityTime.AsTime(),
   391  		TaskID:              workflowTask.TaskId,
   392  		TaskQueue:           workflowTask.TaskQueue,
   393  		ScheduledEventID:    workflowTask.ScheduledEventId,
   394  		Version:             workflowTask.Version,
   395  	}
   396  }
   397  
   398  func (s *TaskSerializer) transferRequestCancelTaskToProto(
   399  	requestCancelTask *tasks.CancelExecutionTask,
   400  ) *persistencespb.TransferTaskInfo {
   401  	return &persistencespb.TransferTaskInfo{
   402  		NamespaceId:             requestCancelTask.WorkflowKey.NamespaceID,
   403  		WorkflowId:              requestCancelTask.WorkflowKey.WorkflowID,
   404  		RunId:                   requestCancelTask.WorkflowKey.RunID,
   405  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_CANCEL_EXECUTION,
   406  		TargetNamespaceId:       requestCancelTask.TargetNamespaceID,
   407  		TargetWorkflowId:        requestCancelTask.TargetWorkflowID,
   408  		TargetRunId:             requestCancelTask.TargetRunID,
   409  		TargetChildWorkflowOnly: requestCancelTask.TargetChildWorkflowOnly,
   410  		TaskQueue:               "",
   411  		ScheduledEventId:        requestCancelTask.InitiatedEventID,
   412  		Version:                 requestCancelTask.Version,
   413  		TaskId:                  requestCancelTask.TaskID,
   414  		VisibilityTime:          timestamppb.New(requestCancelTask.VisibilityTimestamp),
   415  	}
   416  }
   417  
   418  func (s *TaskSerializer) transferRequestCancelTaskFromProto(
   419  	requestCancelTask *persistencespb.TransferTaskInfo,
   420  ) *tasks.CancelExecutionTask {
   421  	return &tasks.CancelExecutionTask{
   422  		WorkflowKey: definition.NewWorkflowKey(
   423  			requestCancelTask.NamespaceId,
   424  			requestCancelTask.WorkflowId,
   425  			requestCancelTask.RunId,
   426  		),
   427  		VisibilityTimestamp:     requestCancelTask.VisibilityTime.AsTime(),
   428  		TaskID:                  requestCancelTask.TaskId,
   429  		TargetNamespaceID:       requestCancelTask.TargetNamespaceId,
   430  		TargetWorkflowID:        requestCancelTask.TargetWorkflowId,
   431  		TargetRunID:             requestCancelTask.TargetRunId,
   432  		TargetChildWorkflowOnly: requestCancelTask.TargetChildWorkflowOnly,
   433  		InitiatedEventID:        requestCancelTask.ScheduledEventId,
   434  		Version:                 requestCancelTask.Version,
   435  	}
   436  }
   437  
   438  func (s *TaskSerializer) transferSignalTaskToProto(
   439  	signalTask *tasks.SignalExecutionTask,
   440  ) *persistencespb.TransferTaskInfo {
   441  	return &persistencespb.TransferTaskInfo{
   442  		NamespaceId:             signalTask.WorkflowKey.NamespaceID,
   443  		WorkflowId:              signalTask.WorkflowKey.WorkflowID,
   444  		RunId:                   signalTask.WorkflowKey.RunID,
   445  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_SIGNAL_EXECUTION,
   446  		TargetNamespaceId:       signalTask.TargetNamespaceID,
   447  		TargetWorkflowId:        signalTask.TargetWorkflowID,
   448  		TargetRunId:             signalTask.TargetRunID,
   449  		TargetChildWorkflowOnly: signalTask.TargetChildWorkflowOnly,
   450  		TaskQueue:               "",
   451  		ScheduledEventId:        signalTask.InitiatedEventID,
   452  		Version:                 signalTask.Version,
   453  		TaskId:                  signalTask.TaskID,
   454  		VisibilityTime:          timestamppb.New(signalTask.VisibilityTimestamp),
   455  	}
   456  }
   457  
   458  func (s *TaskSerializer) transferSignalTaskFromProto(
   459  	signalTask *persistencespb.TransferTaskInfo,
   460  ) *tasks.SignalExecutionTask {
   461  	return &tasks.SignalExecutionTask{
   462  		WorkflowKey: definition.NewWorkflowKey(
   463  			signalTask.NamespaceId,
   464  			signalTask.WorkflowId,
   465  			signalTask.RunId,
   466  		),
   467  		VisibilityTimestamp:     signalTask.VisibilityTime.AsTime(),
   468  		TaskID:                  signalTask.TaskId,
   469  		TargetNamespaceID:       signalTask.TargetNamespaceId,
   470  		TargetWorkflowID:        signalTask.TargetWorkflowId,
   471  		TargetRunID:             signalTask.TargetRunId,
   472  		TargetChildWorkflowOnly: signalTask.TargetChildWorkflowOnly,
   473  		InitiatedEventID:        signalTask.ScheduledEventId,
   474  		Version:                 signalTask.Version,
   475  	}
   476  }
   477  
   478  func (s *TaskSerializer) transferChildWorkflowTaskToProto(
   479  	childWorkflowTask *tasks.StartChildExecutionTask,
   480  ) *persistencespb.TransferTaskInfo {
   481  	return &persistencespb.TransferTaskInfo{
   482  		NamespaceId:             childWorkflowTask.WorkflowKey.NamespaceID,
   483  		WorkflowId:              childWorkflowTask.WorkflowKey.WorkflowID,
   484  		RunId:                   childWorkflowTask.WorkflowKey.RunID,
   485  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_START_CHILD_EXECUTION,
   486  		TargetNamespaceId:       childWorkflowTask.TargetNamespaceID,
   487  		TargetWorkflowId:        childWorkflowTask.TargetWorkflowID,
   488  		TargetRunId:             "",
   489  		TargetChildWorkflowOnly: false,
   490  		TaskQueue:               "",
   491  		ScheduledEventId:        childWorkflowTask.InitiatedEventID,
   492  		Version:                 childWorkflowTask.Version,
   493  		TaskId:                  childWorkflowTask.TaskID,
   494  		VisibilityTime:          timestamppb.New(childWorkflowTask.VisibilityTimestamp),
   495  	}
   496  }
   497  
   498  func (s *TaskSerializer) transferChildWorkflowTaskFromProto(
   499  	signalTask *persistencespb.TransferTaskInfo,
   500  ) *tasks.StartChildExecutionTask {
   501  	return &tasks.StartChildExecutionTask{
   502  		WorkflowKey: definition.NewWorkflowKey(
   503  			signalTask.NamespaceId,
   504  			signalTask.WorkflowId,
   505  			signalTask.RunId,
   506  		),
   507  		VisibilityTimestamp: signalTask.VisibilityTime.AsTime(),
   508  		TaskID:              signalTask.TaskId,
   509  		TargetNamespaceID:   signalTask.TargetNamespaceId,
   510  		TargetWorkflowID:    signalTask.TargetWorkflowId,
   511  		InitiatedEventID:    signalTask.ScheduledEventId,
   512  		Version:             signalTask.Version,
   513  	}
   514  }
   515  
   516  func (s *TaskSerializer) transferCloseTaskToProto(
   517  	closeTask *tasks.CloseExecutionTask,
   518  ) *persistencespb.TransferTaskInfo {
   519  	return &persistencespb.TransferTaskInfo{
   520  		NamespaceId:             closeTask.WorkflowKey.NamespaceID,
   521  		WorkflowId:              closeTask.WorkflowKey.WorkflowID,
   522  		RunId:                   closeTask.WorkflowKey.RunID,
   523  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_CLOSE_EXECUTION,
   524  		TargetNamespaceId:       "",
   525  		TargetWorkflowId:        "",
   526  		TargetRunId:             "",
   527  		TargetChildWorkflowOnly: false,
   528  		TaskQueue:               "",
   529  		ScheduledEventId:        0,
   530  		Version:                 closeTask.Version,
   531  		TaskId:                  closeTask.TaskID,
   532  		VisibilityTime:          timestamppb.New(closeTask.VisibilityTimestamp),
   533  		DeleteAfterClose:        closeTask.DeleteAfterClose,
   534  		TaskDetails: &persistencespb.TransferTaskInfo_CloseExecutionTaskDetails_{
   535  			CloseExecutionTaskDetails: &persistencespb.TransferTaskInfo_CloseExecutionTaskDetails{
   536  				// We set this to true even though it's no longer checked in case someone downgrades to a version that
   537  				// still checks this field.
   538  				CanSkipVisibilityArchival: true,
   539  			},
   540  		},
   541  	}
   542  }
   543  
   544  func (s *TaskSerializer) transferCloseTaskFromProto(
   545  	closeTask *persistencespb.TransferTaskInfo,
   546  ) *tasks.CloseExecutionTask {
   547  	return &tasks.CloseExecutionTask{
   548  		WorkflowKey: definition.NewWorkflowKey(
   549  			closeTask.NamespaceId,
   550  			closeTask.WorkflowId,
   551  			closeTask.RunId,
   552  		),
   553  		VisibilityTimestamp: closeTask.VisibilityTime.AsTime(),
   554  		TaskID:              closeTask.TaskId,
   555  		Version:             closeTask.Version,
   556  		DeleteAfterClose:    closeTask.DeleteAfterClose,
   557  		// Delete workflow task process stage is not persisted. It is only for in memory retries.
   558  		DeleteProcessStage: tasks.DeleteWorkflowExecutionStageNone,
   559  	}
   560  }
   561  
   562  func (s *TaskSerializer) transferResetTaskToProto(
   563  	resetTask *tasks.ResetWorkflowTask,
   564  ) *persistencespb.TransferTaskInfo {
   565  	return &persistencespb.TransferTaskInfo{
   566  		NamespaceId:             resetTask.WorkflowKey.NamespaceID,
   567  		WorkflowId:              resetTask.WorkflowKey.WorkflowID,
   568  		RunId:                   resetTask.WorkflowKey.RunID,
   569  		TaskType:                enumsspb.TASK_TYPE_TRANSFER_RESET_WORKFLOW,
   570  		TargetNamespaceId:       "",
   571  		TargetWorkflowId:        "",
   572  		TargetRunId:             "",
   573  		TargetChildWorkflowOnly: false,
   574  		TaskQueue:               "",
   575  		ScheduledEventId:        0,
   576  		Version:                 resetTask.Version,
   577  		TaskId:                  resetTask.TaskID,
   578  		VisibilityTime:          timestamppb.New(resetTask.VisibilityTimestamp),
   579  	}
   580  }
   581  
   582  func (s *TaskSerializer) transferResetTaskFromProto(
   583  	resetTask *persistencespb.TransferTaskInfo,
   584  ) *tasks.ResetWorkflowTask {
   585  	return &tasks.ResetWorkflowTask{
   586  		WorkflowKey: definition.NewWorkflowKey(
   587  			resetTask.NamespaceId,
   588  			resetTask.WorkflowId,
   589  			resetTask.RunId,
   590  		),
   591  		VisibilityTimestamp: resetTask.VisibilityTime.AsTime(),
   592  		TaskID:              resetTask.TaskId,
   593  		Version:             resetTask.Version,
   594  	}
   595  }
   596  
   597  func (s *TaskSerializer) transferDeleteExecutionTaskToProto(
   598  	deleteExecutionTask *tasks.DeleteExecutionTask,
   599  ) *persistencespb.TransferTaskInfo {
   600  	return &persistencespb.TransferTaskInfo{
   601  		NamespaceId:    deleteExecutionTask.WorkflowKey.NamespaceID,
   602  		WorkflowId:     deleteExecutionTask.WorkflowKey.WorkflowID,
   603  		RunId:          deleteExecutionTask.WorkflowKey.RunID,
   604  		TaskType:       enumsspb.TASK_TYPE_TRANSFER_DELETE_EXECUTION,
   605  		Version:        deleteExecutionTask.Version,
   606  		TaskId:         deleteExecutionTask.TaskID,
   607  		VisibilityTime: timestamppb.New(deleteExecutionTask.VisibilityTimestamp),
   608  	}
   609  }
   610  
   611  func (s *TaskSerializer) transferDeleteExecutionTaskFromProto(
   612  	deleteExecutionTask *persistencespb.TransferTaskInfo,
   613  ) *tasks.DeleteExecutionTask {
   614  	return &tasks.DeleteExecutionTask{
   615  		WorkflowKey: definition.NewWorkflowKey(
   616  			deleteExecutionTask.NamespaceId,
   617  			deleteExecutionTask.WorkflowId,
   618  			deleteExecutionTask.RunId,
   619  		),
   620  		VisibilityTimestamp: deleteExecutionTask.VisibilityTime.AsTime(),
   621  		TaskID:              deleteExecutionTask.TaskId,
   622  		Version:             deleteExecutionTask.Version,
   623  		// Delete workflow task process stage is not persisted. It is only for in memory retries.
   624  		ProcessStage: tasks.DeleteWorkflowExecutionStageNone,
   625  	}
   626  }
   627  
   628  func (s *TaskSerializer) timerWorkflowTaskToProto(
   629  	workflowTimer *tasks.WorkflowTaskTimeoutTask,
   630  ) *persistencespb.TimerTaskInfo {
   631  	return &persistencespb.TimerTaskInfo{
   632  		NamespaceId:         workflowTimer.WorkflowKey.NamespaceID,
   633  		WorkflowId:          workflowTimer.WorkflowKey.WorkflowID,
   634  		RunId:               workflowTimer.WorkflowKey.RunID,
   635  		TaskType:            enumsspb.TASK_TYPE_WORKFLOW_TASK_TIMEOUT,
   636  		TimeoutType:         workflowTimer.TimeoutType,
   637  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   638  		Version:             workflowTimer.Version,
   639  		ScheduleAttempt:     workflowTimer.ScheduleAttempt,
   640  		EventId:             workflowTimer.EventID,
   641  		TaskId:              workflowTimer.TaskID,
   642  		VisibilityTime:      timestamppb.New(workflowTimer.VisibilityTimestamp),
   643  	}
   644  }
   645  
   646  func (s *TaskSerializer) timerWorkflowTaskFromProto(
   647  	workflowTimer *persistencespb.TimerTaskInfo,
   648  ) *tasks.WorkflowTaskTimeoutTask {
   649  	return &tasks.WorkflowTaskTimeoutTask{
   650  		WorkflowKey: definition.NewWorkflowKey(
   651  			workflowTimer.NamespaceId,
   652  			workflowTimer.WorkflowId,
   653  			workflowTimer.RunId,
   654  		),
   655  		VisibilityTimestamp: workflowTimer.VisibilityTime.AsTime(),
   656  		TaskID:              workflowTimer.TaskId,
   657  		EventID:             workflowTimer.EventId,
   658  		ScheduleAttempt:     workflowTimer.ScheduleAttempt,
   659  		TimeoutType:         workflowTimer.TimeoutType,
   660  		Version:             workflowTimer.Version,
   661  	}
   662  }
   663  
   664  func (s *TaskSerializer) timerWorkflowDelayTaskToProto(
   665  	workflowDelayTimer *tasks.WorkflowBackoffTimerTask,
   666  ) *persistencespb.TimerTaskInfo {
   667  	return &persistencespb.TimerTaskInfo{
   668  		NamespaceId:         workflowDelayTimer.WorkflowKey.NamespaceID,
   669  		WorkflowId:          workflowDelayTimer.WorkflowKey.WorkflowID,
   670  		RunId:               workflowDelayTimer.WorkflowKey.RunID,
   671  		TaskType:            enumsspb.TASK_TYPE_WORKFLOW_BACKOFF_TIMER,
   672  		TimeoutType:         enumspb.TIMEOUT_TYPE_UNSPECIFIED,
   673  		WorkflowBackoffType: workflowDelayTimer.WorkflowBackoffType,
   674  		Version:             workflowDelayTimer.Version,
   675  		ScheduleAttempt:     0,
   676  		EventId:             0,
   677  		TaskId:              workflowDelayTimer.TaskID,
   678  		VisibilityTime:      timestamppb.New(workflowDelayTimer.VisibilityTimestamp),
   679  	}
   680  }
   681  
   682  func (s *TaskSerializer) timerWorkflowDelayTaskFromProto(
   683  	workflowDelayTimer *persistencespb.TimerTaskInfo,
   684  ) *tasks.WorkflowBackoffTimerTask {
   685  	return &tasks.WorkflowBackoffTimerTask{
   686  		WorkflowKey: definition.NewWorkflowKey(
   687  			workflowDelayTimer.NamespaceId,
   688  			workflowDelayTimer.WorkflowId,
   689  			workflowDelayTimer.RunId,
   690  		),
   691  		VisibilityTimestamp: workflowDelayTimer.VisibilityTime.AsTime(),
   692  		TaskID:              workflowDelayTimer.TaskId,
   693  		Version:             workflowDelayTimer.Version,
   694  		WorkflowBackoffType: workflowDelayTimer.WorkflowBackoffType,
   695  	}
   696  }
   697  
   698  func (s *TaskSerializer) timerActivityTaskToProto(
   699  	activityTimer *tasks.ActivityTimeoutTask,
   700  ) *persistencespb.TimerTaskInfo {
   701  	return &persistencespb.TimerTaskInfo{
   702  		NamespaceId:         activityTimer.WorkflowKey.NamespaceID,
   703  		WorkflowId:          activityTimer.WorkflowKey.WorkflowID,
   704  		RunId:               activityTimer.WorkflowKey.RunID,
   705  		TaskType:            enumsspb.TASK_TYPE_ACTIVITY_TIMEOUT,
   706  		TimeoutType:         activityTimer.TimeoutType,
   707  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   708  		Version:             activityTimer.Version,
   709  		ScheduleAttempt:     activityTimer.Attempt,
   710  		EventId:             activityTimer.EventID,
   711  		TaskId:              activityTimer.TaskID,
   712  		VisibilityTime:      timestamppb.New(activityTimer.VisibilityTimestamp),
   713  	}
   714  }
   715  
   716  func (s *TaskSerializer) timerActivityTaskFromProto(
   717  	activityTimer *persistencespb.TimerTaskInfo,
   718  ) *tasks.ActivityTimeoutTask {
   719  	return &tasks.ActivityTimeoutTask{
   720  		WorkflowKey: definition.NewWorkflowKey(
   721  			activityTimer.NamespaceId,
   722  			activityTimer.WorkflowId,
   723  			activityTimer.RunId,
   724  		),
   725  		VisibilityTimestamp: activityTimer.VisibilityTime.AsTime(),
   726  		TaskID:              activityTimer.TaskId,
   727  		EventID:             activityTimer.EventId,
   728  		Attempt:             activityTimer.ScheduleAttempt,
   729  		TimeoutType:         activityTimer.TimeoutType,
   730  		Version:             activityTimer.Version,
   731  	}
   732  }
   733  
   734  func (s *TaskSerializer) timerActivityRetryTaskToProto(
   735  	activityRetryTimer *tasks.ActivityRetryTimerTask,
   736  ) *persistencespb.TimerTaskInfo {
   737  	return &persistencespb.TimerTaskInfo{
   738  		NamespaceId:         activityRetryTimer.WorkflowKey.NamespaceID,
   739  		WorkflowId:          activityRetryTimer.WorkflowKey.WorkflowID,
   740  		RunId:               activityRetryTimer.WorkflowKey.RunID,
   741  		TaskType:            enumsspb.TASK_TYPE_ACTIVITY_RETRY_TIMER,
   742  		TimeoutType:         enumspb.TIMEOUT_TYPE_UNSPECIFIED,
   743  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   744  		Version:             activityRetryTimer.Version,
   745  		ScheduleAttempt:     activityRetryTimer.Attempt,
   746  		EventId:             activityRetryTimer.EventID,
   747  		TaskId:              activityRetryTimer.TaskID,
   748  		VisibilityTime:      timestamppb.New(activityRetryTimer.VisibilityTimestamp),
   749  	}
   750  }
   751  
   752  func (s *TaskSerializer) timerActivityRetryTaskFromProto(
   753  	activityRetryTimer *persistencespb.TimerTaskInfo,
   754  ) *tasks.ActivityRetryTimerTask {
   755  	return &tasks.ActivityRetryTimerTask{
   756  		WorkflowKey: definition.NewWorkflowKey(
   757  			activityRetryTimer.NamespaceId,
   758  			activityRetryTimer.WorkflowId,
   759  			activityRetryTimer.RunId,
   760  		),
   761  		VisibilityTimestamp: activityRetryTimer.VisibilityTime.AsTime(),
   762  		TaskID:              activityRetryTimer.TaskId,
   763  		EventID:             activityRetryTimer.EventId,
   764  		Version:             activityRetryTimer.Version,
   765  		Attempt:             activityRetryTimer.ScheduleAttempt,
   766  	}
   767  }
   768  
   769  func (s *TaskSerializer) timerUserTaskToProto(
   770  	userTimer *tasks.UserTimerTask,
   771  ) *persistencespb.TimerTaskInfo {
   772  	return &persistencespb.TimerTaskInfo{
   773  		NamespaceId:         userTimer.WorkflowKey.NamespaceID,
   774  		WorkflowId:          userTimer.WorkflowKey.WorkflowID,
   775  		RunId:               userTimer.WorkflowKey.RunID,
   776  		TaskType:            enumsspb.TASK_TYPE_USER_TIMER,
   777  		TimeoutType:         enumspb.TIMEOUT_TYPE_UNSPECIFIED,
   778  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   779  		Version:             userTimer.Version,
   780  		ScheduleAttempt:     0,
   781  		EventId:             userTimer.EventID,
   782  		TaskId:              userTimer.TaskID,
   783  		VisibilityTime:      timestamppb.New(userTimer.VisibilityTimestamp),
   784  	}
   785  }
   786  
   787  func (s *TaskSerializer) timerUserTaskFromProto(
   788  	userTimer *persistencespb.TimerTaskInfo,
   789  ) *tasks.UserTimerTask {
   790  	return &tasks.UserTimerTask{
   791  		WorkflowKey: definition.NewWorkflowKey(
   792  			userTimer.NamespaceId,
   793  			userTimer.WorkflowId,
   794  			userTimer.RunId,
   795  		),
   796  		VisibilityTimestamp: userTimer.VisibilityTime.AsTime(),
   797  		TaskID:              userTimer.TaskId,
   798  		EventID:             userTimer.EventId,
   799  		Version:             userTimer.Version,
   800  	}
   801  }
   802  
   803  func (s *TaskSerializer) timerWorkflowRunToProto(
   804  	workflowTimer *tasks.WorkflowTimeoutTask,
   805  ) *persistencespb.TimerTaskInfo {
   806  	return &persistencespb.TimerTaskInfo{
   807  		NamespaceId:         workflowTimer.WorkflowKey.NamespaceID,
   808  		WorkflowId:          workflowTimer.WorkflowKey.WorkflowID,
   809  		RunId:               workflowTimer.WorkflowKey.RunID,
   810  		TaskType:            enumsspb.TASK_TYPE_WORKFLOW_RUN_TIMEOUT,
   811  		TimeoutType:         enumspb.TIMEOUT_TYPE_UNSPECIFIED,
   812  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   813  		Version:             workflowTimer.Version,
   814  		ScheduleAttempt:     0,
   815  		EventId:             0,
   816  		TaskId:              workflowTimer.TaskID,
   817  		VisibilityTime:      timestamppb.New(workflowTimer.VisibilityTimestamp),
   818  	}
   819  }
   820  
   821  func (s *TaskSerializer) timerWorkflowRunFromProto(
   822  	workflowTimer *persistencespb.TimerTaskInfo,
   823  ) *tasks.WorkflowTimeoutTask {
   824  	return &tasks.WorkflowTimeoutTask{
   825  		WorkflowKey: definition.NewWorkflowKey(
   826  			workflowTimer.NamespaceId,
   827  			workflowTimer.WorkflowId,
   828  			workflowTimer.RunId,
   829  		),
   830  		VisibilityTimestamp: workflowTimer.VisibilityTime.AsTime(),
   831  		TaskID:              workflowTimer.TaskId,
   832  		Version:             workflowTimer.Version,
   833  	}
   834  }
   835  
   836  func (s *TaskSerializer) timerWorkflowCleanupTaskToProto(
   837  	workflowCleanupTimer *tasks.DeleteHistoryEventTask,
   838  ) *persistencespb.TimerTaskInfo {
   839  	return &persistencespb.TimerTaskInfo{
   840  		NamespaceId:         workflowCleanupTimer.WorkflowKey.NamespaceID,
   841  		WorkflowId:          workflowCleanupTimer.WorkflowKey.WorkflowID,
   842  		RunId:               workflowCleanupTimer.WorkflowKey.RunID,
   843  		TaskType:            enumsspb.TASK_TYPE_DELETE_HISTORY_EVENT,
   844  		TimeoutType:         enumspb.TIMEOUT_TYPE_UNSPECIFIED,
   845  		WorkflowBackoffType: enumsspb.WORKFLOW_BACKOFF_TYPE_UNSPECIFIED,
   846  		Version:             workflowCleanupTimer.Version,
   847  		ScheduleAttempt:     0,
   848  		EventId:             0,
   849  		TaskId:              workflowCleanupTimer.TaskID,
   850  		VisibilityTime:      timestamppb.New(workflowCleanupTimer.VisibilityTimestamp),
   851  		BranchToken:         workflowCleanupTimer.BranchToken,
   852  		// We set this to true even though it's no longer checked in case someone downgrades to a version that still
   853  		// checks this field.
   854  		AlreadyArchived: true,
   855  	}
   856  }
   857  
   858  func (s *TaskSerializer) timerWorkflowCleanupTaskFromProto(
   859  	workflowCleanupTimer *persistencespb.TimerTaskInfo,
   860  ) *tasks.DeleteHistoryEventTask {
   861  	return &tasks.DeleteHistoryEventTask{
   862  		WorkflowKey: definition.NewWorkflowKey(
   863  			workflowCleanupTimer.NamespaceId,
   864  			workflowCleanupTimer.WorkflowId,
   865  			workflowCleanupTimer.RunId,
   866  		),
   867  		VisibilityTimestamp: workflowCleanupTimer.VisibilityTime.AsTime(),
   868  		TaskID:              workflowCleanupTimer.TaskId,
   869  		Version:             workflowCleanupTimer.Version,
   870  		BranchToken:         workflowCleanupTimer.BranchToken,
   871  		// Delete workflow task process stage is not persisted. It is only for in memory retries.
   872  		ProcessStage: tasks.DeleteWorkflowExecutionStageNone,
   873  	}
   874  }
   875  
   876  func (s *TaskSerializer) visibilityStartTaskToProto(
   877  	startVisibilityTask *tasks.StartExecutionVisibilityTask,
   878  ) *persistencespb.VisibilityTaskInfo {
   879  	return &persistencespb.VisibilityTaskInfo{
   880  		NamespaceId:    startVisibilityTask.WorkflowKey.NamespaceID,
   881  		WorkflowId:     startVisibilityTask.WorkflowKey.WorkflowID,
   882  		RunId:          startVisibilityTask.WorkflowKey.RunID,
   883  		TaskType:       enumsspb.TASK_TYPE_VISIBILITY_START_EXECUTION,
   884  		Version:        startVisibilityTask.Version,
   885  		TaskId:         startVisibilityTask.TaskID,
   886  		VisibilityTime: timestamppb.New(startVisibilityTask.VisibilityTimestamp),
   887  	}
   888  }
   889  
   890  func (s *TaskSerializer) visibilityStartTaskFromProto(
   891  	startVisibilityTask *persistencespb.VisibilityTaskInfo,
   892  ) *tasks.StartExecutionVisibilityTask {
   893  	return &tasks.StartExecutionVisibilityTask{
   894  		WorkflowKey: definition.NewWorkflowKey(
   895  			startVisibilityTask.NamespaceId,
   896  			startVisibilityTask.WorkflowId,
   897  			startVisibilityTask.RunId,
   898  		),
   899  		VisibilityTimestamp: startVisibilityTask.VisibilityTime.AsTime(),
   900  		TaskID:              startVisibilityTask.TaskId,
   901  		Version:             startVisibilityTask.Version,
   902  	}
   903  }
   904  
   905  func (s *TaskSerializer) visibilityUpsertTaskToProto(
   906  	upsertVisibilityTask *tasks.UpsertExecutionVisibilityTask,
   907  ) *persistencespb.VisibilityTaskInfo {
   908  	return &persistencespb.VisibilityTaskInfo{
   909  		NamespaceId:    upsertVisibilityTask.WorkflowKey.NamespaceID,
   910  		WorkflowId:     upsertVisibilityTask.WorkflowKey.WorkflowID,
   911  		RunId:          upsertVisibilityTask.WorkflowKey.RunID,
   912  		TaskType:       enumsspb.TASK_TYPE_VISIBILITY_UPSERT_EXECUTION,
   913  		Version:        upsertVisibilityTask.Version,
   914  		TaskId:         upsertVisibilityTask.TaskID,
   915  		VisibilityTime: timestamppb.New(upsertVisibilityTask.VisibilityTimestamp),
   916  	}
   917  }
   918  
   919  func (s *TaskSerializer) visibilityUpsertTaskFromProto(
   920  	upsertVisibilityTask *persistencespb.VisibilityTaskInfo,
   921  ) *tasks.UpsertExecutionVisibilityTask {
   922  	return &tasks.UpsertExecutionVisibilityTask{
   923  		WorkflowKey: definition.NewWorkflowKey(
   924  			upsertVisibilityTask.NamespaceId,
   925  			upsertVisibilityTask.WorkflowId,
   926  			upsertVisibilityTask.RunId,
   927  		),
   928  		VisibilityTimestamp: upsertVisibilityTask.VisibilityTime.AsTime(),
   929  		TaskID:              upsertVisibilityTask.TaskId,
   930  		Version:             upsertVisibilityTask.Version,
   931  	}
   932  }
   933  
   934  func (s *TaskSerializer) visibilityCloseTaskToProto(
   935  	closetVisibilityTask *tasks.CloseExecutionVisibilityTask,
   936  ) *persistencespb.VisibilityTaskInfo {
   937  	return &persistencespb.VisibilityTaskInfo{
   938  		NamespaceId:    closetVisibilityTask.WorkflowKey.NamespaceID,
   939  		WorkflowId:     closetVisibilityTask.WorkflowKey.WorkflowID,
   940  		RunId:          closetVisibilityTask.WorkflowKey.RunID,
   941  		TaskType:       enumsspb.TASK_TYPE_VISIBILITY_CLOSE_EXECUTION,
   942  		Version:        closetVisibilityTask.Version,
   943  		TaskId:         closetVisibilityTask.TaskID,
   944  		VisibilityTime: timestamppb.New(closetVisibilityTask.VisibilityTimestamp),
   945  	}
   946  }
   947  
   948  func (s *TaskSerializer) visibilityCloseTaskFromProto(
   949  	closeVisibilityTask *persistencespb.VisibilityTaskInfo,
   950  ) *tasks.CloseExecutionVisibilityTask {
   951  	return &tasks.CloseExecutionVisibilityTask{
   952  		WorkflowKey: definition.NewWorkflowKey(
   953  			closeVisibilityTask.NamespaceId,
   954  			closeVisibilityTask.WorkflowId,
   955  			closeVisibilityTask.RunId,
   956  		),
   957  		VisibilityTimestamp: closeVisibilityTask.VisibilityTime.AsTime(),
   958  		TaskID:              closeVisibilityTask.TaskId,
   959  		Version:             closeVisibilityTask.Version,
   960  	}
   961  }
   962  
   963  func (s *TaskSerializer) visibilityDeleteTaskToProto(
   964  	deleteVisibilityTask *tasks.DeleteExecutionVisibilityTask,
   965  ) *persistencespb.VisibilityTaskInfo {
   966  	return &persistencespb.VisibilityTaskInfo{
   967  		NamespaceId:           deleteVisibilityTask.WorkflowKey.NamespaceID,
   968  		WorkflowId:            deleteVisibilityTask.WorkflowKey.WorkflowID,
   969  		RunId:                 deleteVisibilityTask.WorkflowKey.RunID,
   970  		TaskType:              enumsspb.TASK_TYPE_VISIBILITY_DELETE_EXECUTION,
   971  		Version:               deleteVisibilityTask.Version,
   972  		TaskId:                deleteVisibilityTask.TaskID,
   973  		VisibilityTime:        timestamppb.New(deleteVisibilityTask.VisibilityTimestamp),
   974  		StartTime:             timestamppb.New(deleteVisibilityTask.StartTime),
   975  		CloseTime:             timestamppb.New(deleteVisibilityTask.CloseTime),
   976  		CloseVisibilityTaskId: deleteVisibilityTask.CloseExecutionVisibilityTaskID,
   977  	}
   978  }
   979  
   980  func (s *TaskSerializer) visibilityDeleteTaskFromProto(
   981  	deleteVisibilityTask *persistencespb.VisibilityTaskInfo,
   982  ) *tasks.DeleteExecutionVisibilityTask {
   983  	return &tasks.DeleteExecutionVisibilityTask{
   984  		WorkflowKey: definition.NewWorkflowKey(
   985  			deleteVisibilityTask.NamespaceId,
   986  			deleteVisibilityTask.WorkflowId,
   987  			deleteVisibilityTask.RunId,
   988  		),
   989  		VisibilityTimestamp:            deleteVisibilityTask.VisibilityTime.AsTime(),
   990  		TaskID:                         deleteVisibilityTask.TaskId,
   991  		Version:                        deleteVisibilityTask.Version,
   992  		StartTime:                      deleteVisibilityTask.StartTime.AsTime(),
   993  		CloseTime:                      deleteVisibilityTask.CloseTime.AsTime(),
   994  		CloseExecutionVisibilityTaskID: deleteVisibilityTask.CloseVisibilityTaskId,
   995  	}
   996  }
   997  
   998  func (s *TaskSerializer) replicationActivityTaskToProto(
   999  	activityTask *tasks.SyncActivityTask,
  1000  ) *persistencespb.ReplicationTaskInfo {
  1001  	return &persistencespb.ReplicationTaskInfo{
  1002  		NamespaceId:       activityTask.WorkflowKey.NamespaceID,
  1003  		WorkflowId:        activityTask.WorkflowKey.WorkflowID,
  1004  		RunId:             activityTask.WorkflowKey.RunID,
  1005  		TaskType:          enumsspb.TASK_TYPE_REPLICATION_SYNC_ACTIVITY,
  1006  		TaskId:            activityTask.TaskID,
  1007  		Version:           activityTask.Version,
  1008  		ScheduledEventId:  activityTask.ScheduledEventID,
  1009  		FirstEventId:      0,
  1010  		NextEventId:       0,
  1011  		BranchToken:       nil,
  1012  		NewRunBranchToken: nil,
  1013  		VisibilityTime:    timestamppb.New(activityTask.VisibilityTimestamp),
  1014  	}
  1015  }
  1016  
  1017  func (s *TaskSerializer) replicationActivityTaskFromProto(
  1018  	activityTask *persistencespb.ReplicationTaskInfo,
  1019  ) *tasks.SyncActivityTask {
  1020  	visibilityTimestamp := time.Unix(0, 0)
  1021  	if activityTask.VisibilityTime != nil {
  1022  		visibilityTimestamp = activityTask.VisibilityTime.AsTime()
  1023  	}
  1024  	return &tasks.SyncActivityTask{
  1025  		WorkflowKey: definition.NewWorkflowKey(
  1026  			activityTask.NamespaceId,
  1027  			activityTask.WorkflowId,
  1028  			activityTask.RunId,
  1029  		),
  1030  		VisibilityTimestamp: visibilityTimestamp,
  1031  		Version:             activityTask.Version,
  1032  		TaskID:              activityTask.TaskId,
  1033  		ScheduledEventID:    activityTask.ScheduledEventId,
  1034  	}
  1035  }
  1036  
  1037  func (s *TaskSerializer) replicationHistoryTaskToProto(
  1038  	historyTask *tasks.HistoryReplicationTask,
  1039  ) *persistencespb.ReplicationTaskInfo {
  1040  	return &persistencespb.ReplicationTaskInfo{
  1041  		NamespaceId:       historyTask.WorkflowKey.NamespaceID,
  1042  		WorkflowId:        historyTask.WorkflowKey.WorkflowID,
  1043  		RunId:             historyTask.WorkflowKey.RunID,
  1044  		TaskType:          enumsspb.TASK_TYPE_REPLICATION_HISTORY,
  1045  		TaskId:            historyTask.TaskID,
  1046  		Version:           historyTask.Version,
  1047  		ScheduledEventId:  0,
  1048  		FirstEventId:      historyTask.FirstEventID,
  1049  		NextEventId:       historyTask.NextEventID,
  1050  		BranchToken:       historyTask.BranchToken,
  1051  		NewRunBranchToken: historyTask.NewRunBranchToken,
  1052  		NewRunId:          historyTask.NewRunID,
  1053  		VisibilityTime:    timestamppb.New(historyTask.VisibilityTimestamp),
  1054  	}
  1055  }
  1056  
  1057  func (s *TaskSerializer) replicationHistoryTaskFromProto(
  1058  	historyTask *persistencespb.ReplicationTaskInfo,
  1059  ) *tasks.HistoryReplicationTask {
  1060  	visibilityTimestamp := time.Unix(0, 0)
  1061  	if historyTask.VisibilityTime != nil {
  1062  		visibilityTimestamp = historyTask.VisibilityTime.AsTime()
  1063  	}
  1064  	return &tasks.HistoryReplicationTask{
  1065  		WorkflowKey: definition.NewWorkflowKey(
  1066  			historyTask.NamespaceId,
  1067  			historyTask.WorkflowId,
  1068  			historyTask.RunId,
  1069  		),
  1070  		VisibilityTimestamp: visibilityTimestamp,
  1071  		TaskID:              historyTask.TaskId,
  1072  		FirstEventID:        historyTask.FirstEventId,
  1073  		NextEventID:         historyTask.NextEventId,
  1074  		Version:             historyTask.Version,
  1075  		BranchToken:         historyTask.BranchToken,
  1076  		NewRunBranchToken:   historyTask.NewRunBranchToken,
  1077  		NewRunID:            historyTask.NewRunId,
  1078  	}
  1079  }
  1080  
  1081  func (s *TaskSerializer) archiveExecutionTaskToProto(
  1082  	archiveExecutionTask *tasks.ArchiveExecutionTask,
  1083  ) *persistencespb.ArchivalTaskInfo {
  1084  	return &persistencespb.ArchivalTaskInfo{
  1085  		NamespaceId:    archiveExecutionTask.WorkflowKey.NamespaceID,
  1086  		WorkflowId:     archiveExecutionTask.WorkflowKey.WorkflowID,
  1087  		RunId:          archiveExecutionTask.WorkflowKey.RunID,
  1088  		TaskType:       enumsspb.TASK_TYPE_ARCHIVAL_ARCHIVE_EXECUTION,
  1089  		TaskId:         archiveExecutionTask.TaskID,
  1090  		Version:        archiveExecutionTask.Version,
  1091  		VisibilityTime: timestamppb.New(archiveExecutionTask.VisibilityTimestamp),
  1092  	}
  1093  }
  1094  
  1095  func (s *TaskSerializer) archiveExecutionTaskFromProto(
  1096  	archivalTaskInfo *persistencespb.ArchivalTaskInfo,
  1097  ) *tasks.ArchiveExecutionTask {
  1098  	visibilityTimestamp := time.Unix(0, 0)
  1099  	if archivalTaskInfo.VisibilityTime != nil {
  1100  		visibilityTimestamp = archivalTaskInfo.VisibilityTime.AsTime()
  1101  	}
  1102  	return &tasks.ArchiveExecutionTask{
  1103  		WorkflowKey: definition.NewWorkflowKey(
  1104  			archivalTaskInfo.NamespaceId,
  1105  			archivalTaskInfo.WorkflowId,
  1106  			archivalTaskInfo.RunId,
  1107  		),
  1108  		VisibilityTimestamp: visibilityTimestamp,
  1109  		TaskID:              archivalTaskInfo.TaskId,
  1110  		Version:             archivalTaskInfo.Version,
  1111  	}
  1112  }
  1113  
  1114  func (s *TaskSerializer) replicationSyncWorkflowStateTaskToProto(
  1115  	syncWorkflowStateTask *tasks.SyncWorkflowStateTask,
  1116  ) *persistencespb.ReplicationTaskInfo {
  1117  	return &persistencespb.ReplicationTaskInfo{
  1118  		NamespaceId:    syncWorkflowStateTask.WorkflowKey.NamespaceID,
  1119  		WorkflowId:     syncWorkflowStateTask.WorkflowKey.WorkflowID,
  1120  		RunId:          syncWorkflowStateTask.WorkflowKey.RunID,
  1121  		TaskType:       enumsspb.TASK_TYPE_REPLICATION_SYNC_WORKFLOW_STATE,
  1122  		TaskId:         syncWorkflowStateTask.TaskID,
  1123  		Version:        syncWorkflowStateTask.Version,
  1124  		VisibilityTime: timestamppb.New(syncWorkflowStateTask.VisibilityTimestamp),
  1125  	}
  1126  }
  1127  
  1128  func (s *TaskSerializer) replicationSyncWorkflowStateTaskFromProto(
  1129  	syncWorkflowStateTask *persistencespb.ReplicationTaskInfo,
  1130  ) *tasks.SyncWorkflowStateTask {
  1131  	visibilityTimestamp := time.Unix(0, 0)
  1132  	if syncWorkflowStateTask.VisibilityTime != nil {
  1133  		visibilityTimestamp = syncWorkflowStateTask.VisibilityTime.AsTime()
  1134  	}
  1135  	return &tasks.SyncWorkflowStateTask{
  1136  		WorkflowKey: definition.NewWorkflowKey(
  1137  			syncWorkflowStateTask.NamespaceId,
  1138  			syncWorkflowStateTask.WorkflowId,
  1139  			syncWorkflowStateTask.RunId,
  1140  		),
  1141  		VisibilityTimestamp: visibilityTimestamp,
  1142  		Version:             syncWorkflowStateTask.Version,
  1143  		TaskID:              syncWorkflowStateTask.TaskId,
  1144  	}
  1145  }