up
All checks were successful
Deploy to Production / deploy (push) Successful in 8s

This commit is contained in:
lubukhu
2026-01-24 13:35:11 +07:00
parent 6c3e93636e
commit 65fd0158a3
145 changed files with 10262 additions and 0 deletions

View File

@@ -0,0 +1,59 @@
/**
* SDK Iframe Core
* Chạy trong hidden iframe riêng biệt
*
* Responsibilities:
* - Receive data từ parent (preview mode)
* - Fetch data từ API (live mode)
* - Store answers securely
* - Verify answers locally (fast feedback)
* - Sync với server (background)
* - Report results
*/
interface SdkIframeConfig {
debug?: boolean;
allowedOrigins?: string[];
}
export declare class SdkIframeCore {
private config;
private boundMessageHandler;
private mode;
private gameCode;
private assignmentId;
private studentId;
private apiBaseUrl;
private authToken;
private originalItems;
private clientItems;
private sanitizedItems;
private userAnswers;
private completedQuestions;
private isInitialized;
private parentOrigin;
constructor(config?: SdkIframeConfig);
private setupMessageListener;
private handleMessage;
private isAllowedOrigin;
private handleInit;
private handlePushData;
private handleCheckAnswer;
/**
* Submit answer to server and wait for result (Live mode)
*/
private submitAnswerToServer;
private handleGetResult;
private handleRetrySync;
private processData;
private fetchLiveData;
private sendToParent;
private sendError;
private log;
destroy(): void;
}
declare global {
interface Window {
SdkIframe: SdkIframeCore;
}
}
export {};
//# sourceMappingURL=SdkIframeCore.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"SdkIframeCore.d.ts","sourceRoot":"","sources":["../../src/sdk-iframe/SdkIframeCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAoCH,UAAU,eAAe;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAMD,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,mBAAmB,CAAgD;IAC3E,OAAO,CAAC,IAAI,CAA2C;IACvD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAgC;IACpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,SAAS,CAAc;IAG/B,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,kBAAkB,CAA0B;IAEpD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAuB;gBAE/B,MAAM,GAAE,eAAoB;IAcxC,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;IA6CrB,OAAO,CAAC,eAAe;YAWT,UAAU;IA0CxB,OAAO,CAAC,cAAc;YAkBR,iBAAiB;IA8H/B;;OAEG;YACW,oBAAoB;IA2ClC,OAAO,CAAC,eAAe;YAuBT,eAAe;IA6C7B,OAAO,CAAC,WAAW;YAuCL,aAAa;IAyC3B,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,GAAG;IAsBX,OAAO,IAAI,IAAI;CASlB;AAMD,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,MAAM;QACZ,SAAS,EAAE,aAAa,CAAC;KAC5B;CACJ"}

View File

@@ -0,0 +1,7 @@
/**
* SDK Iframe exports
*/
import { SdkIframeCore } from './SdkIframeCore';
export * from './types';
export { SdkIframeCore };
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sdk-iframe/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,CAAC"}

View File

@@ -0,0 +1 @@
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Sena SDK Iframe</title><style>body{margin:0;padding:0;display:none}</style></head><body><script type="module">import"./SdkIframeCore.js";console.log("[SdkIframe] Loaded")</script><script defer="defer" src="sdk-e4180185b9b6b9a02ad3.js"></script></body></html>

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,110 @@
/**
* SDK Iframe Message Types
* Shared types cho SDK Iframe và Game Bridge
*/
export declare const SDK_MESSAGE_TYPES: {
readonly SDK_INIT: "SDK_INIT";
readonly SDK_PUSH_DATA: "SDK_PUSH_DATA";
readonly SDK_CHECK_ANSWER: "SDK_CHECK_ANSWER";
readonly SDK_GET_RESULT: "SDK_GET_RESULT";
readonly SDK_RETRY_SYNC: "SDK_RETRY_SYNC";
readonly SDK_READY: "SDK_READY";
readonly SDK_DATA_READY: "SDK_DATA_READY";
readonly SDK_ANSWER_RESULT: "SDK_ANSWER_RESULT";
readonly SDK_SYNC_STATUS: "SDK_SYNC_STATUS";
readonly SDK_SYNC_ERROR: "SDK_SYNC_ERROR";
readonly SDK_FINAL_RESULT: "SDK_FINAL_RESULT";
readonly SDK_ERROR: "SDK_ERROR";
};
export type SdkMessageType = typeof SDK_MESSAGE_TYPES[keyof typeof SDK_MESSAGE_TYPES];
/** SDK_INIT - Khởi tạo SDK */
export interface SdkInitPayload {
mode: 'preview' | 'live' | 'dev';
game_code: string;
assignment_id?: string | number;
student_id?: string;
api_base_url?: string;
auth_token?: string;
}
/** SDK_PUSH_DATA - Push data (preview mode) */
export interface SdkPushDataPayload {
data: any[];
completed_question_ids?: Array<{
id: string;
result: 0 | 1;
}>;
}
/** SDK_CHECK_ANSWER - Check đáp án */
export interface SdkCheckAnswerPayload {
question_id: string;
choice: any;
time_spent?: number;
}
/** SDK_READY - SDK sẵn sàng */
export interface SdkReadyPayload {
mode: 'preview' | 'live' | 'dev';
game_code: string;
}
/** SDK_DATA_READY - Data đã sẵn sàng (sanitized) */
export interface SdkDataReadyPayload {
items: any[];
total_questions: number;
completed_count: number;
resume_data?: Array<{
id: string;
result: 0 | 1;
}>;
}
/** SDK_ANSWER_RESULT - Kết quả verify local */
export interface SdkAnswerResultPayload {
question_id: string;
correct: boolean;
score: number;
synced: boolean;
}
/** SDK_SYNC_STATUS - Đã sync server OK */
export interface SdkSyncStatusPayload {
question_id: string;
synced: true;
server_result?: {
correct: boolean;
score: number;
};
}
/** SDK_SYNC_ERROR - Lỗi sync server */
export interface SdkSyncErrorPayload {
question_id: string;
error: string;
error_code?: number;
retryable: boolean;
}
/** SDK_FINAL_RESULT - Kết quả cuối cùng */
export interface SdkFinalResultPayload {
score: number;
total: number;
correct: number;
wrong: number;
synced: boolean;
details: Array<{
question_id: string;
choice: any;
correct: boolean;
synced: boolean;
time_spent?: number;
}>;
}
/** SDK_ERROR - Lỗi chung */
export interface SdkErrorPayload {
code: string;
message: string;
details?: any;
}
export interface SdkMessage<T = any> {
type: SdkMessageType;
payload: T;
timestamp: number;
request_id?: string;
}
export declare function createSdkMessage<T>(type: SdkMessageType, payload: T, requestId?: string): SdkMessage<T>;
export declare function isSdkMessage(data: any): data is SdkMessage;
//# sourceMappingURL=types.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sdk-iframe/types.ts"],"names":[],"mappings":"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"}