Skip to content

Commit 712eda7

Browse files
Add sdk progress tracking
1 parent 50c5ef7 commit 712eda7

File tree

9 files changed

+194
-136
lines changed

9 files changed

+194
-136
lines changed

sdk/adapters/supernodeservice/adapter.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -168,28 +168,28 @@ func (a *cascadeAdapter) CascadeSupernodeRegister(ctx context.Context, in *Casca
168168
func toSdkEvent(e cascade.SupernodeEventType) event.EventType {
169169
switch e {
170170
case cascade.SupernodeEventType_ACTION_RETRIEVED:
171-
return event.TaskProgressActionRetrievedBySupernode
171+
return event.SupernodeActionRetrieved
172172
case cascade.SupernodeEventType_ACTION_FEE_VERIFIED:
173-
return event.TaskProgressActionFeeValidated
173+
return event.SupernodeActionFeeVerified
174174
case cascade.SupernodeEventType_TOP_SUPERNODE_CHECK_PASSED:
175-
return event.TaskProgressTopSupernodeCheckValidated
175+
return event.SupernodeTopCheckPassed
176176
case cascade.SupernodeEventType_METADATA_DECODED:
177-
return event.TaskProgressCascadeMetadataDecoded
177+
return event.SupernodeMetadataDecoded
178178
case cascade.SupernodeEventType_DATA_HASH_VERIFIED:
179-
return event.TaskProgressDataHashVerified
179+
return event.SupernodeDataHashVerified
180180
case cascade.SupernodeEventType_INPUT_ENCODED:
181-
return event.TaskProgressInputDataEncoded
181+
return event.SupernodeInputEncoded
182182
case cascade.SupernodeEventType_SIGNATURE_VERIFIED:
183-
return event.TaskProgressSignatureVerified
183+
return event.SupernodeSignatureVerified
184184
case cascade.SupernodeEventType_RQID_GENERATED:
185-
return event.TaskProgressRQIDFilesGenerated
185+
return event.SupernodeRQIDGenerated
186186
case cascade.SupernodeEventType_RQID_VERIFIED:
187-
return event.TaskProgressRQIDsVerified
187+
return event.SupernodeRQIDVerified
188188
case cascade.SupernodeEventType_ARTEFACTS_STORED:
189-
return event.TaskProgressArtefactsStored
189+
return event.SupernodeArtefactsStored
190190
case cascade.SupernodeEventType_ACTION_FINALIZED:
191-
return event.TaskProgressActionFinalized
191+
return event.SupernodeActionFinalized
192192
default:
193-
return event.EventType("task.progress.unknown")
193+
return event.SupernodeUnknown
194194
}
195195
}

sdk/adapters/supernodeservice/types_test.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,17 @@ func TestTranslateSupernodeEvent(t *testing.T) {
1414
input cascade.SupernodeEventType
1515
expected event.EventType
1616
}{
17-
{"ACTION_RETRIEVED", cascade.SupernodeEventType_ACTION_RETRIEVED, event.TaskProgressActionRetrievedBySupernode},
18-
{"ACTION_FEE_VERIFIED", cascade.SupernodeEventType_ACTION_FEE_VERIFIED, event.TaskProgressActionFeeValidated},
19-
{"TOP_SUPERNODE_CHECK_PASSED", cascade.SupernodeEventType_TOP_SUPERNODE_CHECK_PASSED, event.TaskProgressTopSupernodeCheckValidated},
20-
{"METADATA_DECODED", cascade.SupernodeEventType_METADATA_DECODED, event.TaskProgressCascadeMetadataDecoded},
21-
{"DATA_HASH_VERIFIED", cascade.SupernodeEventType_DATA_HASH_VERIFIED, event.TaskProgressDataHashVerified},
22-
{"INPUT_ENCODED", cascade.SupernodeEventType_INPUT_ENCODED, event.TaskProgressInputDataEncoded},
23-
{"SIGNATURE_VERIFIED", cascade.SupernodeEventType_SIGNATURE_VERIFIED, event.TaskProgressSignatureVerified},
24-
{"RQID_GENERATED", cascade.SupernodeEventType_RQID_GENERATED, event.TaskProgressRQIDFilesGenerated},
25-
{"RQID_VERIFIED", cascade.SupernodeEventType_RQID_VERIFIED, event.TaskProgressRQIDsVerified},
26-
{"ARTEFACTS_STORED", cascade.SupernodeEventType_ARTEFACTS_STORED, event.TaskProgressArtefactsStored},
27-
{"ACTION_FINALIZED", cascade.SupernodeEventType_ACTION_FINALIZED, event.TaskProgressActionFinalized},
28-
{"UNKNOWN_TYPE", cascade.SupernodeEventType(999), event.EventType("task.progress.unknown")},
17+
{"ACTION_RETRIEVED", cascade.SupernodeEventType_ACTION_RETRIEVED, event.SupernodeActionRetrieved},
18+
{"ACTION_FEE_VERIFIED", cascade.SupernodeEventType_ACTION_FEE_VERIFIED, event.SupernodeActionFeeVerified},
19+
{"TOP_SUPERNODE_CHECK_PASSED", cascade.SupernodeEventType_TOP_SUPERNODE_CHECK_PASSED, event.SupernodeTopCheckPassed},
20+
{"METADATA_DECODED", cascade.SupernodeEventType_METADATA_DECODED, event.SupernodeMetadataDecoded},
21+
{"DATA_HASH_VERIFIED", cascade.SupernodeEventType_DATA_HASH_VERIFIED, event.SupernodeDataHashVerified},
22+
{"INPUT_ENCODED", cascade.SupernodeEventType_INPUT_ENCODED, event.SupernodeInputEncoded},
23+
{"SIGNATURE_VERIFIED", cascade.SupernodeEventType_SIGNATURE_VERIFIED, event.SupernodeSignatureVerified},
24+
{"RQID_GENERATED", cascade.SupernodeEventType_RQID_GENERATED, event.SupernodeRQIDGenerated},
25+
{"RQID_VERIFIED", cascade.SupernodeEventType_RQID_VERIFIED, event.SupernodeRQIDVerified},
26+
{"ARTEFACTS_STORED", cascade.SupernodeEventType_ARTEFACTS_STORED, event.SupernodeArtefactsStored},
27+
{"ACTION_FINALIZED", cascade.SupernodeEventType_ACTION_FINALIZED, event.SupernodeActionFinalized},
2928
}
3029

3130
for _, tt := range tests {

sdk/event/progress.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package event
2+
3+
// ProgressInfo provides comprehensive progress information
4+
type ProgressInfo struct {
5+
Percentage int // Percentage complete (0-100)
6+
Status TaskStatus // Current status (pending, active, completed, failed)
7+
CurrentEvent EventType // The current event type
8+
IsErrorState bool // Whether this is an error state
9+
10+
}
11+
12+
// TaskStatus represents the current status of a task
13+
type TaskStatus string
14+
15+
const (
16+
StatusPending TaskStatus = "PENDING"
17+
StatusActive TaskStatus = "ACTIVE"
18+
StatusCompleted TaskStatus = "COMPLETED"
19+
StatusFailed TaskStatus = "FAILED"
20+
)
21+
22+
// eventProgressMap maps event types to their progress percentages
23+
var eventProgressMap = map[EventType]int{
24+
//SDK
25+
SDKTaskStarted: 0,
26+
SDKSupernodesUnavailable: 5,
27+
SDKSupernodesFound: 10,
28+
SDKRegistrationAttemp: 12,
29+
SDKRegistrationFailure: 12,
30+
//Supernode
31+
SupernodeActionRetrieved: 15,
32+
SupernodeActionFeeVerified: 20,
33+
SupernodeTopCheckPassed: 25,
34+
SupernodeMetadataDecoded: 30,
35+
SupernodeDataHashVerified: 35,
36+
SupernodeInputEncoded: 40,
37+
SupernodeSignatureVerified: 45,
38+
SupernodeRQIDGenerated: 50,
39+
SupernodeRQIDVerified: 55,
40+
SupernodeArtefactsStored: 60,
41+
SupernodeActionFinalized: 80,
42+
// SDK
43+
SDKTaskTxHashReceived: 97,
44+
SDKRegistrationSuccessful: 99,
45+
SDKTaskCompleted: 100,
46+
SDKTaskFailed: 100,
47+
}
48+
49+
// GetProgressFromEvent calculates progress information from a single event
50+
func GetProgressFromEvent(e EventType) ProgressInfo {
51+
// Determine percentage
52+
percentage := 0
53+
if p, exists := eventProgressMap[e]; exists {
54+
percentage = p
55+
}
56+
57+
// Determine status
58+
var status TaskStatus
59+
isError := false
60+
61+
switch e {
62+
case SDKTaskStarted:
63+
status = StatusActive
64+
case SDKTaskCompleted:
65+
status = StatusCompleted
66+
case SDKTaskFailed:
67+
status = StatusFailed
68+
isError = true
69+
default:
70+
status = StatusActive
71+
}
72+
73+
return ProgressInfo{
74+
Percentage: percentage,
75+
Status: status,
76+
CurrentEvent: e,
77+
IsErrorState: isError,
78+
}
79+
}
80+
81+
// GetLatestProgress calculates progress info from the most recent event in a list
82+
func GetLatestProgress(events []Event) ProgressInfo {
83+
if len(events) == 0 {
84+
return ProgressInfo{
85+
Percentage: 0,
86+
Status: StatusPending,
87+
CurrentEvent: "",
88+
IsErrorState: false,
89+
}
90+
}
91+
92+
// Return progress based on the latest event
93+
return GetProgressFromEvent(events[len(events)-1].Type)
94+
}

sdk/event/types.go

Lines changed: 23 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -14,45 +14,31 @@ type EventType string
1414
// These events are used to track the progress of tasks
1515
// and to notify subscribers about important changes in the system.
1616
const (
17-
TaskStarted EventType = "task.started"
18-
TaskProgressActionVerified EventType = "task.progress.action_verified"
19-
TaskProgressActionVerificationFailed EventType = "task.progress.action_verification_failed"
20-
TaskProgressSupernodesFound EventType = "task.progress.supernode_found"
21-
TaskProgressSupernodesUnavailable EventType = "task.progress.supernodes_unavailable"
22-
TaskProgressActionRetrievedBySupernode EventType = "task.progress.action_retrieved_by_supernode"
23-
TaskProgressActionFeeValidated EventType = "task.progress.action_fee_validated"
24-
TaskProgressTopSupernodeCheckValidated EventType = "task.progress.top_sn_check_validated"
25-
TaskProgressArtefactsStored EventType = "task.progress.artefacts_stored"
26-
TaskProgressCascadeMetadataDecoded EventType = "task.progress.cascade_metadata_decoded"
27-
TaskProgressDataHashVerified EventType = "task.progress.data_hash_verified"
28-
TaskProgressInputDataEncoded EventType = "task.progress.input_data_encoded"
29-
TaskProgressSignatureVerified EventType = "task.progress.signature_verified"
30-
TaskProgressRQIDFilesGenerated EventType = "task.progress.rq_id_files_generated"
31-
TaskProgressRQIDsVerified EventType = "task.progress.rq_ids_verified"
32-
TaskProgressActionFinalized EventType = "task.progress.action_finalized"
33-
TaskProgressRegistrationInProgress EventType = "task.progress.registration_in_progress"
34-
TaskProgressRegistrationFailure EventType = "task.progress.registration_failure"
35-
TaskProgressRegistrationSuccessful EventType = "task.progress.registration_successful"
36-
TaskCompleted EventType = "task.completed"
37-
TxhasReceived EventType = "txhash.received"
38-
TaskFailed EventType = "task.failed"
17+
SDKTaskStarted EventType = "sdk:started"
18+
SDKSupernodesUnavailable EventType = "sdk:supernodes_unavailable"
19+
SDKSupernodesFound EventType = "sdk:supernodes_found"
20+
SDKRegistrationAttemp EventType = "sdk:registration_in_progress"
21+
SDKRegistrationFailure EventType = "sdk:registration_failure"
22+
SDKRegistrationSuccessful EventType = "sdk:registration_successful"
23+
SDKTaskTxHashReceived EventType = "sdk:txhash_received"
24+
SDKTaskCompleted EventType = "sdk:completed"
25+
SDKTaskFailed EventType = "sdk:failed"
3926
)
4027

41-
// Task progress steps in order
42-
// This is the order in which events are expected to occur
43-
// during the task lifecycle. It is used to track progress.
44-
// The order of events in this slice should match the order
45-
// in which they are expected to occur in the task lifecycle.
46-
// The index of each event in this slice represents its
47-
// position in the task lifecycle. The first event in the slice is the
48-
// first event that should be emitted when a task starts.
49-
var taskProgressSteps = []EventType{
50-
TaskStarted,
51-
TaskProgressActionVerified,
52-
TaskProgressSupernodesFound,
53-
TaskProgressRegistrationInProgress,
54-
TaskCompleted,
55-
}
28+
const (
29+
SupernodeActionRetrieved EventType = "supernode:action_retrieved"
30+
SupernodeActionFeeVerified EventType = "supernode:action_fee_verified"
31+
SupernodeTopCheckPassed EventType = "supernode:top_check_passed"
32+
SupernodeMetadataDecoded EventType = "supernode:metadata_decoded"
33+
SupernodeDataHashVerified EventType = "supernode:data_hash_verified"
34+
SupernodeInputEncoded EventType = "supernode:input_encoded"
35+
SupernodeSignatureVerified EventType = "supernode:signature_verified"
36+
SupernodeRQIDGenerated EventType = "supernode:rqid_generated"
37+
SupernodeRQIDVerified EventType = "supernode:rqid_verified"
38+
SupernodeArtefactsStored EventType = "supernode:artefacts_stored"
39+
SupernodeActionFinalized EventType = "supernode:action_finalized"
40+
SupernodeUnknown EventType = "supernode:unknown"
41+
)
5642

5743
// EventData is a map of event data attributes using standardized keys
5844
type EventData map[EventDataKey]any
@@ -87,14 +73,3 @@ func NewEvent(ctx context.Context, eventType EventType, taskID, taskType string,
8773
ActionID: actionID,
8874
}
8975
}
90-
91-
// GetTaskProgress returns current progress as (y, x), where y = current step number, x = total steps.
92-
func GetTaskProgress(current EventType) (int, int) {
93-
for idx, step := range taskProgressSteps {
94-
if step == current {
95-
return idx + 1, len(taskProgressSteps)
96-
}
97-
}
98-
// Unknown event, treat as 0 progress
99-
return 0, len(taskProgressSteps)
100-
}

sdk/task/cache.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import (
77
"time"
88

99
"github.com/LumeraProtocol/supernode/sdk/event"
10+
eventspkg "github.com/LumeraProtocol/supernode/sdk/event"
1011
"github.com/LumeraProtocol/supernode/sdk/log"
11-
1212
"github.com/dgraph-io/ristretto/v2"
1313
)
1414

@@ -17,7 +17,7 @@ type TaskEntry struct {
1717
TaskID string
1818
ActionID string
1919
TaskType TaskType
20-
Status TaskStatus
20+
Status eventspkg.TaskStatus
2121
TxHash string
2222
Error error
2323
Events []event.Event
@@ -78,7 +78,7 @@ func (tc *TaskCache) Set(ctx context.Context, taskID string, task Task, taskType
7878
TaskID: taskID,
7979
ActionID: actionID,
8080
TaskType: taskType,
81-
Status: StatusPending,
81+
Status: eventspkg.StatusPending,
8282
Events: make([]event.Event, 0),
8383
CreatedAt: now,
8484
LastUpdatedAt: now,
@@ -101,8 +101,13 @@ func (tc *TaskCache) Get(ctx context.Context, taskID string) (*TaskEntry, bool)
101101
return entry, found
102102
}
103103

104+
// GetProgress returns the current progress information for the task
105+
func (t *TaskEntry) GetProgress() eventspkg.ProgressInfo {
106+
return eventspkg.GetLatestProgress(t.Events)
107+
}
108+
104109
// UpdateStatus updates the status of a task in the cache atomically
105-
func (tc *TaskCache) UpdateStatus(ctx context.Context, taskID string, status TaskStatus, err error) bool {
110+
func (tc *TaskCache) UpdateStatus(ctx context.Context, taskID string, status eventspkg.TaskStatus, err error) bool {
106111
mu := tc.getOrCreateMutex(taskID)
107112
mu.Lock()
108113
defer mu.Unlock()

0 commit comments

Comments
 (0)