@cartanova/qgrid-cli 2.6.1 → 2.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +2 -0
- package/README.md +2 -0
- package/bundle/dist/application/qgrid/oauth.js +21 -3
- package/bundle/dist/application/qgrid/qgrid.frame.js +31 -18
- package/bundle/dist/application/qgrid/token-death.js +52 -0
- package/bundle/dist/application/queries.generated.js +2 -2
- package/bundle/dist/application/request-log/request-log.model.js +69 -27
- package/bundle/dist/application/sonamu.generated.js +20 -3
- package/bundle/dist/application/sonamu.generated.sso.js +18 -2
- package/bundle/dist/application/token/token.model.js +42 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +49 -0
- package/bundle/dist/migrations/20260807145144_alter_request_logs_alter1.js +13 -0
- package/bundle/dist/utils/providers/openai/openai-refresh.js +12 -1
- package/bundle/dist/utils/slack-notify.js +65 -0
- package/bundle/src/application/qgrid/oauth.ts +20 -1
- package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +18 -3
- package/bundle/src/application/qgrid/qgrid.frame.ts +58 -47
- package/bundle/src/application/qgrid/token-death.test.ts +120 -0
- package/bundle/src/application/qgrid/token-death.ts +67 -0
- package/bundle/src/application/queries.generated.ts +2 -2
- package/bundle/src/application/request-log/request-log.entity.json +20 -6
- package/bundle/src/application/request-log/request-log.model.test.ts +153 -42
- package/bundle/src/application/request-log/request-log.model.ts +86 -40
- package/bundle/src/application/sonamu.generated.http +13 -1
- package/bundle/src/application/sonamu.generated.sso.ts +16 -0
- package/bundle/src/application/sonamu.generated.ts +16 -1
- package/bundle/src/application/token/token.model.test.ts +39 -0
- package/bundle/src/application/token/token.model.ts +77 -0
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +110 -0
- package/bundle/src/migrations/20260807145144_alter_request_logs_alter1.ts +13 -0
- package/bundle/src/utils/providers/openai/openai-refresh.ts +17 -0
- package/bundle/src/utils/slack-notify.test.ts +97 -0
- package/bundle/src/utils/slack-notify.ts +74 -0
- package/bundle/web-dist/client/assets/index-2cAgaLOm.css +1 -0
- package/bundle/web-dist/client/assets/{index-BGGBFmzE.js → index-BgWzzjvj.js} +3 -3
- package/bundle/web-dist/client/assets/logs-Lyv8OfHE.js +1 -0
- package/bundle/web-dist/client/assets/{monit-CyqMmy1G.js → monit-BSa5lSZp.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-Cy0gCq8c.js → routes-Cp0re-Nn.js} +2 -2
- package/bundle/web-dist/client/assets/{services.generated-BuT6Gp8V.js → services.generated-B-dMUtEu.js} +1 -1
- package/bundle/web-dist/client/assets/{show-C5WxfoAt.js → show-C1jEPhuS.js} +1 -1
- package/bundle/web-dist/client/assets/tokens-1e66MAC0.js +1 -0
- package/bundle/web-dist/client/assets/{use-update-token-mutation-DBkxL29Y.js → use-update-token-mutation-DueEppqt.js} +1 -1
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/assets/{logs-D0z1Ghj1.js → logs-CwoOsveV.js} +11 -4
- package/bundle/web-dist/server/assets/{monit-dBXxnAyI.js → monit-DIsEsDJN.js} +1 -1
- package/bundle/web-dist/server/assets/{routes-B3p7fuwk.js → routes-Bts-KJ9W.js} +7 -3
- package/bundle/web-dist/server/assets/{services.generated-BNuxWs7K.js → services.generated-Bh7Vs8Ds.js} +7 -7
- package/bundle/web-dist/server/assets/{show-0iNioJ2I.js → show-DJfaCNUw.js} +1 -1
- package/bundle/web-dist/server/assets/{tokens-CvytQ9Xy.js → tokens-BA4vwDat.js} +206 -108
- package/bundle/web-dist/server/assets/{use-update-token-mutation-BBCC2GKM.js → use-update-token-mutation-BQRzEPy2.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +6 -6
- package/package.json +1 -1
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +11 -0
- package/bundle/web-dist/client/assets/index-GA9b-zy4.css +0 -1
- package/bundle/web-dist/client/assets/logs-Dh19u6Tk.js +0 -1
- package/bundle/web-dist/client/assets/tokens-Ciolqw4l.js +0 -1
|
@@ -59,11 +59,27 @@ const requestLogSubsetQueries = {
|
|
|
59
59
|
tool_call_count: "request_logs.tool_call_count",
|
|
60
60
|
is_image_generation: "request_logs.is_image_generation"
|
|
61
61
|
});
|
|
62
|
+
},
|
|
63
|
+
C: (qbWrapper) => {
|
|
64
|
+
return qbWrapper.from("request_logs").select({
|
|
65
|
+
id: "request_logs.id",
|
|
66
|
+
token_name: "request_logs.token_name",
|
|
67
|
+
model_name: "request_logs.model_name",
|
|
68
|
+
input_tokens: "request_logs.input_tokens",
|
|
69
|
+
output_tokens: "request_logs.output_tokens",
|
|
70
|
+
cache_read_tokens: "request_logs.cache_read_tokens",
|
|
71
|
+
cache_creation_tokens: "request_logs.cache_creation_tokens",
|
|
72
|
+
cache_creation_5m_tokens: "request_logs.cache_creation_5m_tokens",
|
|
73
|
+
cache_creation_1h_tokens: "request_logs.cache_creation_1h_tokens",
|
|
74
|
+
cost_usd: "request_logs.cost_usd",
|
|
75
|
+
cost_source: "request_logs.cost_source"
|
|
76
|
+
});
|
|
62
77
|
}
|
|
63
78
|
};
|
|
64
79
|
const requestLogLoaderQueries = {
|
|
65
80
|
A: [],
|
|
66
|
-
P: []
|
|
81
|
+
P: [],
|
|
82
|
+
C: []
|
|
67
83
|
};
|
|
68
84
|
const requestLogStepSubsetQueries = {
|
|
69
85
|
A: (qbWrapper) => {
|
|
@@ -154,4 +170,4 @@ const tokenLoaderQueries = { A: [] };
|
|
|
154
170
|
//#endregion
|
|
155
171
|
export { requestLogLoaderQueries, requestLogStepLoaderQueries, requestLogStepSubsetQueries, requestLogSubsetQueries, tokenLoaderQueries, tokenSubsetQueries };
|
|
156
172
|
|
|
157
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmdlbmVyYXRlZC5zc28uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBQdXJpV3JhcHBlciwgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCwgdHlwZSBQdXJpTG9hZGVyUXVlcmllcyB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHtcbiAgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5LFxuICB0eXBlIFRva2VuU3Vic2V0S2V5LFxuICB0eXBlIFJlcXVlc3RMb2dCYXNlU2NoZW1hLFxuICB0eXBlIFJlcXVlc3RMb2dTdGVwQmFzZVNjaGVtYSxcbiAgdHlwZSBUb2tlbkJhc2VTY2hlbWEsXG59IGZyb20gXCIuL3NvbmFtdS5nZW5lcmF0ZWRcIjtcblxuLy8gU3Vic2V0UXVlcnk6IFJlcXVlc3RMb2dcbmV4cG9ydCBjb25zdCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcyA9IHtcbiAgQTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgIHByb2plY3RfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsXG4gICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBcInJlcXVlc3RfbG9ncy5mYWxsYmFja19jb3VudFwiLFxuICAgICAgdXNlcl9wcm9tcHQ6IFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBcInJlcXVlc3RfbG9ncy5zeXN0ZW1fcHJvbXB0XCIsXG4gICAgICByZXNwb25zZTogXCJyZXF1ZXN0X2xvZ3MucmVzcG9uc2VcIixcbiAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICAgICAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ3MudHRmdF9tc1wiLFxuICAgICAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG4gICAgICBjb3N0X3NvdXJjZTogXCJyZXF1ZXN0X2xvZ3MuY29zdF9zb3VyY2VcIixcbiAgICAgIGltYWdlX2Nvc3RfdXNkOiBcInJlcXVlc3RfbG9ncy5pbWFnZV9jb3N0X3VzZFwiLFxuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q6IFwicmVxdWVzdF9sb2dzLmltYWdlX2Nvc3RfbWV0aG9kXCIsXG4gICAgICBlZmZvcnQ6IFwicmVxdWVzdF9sb2dzLmVmZm9ydFwiLFxuICAgICAgaGlzdG9yeTogXCJyZXF1ZXN0X2xvZ3MuaGlzdG9yeVwiLFxuICAgICAgdG9vbHM6IFwicmVxdWVzdF9sb2dzLnRvb2xzXCIsXG4gICAgICBzdGF0dXM6IFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLFxuICAgICAgZXJyb3JfbWVzc2FnZTogXCJyZXF1ZXN0X2xvZ3MuZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgdG9vbF9jYWxsX2NvdW50OiBcInJlcXVlc3RfbG9ncy50b29sX2NhbGxfY291bnRcIixcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IFwicmVxdWVzdF9sb2dzLmlzX2ltYWdlX2dlbmVyYXRpb25cIixcbiAgICB9KTtcbiAgfSxcbiAgUDogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgIHByb2plY3RfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsXG4gICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBcInJlcXVlc3RfbG9ncy5mYWxsYmFja19jb3VudFwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLm91dHB1dF90b2tlbnNcIixcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgZHVyYXRpb25fbXM6IFwicmVxdWVzdF9sb2dzLmR1cmF0aW9uX21zXCIsXG4gICAgICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbiAgICAgIGNvc3Rfc291cmNlOiBcInJlcXVlc3RfbG9ncy5jb3N0X3NvdXJjZVwiLFxuICAgICAgaW1hZ2VfY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmltYWdlX2Nvc3RfdXNkXCIsXG4gICAgICBpbWFnZV9jb3N0X21ldGhvZDogXCJyZXF1ZXN0X2xvZ3MuaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIGVmZm9ydDogXCJyZXF1ZXN0X2xvZ3MuZWZmb3J0XCIsXG4gICAgICBzdGF0dXM6IFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLFxuICAgICAgdG9vbF9jYWxsX2NvdW50OiBcInJlcXVlc3RfbG9ncy50b29sX2NhbGxfY291bnRcIixcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IFwicmVxdWVzdF9sb2dzLmlzX2ltYWdlX2dlbmVyYXRpb25cIixcbiAgICB9KTtcbiAgfSxcbn07XG5cbi8vIExvYWRlclF1ZXJ5OiBSZXF1ZXN0TG9nXG5leHBvcnQgY29uc3QgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMgPSB7XG4gIEE6IFtdLFxuICBQOiBbXSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFB1cmlMb2FkZXJRdWVyaWVzPFJlcXVlc3RMb2dTdWJzZXRLZXk+O1xuXG4vLyBTdWJzZXRRdWVyeTogUmVxdWVzdExvZ1N0ZXBcbmV4cG9ydCBjb25zdCByZXF1ZXN0TG9nU3RlcFN1YnNldFF1ZXJpZXMgPSB7XG4gIEE6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgIHJldHVybiBxYldyYXBwZXIuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5pZFwiLFxuICAgICAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsXG4gICAgICBzdGVwX2luZGV4OiBcInJlcXVlc3RfbG9nX3N0ZXBzLnN0ZXBfaW5kZXhcIixcbiAgICAgIHR5cGU6IFwicmVxdWVzdF9sb2dfc3RlcHMudHlwZVwiLFxuICAgICAgbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IFwicmVxdWVzdF9sb2dfc3RlcHMuZmFsbGJhY2tfY291bnRcIixcbiAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5pbnB1dF90b2tlbnNcIixcbiAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMub3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIGNvc3RfdXNkOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNvc3RfdXNkXCIsXG4gICAgICBjb3N0X3NvdXJjZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jb3N0X3NvdXJjZVwiLFxuICAgICAgZHVyYXRpb25fbXM6IFwicmVxdWVzdF9sb2dfc3RlcHMuZHVyYXRpb25fbXNcIixcbiAgICAgIHR0ZnRfbXM6IFwicmVxdWVzdF9sb2dfc3RlcHMudHRmdF9tc1wiLFxuICAgICAgZmluaXNoX3JlYXNvbjogXCJyZXF1ZXN0X2xvZ19zdGVwcy5maW5pc2hfcmVhc29uXCIsXG4gICAgICByZWFzb25pbmdfdGV4dDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZWFzb25pbmdfdGV4dFwiLFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZWFzb25pbmdfdG9rZW5zXCIsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9jYWxsX2luZGV4XCIsXG4gICAgICB0b29sX2NhbGxfaWQ6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9jYWxsX2lkXCIsXG4gICAgICB0b29sX25hbWU6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9uYW1lXCIsXG4gICAgICB0b29sX2FyZ3M6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9hcmdzXCIsXG4gICAgICB0b29sX3Jlc3VsdDogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX3Jlc3VsdFwiLFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2R1cmF0aW9uX21zXCIsXG4gICAgICBlcnJvcjogXCJyZXF1ZXN0X2xvZ19zdGVwcy5lcnJvclwiLFxuICAgIH0pO1xuICB9LFxuICBUOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IHtcbiAgICByZXR1cm4gcWJXcmFwcGVyLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKS5zZWxlY3Qoe1xuICAgICAgaWQ6IFwicmVxdWVzdF9sb2dfc3RlcHMuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dfc3RlcHMuY3JlYXRlZF9hdFwiLFxuICAgICAgc3RlcF9pbmRleDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5zdGVwX2luZGV4XCIsXG4gICAgICB0eXBlOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnR5cGVcIixcbiAgICAgIG1vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dfc3RlcHMubW9kZWxfbmFtZVwiLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBcInJlcXVlc3RfbG9nX3N0ZXBzLmZhbGxiYWNrX2NvdW50XCIsXG4gICAgICBpbnB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuaW5wdXRfdG9rZW5zXCIsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLm91dHB1dF90b2tlbnNcIixcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jb3N0X3VzZFwiLFxuICAgICAgY29zdF9zb3VyY2U6IFwicmVxdWVzdF9sb2dfc3RlcHMuY29zdF9zb3VyY2VcIixcbiAgICAgIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmR1cmF0aW9uX21zXCIsXG4gICAgICB0dGZ0X21zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnR0ZnRfbXNcIixcbiAgICAgIGZpbmlzaF9yZWFzb246IFwicmVxdWVzdF9sb2dfc3RlcHMuZmluaXNoX3JlYXNvblwiLFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZWFzb25pbmdfdG9rZW5zXCIsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9jYWxsX2luZGV4XCIsXG4gICAgICB0b29sX2NhbGxfaWQ6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9jYWxsX2lkXCIsXG4gICAgICB0b29sX25hbWU6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9uYW1lXCIsXG4gICAgICB0b29sX2R1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfZHVyYXRpb25fbXNcIixcbiAgICAgIGVycm9yOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmVycm9yXCIsXG4gICAgfSk7XG4gIH0sXG4gIEk6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgIHJldHVybiBxYldyYXBwZXIuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5pZFwiLFxuICAgICAgdG9vbF9hcmdzOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfYXJnc1wiLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gTG9hZGVyUXVlcnk6IFJlcXVlc3RMb2dTdGVwXG5leHBvcnQgY29uc3QgcmVxdWVzdExvZ1N0ZXBMb2FkZXJRdWVyaWVzID0ge1xuICBBOiBbXSxcbiAgVDogW10sXG4gIEk6IFtdLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUHVyaUxvYWRlclF1ZXJpZXM8UmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXk+O1xuXG4vLyBTdWJzZXRRdWVyeTogVG9rZW5cbmV4cG9ydCBjb25zdCB0b2tlblN1YnNldFF1ZXJpZXMgPSB7XG4gIEE6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgIHJldHVybiBxYldyYXBwZXIuZnJvbShcInRva2Vuc1wiKS5zZWxlY3Qoe1xuICAgICAgaWQ6IFwidG9rZW5zLmlkXCIsXG4gICAgICBjcmVhdGVkX2F0OiBcInRva2Vucy5jcmVhdGVkX2F0XCIsXG4gICAgICBwcm92aWRlcjogXCJ0b2tlbnMucHJvdmlkZXJcIixcbiAgICAgIGNyZWRlbnRpYWxzOiBcInRva2Vucy5jcmVkZW50aWFsc1wiLFxuICAgICAgbmFtZTogXCJ0b2tlbnMubmFtZVwiLFxuICAgICAgYWN0aXZlOiBcInRva2Vucy5hY3RpdmVcIixcbiAgICAgIG9yZDogXCJ0b2tlbnMub3JkXCIsXG4gICAgICBxdW90YV90aHJlc2hvbGQ6IFwidG9rZW5zLnF1b3RhX3RocmVzaG9sZFwiLFxuICAgICAgd2VpZ2h0OiBcInRva2Vucy53ZWlnaHRcIixcbiAgICB9KTtcbiAgfSxcbn07XG5cbi8vIExvYWRlclF1ZXJ5OiBUb2tlblxuZXhwb3J0IGNvbnN0IHRva2VuTG9hZGVyUXVlcmllcyA9IHtcbiAgQTogW10sXG59IGFzIGNvbnN0IHNhdGlzZmllcyBQdXJpTG9hZGVyUXVlcmllczxUb2tlblN1YnNldEtleT47XG5cbi8vIEZvcmVpZ25LZXkgVHlwZXNcbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dTdGVwRm9yZWlnbktleXMgPSBcInJlcXVlc3RfbG9nX2lkXCI7XG5cbi8vIERhdGFiYXNlU2NoZW1hXG5kZWNsYXJlIG1vZHVsZSBcInNvbmFtdVwiIHtcbiAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCB7XG4gICAgcmVxdWVzdF9sb2dzOiBSZXF1ZXN0TG9nQmFzZVNjaGVtYTtcbiAgICByZXF1ZXN0X2xvZ19zdGVwczogUmVxdWVzdExvZ1N0ZXBCYXNlU2NoZW1hO1xuICAgIHRva2VuczogVG9rZW5CYXNlU2NoZW1hO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBEYXRhYmFzZUZvcmVpZ25LZXlzIHtcbiAgICByZXF1ZXN0X2xvZ19zdGVwczogUmVxdWVzdExvZ1N0ZXBGb3JlaWduS2V5cztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBaUJBLE1BQWEsMEJBQTBCO0NBQ3JDLElBQUksY0FBaUQ7RUFDbkQsT0FBTyxVQUFVLEtBQUssY0FBYyxDQUFDLENBQUMsT0FBTztHQUMzQyxJQUFJO0dBQ0osWUFBWTtHQUNaLFlBQVk7R0FDWixjQUFjO0dBQ2QsWUFBWTtHQUNaLHNCQUFzQjtHQUN0QixnQkFBZ0I7R0FDaEIsYUFBYTtHQUNiLGVBQWU7R0FDZixVQUFVO0dBQ1YsY0FBYztHQUNkLGVBQWU7R0FDZixtQkFBbUI7R0FDbkIsdUJBQXVCO0dBQ3ZCLDBCQUEwQjtHQUMxQiwwQkFBMEI7R0FDMUIsYUFBYTtHQUNiLFNBQVM7R0FDVCxVQUFVO0dBQ1YsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixtQkFBbUI7R0FDbkIsUUFBUTtHQUNSLFNBQVM7R0FDVCxPQUFPO0dBQ1AsUUFBUTtHQUNSLGVBQWU7R0FDZixpQkFBaUI7R0FDakIscUJBQXFCO0VBQ3ZCLENBQUM7Q0FDSDtDQUNBLElBQUksY0FBaUQ7RUFDbkQsT0FBTyxVQUFVLEtBQUssY0FBYyxDQUFDLENBQUMsT0FBTztHQUMzQyxJQUFJO0dBQ0osWUFBWTtHQUNaLFlBQVk7R0FDWixjQUFjO0dBQ2QsWUFBWTtHQUNaLHNCQUFzQjtHQUN0QixnQkFBZ0I7R0FDaEIsY0FBYztHQUNkLGVBQWU7R0FDZixtQkFBbUI7R0FDbkIsdUJBQXVCO0dBQ3ZCLDBCQUEwQjtHQUMxQiwwQkFBMEI7R0FDMUIsYUFBYTtHQUNiLFNBQVM7R0FDVCxVQUFVO0dBQ1YsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixtQkFBbUI7R0FDbkIsUUFBUTtHQUNSLFFBQVE7R0FDUixpQkFBaUI7R0FDakIscUJBQXFCO0VBQ3ZCLENBQUM7Q0FDSDtBQUNGO0FBR0EsTUFBYSwwQkFBMEI7Q0FDckMsR0FBRyxDQUFDO0NBQ0osR0FBRyxDQUFDO0FBQ047QUFHQSxNQUFhLDhCQUE4QjtDQUN6QyxJQUFJLGNBQWlEO0VBQ25ELE9BQU8sVUFBVSxLQUFLLG1CQUFtQixDQUFDLENBQUMsT0FBTztHQUNoRCxJQUFJO0dBQ0osWUFBWTtHQUNaLFlBQVk7R0FDWixNQUFNO0dBQ04sWUFBWTtHQUNaLHNCQUFzQjtHQUN0QixnQkFBZ0I7R0FDaEIsY0FBYztHQUNkLGVBQWU7R0FDZixtQkFBbUI7R0FDbkIsdUJBQXVCO0dBQ3ZCLDBCQUEwQjtHQUMxQiwwQkFBMEI7R0FDMUIsVUFBVTtHQUNWLGFBQWE7R0FDYixhQUFhO0dBQ2IsU0FBUztHQUNULGVBQWU7R0FDZixnQkFBZ0I7R0FDaEIsa0JBQWtCO0dBQ2xCLGlCQUFpQjtHQUNqQixjQUFjO0dBQ2QsV0FBVztHQUNYLFdBQVc7R0FDWCxhQUFhO0dBQ2Isa0JBQWtCO0dBQ2xCLE9BQU87RUFDVCxDQUFDO0NBQ0g7Q0FDQSxJQUFJLGNBQWlEO0VBQ25ELE9BQU8sVUFBVSxLQUFLLG1CQUFtQixDQUFDLENBQUMsT0FBTztHQUNoRCxJQUFJO0dBQ0osWUFBWTtHQUNaLFlBQVk7R0FDWixNQUFNO0dBQ04sWUFBWTtHQUNaLHNCQUFzQjtHQUN0QixnQkFBZ0I7R0FDaEIsY0FBYztHQUNkLGVBQWU7R0FDZixtQkFBbUI7R0FDbkIsdUJBQXVCO0dBQ3ZCLDBCQUEwQjtHQUMxQiwwQkFBMEI7R0FDMUIsVUFBVTtHQUNWLGFBQWE7R0FDYixhQUFhO0dBQ2IsU0FBUztHQUNULGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsaUJBQWlCO0dBQ2pCLGNBQWM7R0FDZCxXQUFXO0dBQ1gsa0JBQWtCO0dBQ2xCLE9BQU87RUFDVCxDQUFDO0NBQ0g7Q0FDQSxJQUFJLGNBQWlEO0VBQ25ELE9BQU8sVUFBVSxLQUFLLG1CQUFtQixDQUFDLENBQUMsT0FBTztHQUNoRCxJQUFJO0dBQ0osV0FBVztFQUNiLENBQUM7Q0FDSDtBQUNGO0FBR0EsTUFBYSw4QkFBOEI7Q0FDekMsR0FBRyxDQUFDO0NBQ0osR0FBRyxDQUFDO0NBQ0osR0FBRyxDQUFDO0FBQ047QUFHQSxNQUFhLHFCQUFxQixFQUNoQyxJQUFJLGNBQWlEO0NBQ25ELE9BQU8sVUFBVSxLQUFLLFFBQVEsQ0FBQyxDQUFDLE9BQU87RUFDckMsSUFBSTtFQUNKLFlBQVk7RUFDWixVQUFVO0VBQ1YsYUFBYTtFQUNiLE1BQU07RUFDTixRQUFRO0VBQ1IsS0FBSztFQUNMLGlCQUFpQjtFQUNqQixRQUFRO0NBQ1YsQ0FBQztBQUNILEVBQ0Y7QUFHQSxNQUFhLHFCQUFxQixFQUNoQyxHQUFHLENBQUMsRUFDTiJ9
|
|
173
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmdlbmVyYXRlZC5zc28uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBQdXJpV3JhcHBlciwgdHlwZSBEYXRhYmFzZVNjaGVtYUV4dGVuZCwgdHlwZSBQdXJpTG9hZGVyUXVlcmllcyB9IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHtcbiAgdHlwZSBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICB0eXBlIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5LFxuICB0eXBlIFRva2VuU3Vic2V0S2V5LFxuICB0eXBlIFJlcXVlc3RMb2dCYXNlU2NoZW1hLFxuICB0eXBlIFJlcXVlc3RMb2dTdGVwQmFzZVNjaGVtYSxcbiAgdHlwZSBUb2tlbkJhc2VTY2hlbWEsXG59IGZyb20gXCIuL3NvbmFtdS5nZW5lcmF0ZWRcIjtcblxuLy8gU3Vic2V0UXVlcnk6IFJlcXVlc3RMb2dcbmV4cG9ydCBjb25zdCByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcyA9IHtcbiAgQTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgIHByb2plY3RfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsXG4gICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBcInJlcXVlc3RfbG9ncy5mYWxsYmFja19jb3VudFwiLFxuICAgICAgdXNlcl9wcm9tcHQ6IFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBcInJlcXVlc3RfbG9ncy5zeXN0ZW1fcHJvbXB0XCIsXG4gICAgICByZXNwb25zZTogXCJyZXF1ZXN0X2xvZ3MucmVzcG9uc2VcIixcbiAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIGR1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9ncy5kdXJhdGlvbl9tc1wiLFxuICAgICAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ3MudHRmdF9tc1wiLFxuICAgICAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG4gICAgICBjb3N0X3NvdXJjZTogXCJyZXF1ZXN0X2xvZ3MuY29zdF9zb3VyY2VcIixcbiAgICAgIGltYWdlX2Nvc3RfdXNkOiBcInJlcXVlc3RfbG9ncy5pbWFnZV9jb3N0X3VzZFwiLFxuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q6IFwicmVxdWVzdF9sb2dzLmltYWdlX2Nvc3RfbWV0aG9kXCIsXG4gICAgICBlZmZvcnQ6IFwicmVxdWVzdF9sb2dzLmVmZm9ydFwiLFxuICAgICAgaGlzdG9yeTogXCJyZXF1ZXN0X2xvZ3MuaGlzdG9yeVwiLFxuICAgICAgdG9vbHM6IFwicmVxdWVzdF9sb2dzLnRvb2xzXCIsXG4gICAgICBzdGF0dXM6IFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLFxuICAgICAgZXJyb3JfbWVzc2FnZTogXCJyZXF1ZXN0X2xvZ3MuZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgdG9vbF9jYWxsX2NvdW50OiBcInJlcXVlc3RfbG9ncy50b29sX2NhbGxfY291bnRcIixcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IFwicmVxdWVzdF9sb2dzLmlzX2ltYWdlX2dlbmVyYXRpb25cIixcbiAgICB9KTtcbiAgfSxcbiAgUDogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgIHByb2plY3RfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsXG4gICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9ncy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ3MucmVxdWVzdGVkX21vZGVsX25hbWVcIixcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBcInJlcXVlc3RfbG9ncy5mYWxsYmFja19jb3VudFwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLm91dHB1dF90b2tlbnNcIixcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgZHVyYXRpb25fbXM6IFwicmVxdWVzdF9sb2dzLmR1cmF0aW9uX21zXCIsXG4gICAgICB0dGZ0X21zOiBcInJlcXVlc3RfbG9ncy50dGZ0X21zXCIsXG4gICAgICBjb3N0X3VzZDogXCJyZXF1ZXN0X2xvZ3MuY29zdF91c2RcIixcbiAgICAgIGNvc3Rfc291cmNlOiBcInJlcXVlc3RfbG9ncy5jb3N0X3NvdXJjZVwiLFxuICAgICAgaW1hZ2VfY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmltYWdlX2Nvc3RfdXNkXCIsXG4gICAgICBpbWFnZV9jb3N0X21ldGhvZDogXCJyZXF1ZXN0X2xvZ3MuaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICAgIGVmZm9ydDogXCJyZXF1ZXN0X2xvZ3MuZWZmb3J0XCIsXG4gICAgICBzdGF0dXM6IFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLFxuICAgICAgdG9vbF9jYWxsX2NvdW50OiBcInJlcXVlc3RfbG9ncy50b29sX2NhbGxfY291bnRcIixcbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IFwicmVxdWVzdF9sb2dzLmlzX2ltYWdlX2dlbmVyYXRpb25cIixcbiAgICB9KTtcbiAgfSxcbiAgQzogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIixcbiAgICAgIHRva2VuX25hbWU6IFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIixcbiAgICAgIG1vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLm1vZGVsX25hbWVcIixcbiAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuaW5wdXRfdG9rZW5zXCIsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCIsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IFwicmVxdWVzdF9sb2dzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIGNvc3RfdXNkOiBcInJlcXVlc3RfbG9ncy5jb3N0X3VzZFwiLFxuICAgICAgY29zdF9zb3VyY2U6IFwicmVxdWVzdF9sb2dzLmNvc3Rfc291cmNlXCIsXG4gICAgfSk7XG4gIH0sXG59O1xuXG4vLyBMb2FkZXJRdWVyeTogUmVxdWVzdExvZ1xuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzID0ge1xuICBBOiBbXSxcbiAgUDogW10sXG4gIEM6IFtdLFxufSBhcyBjb25zdCBzYXRpc2ZpZXMgUHVyaUxvYWRlclF1ZXJpZXM8UmVxdWVzdExvZ1N1YnNldEtleT47XG5cbi8vIFN1YnNldFF1ZXJ5OiBSZXF1ZXN0TG9nU3RlcFxuZXhwb3J0IGNvbnN0IHJlcXVlc3RMb2dTdGVwU3Vic2V0UXVlcmllcyA9IHtcbiAgQTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIikuc2VsZWN0KHtcbiAgICAgIGlkOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmlkXCIsXG4gICAgICBjcmVhdGVkX2F0OiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNyZWF0ZWRfYXRcIixcbiAgICAgIHN0ZXBfaW5kZXg6IFwicmVxdWVzdF9sb2dfc3RlcHMuc3RlcF9pbmRleFwiLFxuICAgICAgdHlwZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy50eXBlXCIsXG4gICAgICBtb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9nX3N0ZXBzLm1vZGVsX25hbWVcIixcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBmYWxsYmFja19jb3VudDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5mYWxsYmFja19jb3VudFwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmlucHV0X3Rva2Vuc1wiLFxuICAgICAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5vdXRwdXRfdG9rZW5zXCIsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dfc3RlcHMuY29zdF91c2RcIixcbiAgICAgIGNvc3Rfc291cmNlOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNvc3Rfc291cmNlXCIsXG4gICAgICBkdXJhdGlvbl9tczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5kdXJhdGlvbl9tc1wiLFxuICAgICAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ19zdGVwcy50dGZ0X21zXCIsXG4gICAgICBmaW5pc2hfcmVhc29uOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmZpbmlzaF9yZWFzb25cIixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlYXNvbmluZ190ZXh0XCIsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlYXNvbmluZ190b2tlbnNcIixcbiAgICAgIHRvb2xfY2FsbF9pbmRleDogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2NhbGxfaW5kZXhcIixcbiAgICAgIHRvb2xfY2FsbF9pZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2NhbGxfaWRcIixcbiAgICAgIHRvb2xfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX25hbWVcIixcbiAgICAgIHRvb2xfYXJnczogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2FyZ3NcIixcbiAgICAgIHRvb2xfcmVzdWx0OiBcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfcmVzdWx0XCIsXG4gICAgICB0b29sX2R1cmF0aW9uX21zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfZHVyYXRpb25fbXNcIixcbiAgICAgIGVycm9yOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmVycm9yXCIsXG4gICAgfSk7XG4gIH0sXG4gIFQ6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4ge1xuICAgIHJldHVybiBxYldyYXBwZXIuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5pZFwiLFxuICAgICAgY3JlYXRlZF9hdDogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jcmVhdGVkX2F0XCIsXG4gICAgICBzdGVwX2luZGV4OiBcInJlcXVlc3RfbG9nX3N0ZXBzLnN0ZXBfaW5kZXhcIixcbiAgICAgIHR5cGU6IFwicmVxdWVzdF9sb2dfc3RlcHMudHlwZVwiLFxuICAgICAgbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5tb2RlbF9uYW1lXCIsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IFwicmVxdWVzdF9sb2dfc3RlcHMuZmFsbGJhY2tfY291bnRcIixcbiAgICAgIGlucHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5pbnB1dF90b2tlbnNcIixcbiAgICAgIG91dHB1dF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMub3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IFwicmVxdWVzdF9sb2dfc3RlcHMuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgIGNvc3RfdXNkOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmNvc3RfdXNkXCIsXG4gICAgICBjb3N0X3NvdXJjZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy5jb3N0X3NvdXJjZVwiLFxuICAgICAgZHVyYXRpb25fbXM6IFwicmVxdWVzdF9sb2dfc3RlcHMuZHVyYXRpb25fbXNcIixcbiAgICAgIHR0ZnRfbXM6IFwicmVxdWVzdF9sb2dfc3RlcHMudHRmdF9tc1wiLFxuICAgICAgZmluaXNoX3JlYXNvbjogXCJyZXF1ZXN0X2xvZ19zdGVwcy5maW5pc2hfcmVhc29uXCIsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlYXNvbmluZ190b2tlbnNcIixcbiAgICAgIHRvb2xfY2FsbF9pbmRleDogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2NhbGxfaW5kZXhcIixcbiAgICAgIHRvb2xfY2FsbF9pZDogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX2NhbGxfaWRcIixcbiAgICAgIHRvb2xfbmFtZTogXCJyZXF1ZXN0X2xvZ19zdGVwcy50b29sX25hbWVcIixcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9kdXJhdGlvbl9tc1wiLFxuICAgICAgZXJyb3I6IFwicmVxdWVzdF9sb2dfc3RlcHMuZXJyb3JcIixcbiAgICB9KTtcbiAgfSxcbiAgSTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIikuc2VsZWN0KHtcbiAgICAgIGlkOiBcInJlcXVlc3RfbG9nX3N0ZXBzLmlkXCIsXG4gICAgICB0b29sX2FyZ3M6IFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9hcmdzXCIsXG4gICAgfSk7XG4gIH0sXG59O1xuXG4vLyBMb2FkZXJRdWVyeTogUmVxdWVzdExvZ1N0ZXBcbmV4cG9ydCBjb25zdCByZXF1ZXN0TG9nU3RlcExvYWRlclF1ZXJpZXMgPSB7XG4gIEE6IFtdLFxuICBUOiBbXSxcbiAgSTogW10sXG59IGFzIGNvbnN0IHNhdGlzZmllcyBQdXJpTG9hZGVyUXVlcmllczxSZXF1ZXN0TG9nU3RlcFN1YnNldEtleT47XG5cbi8vIFN1YnNldFF1ZXJ5OiBUb2tlblxuZXhwb3J0IGNvbnN0IHRva2VuU3Vic2V0UXVlcmllcyA9IHtcbiAgQTogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiB7XG4gICAgcmV0dXJuIHFiV3JhcHBlci5mcm9tKFwidG9rZW5zXCIpLnNlbGVjdCh7XG4gICAgICBpZDogXCJ0b2tlbnMuaWRcIixcbiAgICAgIGNyZWF0ZWRfYXQ6IFwidG9rZW5zLmNyZWF0ZWRfYXRcIixcbiAgICAgIHByb3ZpZGVyOiBcInRva2Vucy5wcm92aWRlclwiLFxuICAgICAgY3JlZGVudGlhbHM6IFwidG9rZW5zLmNyZWRlbnRpYWxzXCIsXG4gICAgICBuYW1lOiBcInRva2Vucy5uYW1lXCIsXG4gICAgICBhY3RpdmU6IFwidG9rZW5zLmFjdGl2ZVwiLFxuICAgICAgb3JkOiBcInRva2Vucy5vcmRcIixcbiAgICAgIHF1b3RhX3RocmVzaG9sZDogXCJ0b2tlbnMucXVvdGFfdGhyZXNob2xkXCIsXG4gICAgICB3ZWlnaHQ6IFwidG9rZW5zLndlaWdodFwiLFxuICAgIH0pO1xuICB9LFxufTtcblxuLy8gTG9hZGVyUXVlcnk6IFRva2VuXG5leHBvcnQgY29uc3QgdG9rZW5Mb2FkZXJRdWVyaWVzID0ge1xuICBBOiBbXSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFB1cmlMb2FkZXJRdWVyaWVzPFRva2VuU3Vic2V0S2V5PjtcblxuLy8gRm9yZWlnbktleSBUeXBlc1xuZXhwb3J0IHR5cGUgUmVxdWVzdExvZ1N0ZXBGb3JlaWduS2V5cyA9IFwicmVxdWVzdF9sb2dfaWRcIjtcblxuLy8gRGF0YWJhc2VTY2hlbWFcbmRlY2xhcmUgbW9kdWxlIFwic29uYW11XCIge1xuICBleHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlU2NoZW1hRXh0ZW5kIHtcbiAgICByZXF1ZXN0X2xvZ3M6IFJlcXVlc3RMb2dCYXNlU2NoZW1hO1xuICAgIHJlcXVlc3RfbG9nX3N0ZXBzOiBSZXF1ZXN0TG9nU3RlcEJhc2VTY2hlbWE7XG4gICAgdG9rZW5zOiBUb2tlbkJhc2VTY2hlbWE7XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIERhdGFiYXNlRm9yZWlnbktleXMge1xuICAgIHJlcXVlc3RfbG9nX3N0ZXBzOiBSZXF1ZXN0TG9nU3RlcEZvcmVpZ25LZXlzO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7QUFpQkEsTUFBYSwwQkFBMEI7Q0FDckMsSUFBSSxjQUFpRDtFQUNuRCxPQUFPLFVBQVUsS0FBSyxjQUFjLENBQUMsQ0FBQyxPQUFPO0dBQzNDLElBQUk7R0FDSixZQUFZO0dBQ1osWUFBWTtHQUNaLGNBQWM7R0FDZCxZQUFZO0dBQ1osc0JBQXNCO0dBQ3RCLGdCQUFnQjtHQUNoQixhQUFhO0dBQ2IsZUFBZTtHQUNmLFVBQVU7R0FDVixjQUFjO0dBQ2QsZUFBZTtHQUNmLG1CQUFtQjtHQUNuQix1QkFBdUI7R0FDdkIsMEJBQTBCO0dBQzFCLDBCQUEwQjtHQUMxQixhQUFhO0dBQ2IsU0FBUztHQUNULFVBQVU7R0FDVixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLG1CQUFtQjtHQUNuQixRQUFRO0dBQ1IsU0FBUztHQUNULE9BQU87R0FDUCxRQUFRO0dBQ1IsZUFBZTtHQUNmLGlCQUFpQjtHQUNqQixxQkFBcUI7RUFDdkIsQ0FBQztDQUNIO0NBQ0EsSUFBSSxjQUFpRDtFQUNuRCxPQUFPLFVBQVUsS0FBSyxjQUFjLENBQUMsQ0FBQyxPQUFPO0dBQzNDLElBQUk7R0FDSixZQUFZO0dBQ1osWUFBWTtHQUNaLGNBQWM7R0FDZCxZQUFZO0dBQ1osc0JBQXNCO0dBQ3RCLGdCQUFnQjtHQUNoQixjQUFjO0dBQ2QsZUFBZTtHQUNmLG1CQUFtQjtHQUNuQix1QkFBdUI7R0FD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
|
|
@@ -3,7 +3,9 @@ import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm
|
|
|
3
3
|
import { SD } from "../../i18n/sd.generated.js";
|
|
4
4
|
import { tokenLoaderQueries, tokenSubsetQueries } from "../sonamu.generated.sso.js";
|
|
5
5
|
import { BadRequestException, BaseModelClass, NotFoundException, api, asArray, exhaustive } from "sonamu";
|
|
6
|
+
import { getLogger } from "@logtape/logtape";
|
|
6
7
|
//#region src/application/token/token.model.ts
|
|
8
|
+
const logger = getLogger(["qgrid", "token"]);
|
|
7
9
|
const DEFAULT_QUOTA_THRESHOLD = 80;
|
|
8
10
|
const DEFAULT_WEIGHT = 1;
|
|
9
11
|
function applyCreateDefaults(sp) {
|
|
@@ -122,6 +124,45 @@ var TokenModelClass = class extends BaseModelClass {
|
|
|
122
124
|
async updateFields(id, fields) {
|
|
123
125
|
return this.getPuri("w").transaction((trx) => trx.table("tokens").where("id", id).update(fields));
|
|
124
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* 세션 만료 토큰을 라우팅에서 제외한다. `active=true` 조건부 갱신이므로 공유 DB 를 쓰는
|
|
129
|
+
* 여러 인스턴스가 동시에 같은 만료를 감지해도 true 를 받는 프로세스는 하나뿐이다
|
|
130
|
+
* (호출부의 알림 발송 게이트).
|
|
131
|
+
*
|
|
132
|
+
* 단, 대상이 해당 provider 의 마지막 활성 토큰이면 갱신하지 않고 false 를 반환한다.
|
|
133
|
+
* client_id 취소나 OAuth 계약 변경처럼 전 토큰이 동시에 실패하는 상황에서 풀이
|
|
134
|
+
* 통째로 비는 것을 막는 안전판이다.
|
|
135
|
+
*/
|
|
136
|
+
/**
|
|
137
|
+
* 같은 계정의 기존 토큰을 지우고 새로 저장한다(로그인·재로그인 공통 경로).
|
|
138
|
+
*
|
|
139
|
+
* @returns 처음 들어온 계정인지 — 호출부의 신규 등록 알림 게이트. 재로그인은
|
|
140
|
+
* 기존 토큰을 대체하는 것이라 알릴 사건이 아니다.
|
|
141
|
+
*
|
|
142
|
+
* provider 응답에 계정 식별자가 없으면 dedup 자체가 불가능하므로 경고만 남기고
|
|
143
|
+
* 중복 제거 없이 저장한다(죽은 row 가 남는다). 이때는 기존 토큰 유무를 알 수 없어
|
|
144
|
+
* 신규로 보지 않는다 — 재로그인을 신규로 잘못 알리는 편보다 조용한 편이 낫다.
|
|
145
|
+
*/
|
|
146
|
+
async replaceByAccount(provider, accountId, saveParams) {
|
|
147
|
+
let isNew = false;
|
|
148
|
+
if (accountId) {
|
|
149
|
+
const oldEntries = await this.findByAccountIdentifier("A", provider, accountId);
|
|
150
|
+
if (oldEntries.length > 0) await this.del(oldEntries.map((o) => o.id));
|
|
151
|
+
else isNew = true;
|
|
152
|
+
} else logger.warn(`${provider} login without account identifier: dedup skipped for ${saveParams.name ?? "unnamed"}`);
|
|
153
|
+
await this.save([saveParams]);
|
|
154
|
+
return { isNew };
|
|
155
|
+
}
|
|
156
|
+
async deactivateIfActive(id) {
|
|
157
|
+
const wdb = this.getPuri("w");
|
|
158
|
+
if (((await wdb.knex.raw(`UPDATE tokens SET active = false
|
|
159
|
+
WHERE id = ? AND active = true
|
|
160
|
+
AND (SELECT count(*) FROM tokens peer
|
|
161
|
+
WHERE peer.provider = tokens.provider AND peer.active) > 1`, [id])).rowCount ?? 0) > 0) return true;
|
|
162
|
+
const survivor = (await wdb.knex.raw("SELECT provider FROM tokens WHERE id = ? AND active = true", [id])).rows[0];
|
|
163
|
+
if (survivor) logger.error(`refusing to auto-deactivate token ${id}: last active ${survivor.provider} token — systemic refresh failure suspected, keeping the pool non-empty`);
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
125
166
|
async reorder(ids) {
|
|
126
167
|
await this.getPuri("w").transaction(async (trx) => {
|
|
127
168
|
for (let i = 0; i < ids.length; i++) await trx.table("tokens").where("id", ids[i]).update({ ord: i });
|
|
@@ -186,4 +227,4 @@ const TokenModel = new TokenModelClass();
|
|
|
186
227
|
//#endregion
|
|
187
228
|
export { TokenModel };
|
|
188
229
|
|
|
189
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzZXRLZXksIHR5cGUgVG9rZW5TdWJzZXRNYXBwaW5nIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IHRva2VuTG9hZGVyUXVlcmllcywgdG9rZW5TdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuTGlzdFBhcmFtcywgdHlwZSBUb2tlblNhdmVQYXJhbXMgfSBmcm9tIFwiLi90b2tlbi50eXBlc1wiO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW9yZGVyKGlkczogbnVtYmVyW10pOiBQcm9taXNlPHsgZG9uZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXdhaXQgdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWRzW2ldISkudXBkYXRlKHsgb3JkOiBpIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBhd2FpdCB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInRva2Vuc1wiKS53aGVyZUluKFwidG9rZW5zLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFRva2VuTW9kZWwgPSBuZXcgVG9rZW5Nb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQWVBLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0saUJBQWlCO0FBUXZCLFNBQVMsb0JBQW9CLElBQXNDO0NBQ2pFLElBQUksR0FBRyxPQUFPLFFBQVcsT0FBTztDQUNoQyxPQUFPO0VBQ0wsR0FBRztFQUNILEdBQUksR0FBRyxvQkFBb0IsU0FBWSxFQUFFLGlCQUFpQix3QkFBd0IsSUFBSSxDQUFDO0VBQ3ZGLEdBQUksR0FBRyxXQUFXLFNBQVksRUFBRSxRQUFRLGVBQWUsSUFBSSxDQUFDO0NBQzlEO0FBQ0Y7QUFFQSxJQUFNLGtCQUFOLGNBQThCLGVBSzVCO0NBQ0EsY0FBYztFQUNaLE1BQU0sU0FBUyxvQkFBb0Isa0JBQWtCO0NBQ3ZEO0NBRUEsTUFDTSxTQUFtQyxRQUFXLElBQTRDO0VBQzlGLE1BQU0sRUFBRSxTQUFTLE1BQU0sS0FBSyxTQUFTLFFBQVE7R0FBRTtHQUFJLEtBQUs7R0FBRyxNQUFNO0VBQUUsQ0FBQztFQUNwRSxJQUFJLENBQUMsS0FBSyxJQUNSLE1BQU0sSUFBSSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBRXJFLE9BQU8sS0FBSztDQUNkO0NBRUEsTUFBTSxRQUNKLFFBQ0EsWUFDdUM7RUFDdkMsTUFBTSxFQUFFLFNBQVMsTUFBTSxLQUFLLFNBQVMsUUFBUTtHQUFFLEdBQUc7R0FBWSxLQUFLO0dBQUcsTUFBTTtFQUFFLENB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
|
|
230
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4ubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQge1xuICBhcGksXG4gIGFzQXJyYXksXG4gIEJhZFJlcXVlc3RFeGNlcHRpb24sXG4gIEJhc2VNb2RlbENsYXNzLFxuICBleGhhdXN0aXZlLFxuICB0eXBlIExpc3RSZXN1bHQsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxufSBmcm9tIFwic29uYW11XCI7XG5cbmltcG9ydCB7IFNEIH0gZnJvbSBcIi4uLy4uL2kxOG4vc2QuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0S2V5LCB0eXBlIFRva2VuU3Vic2V0TWFwcGluZyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyB0b2tlbkxvYWRlclF1ZXJpZXMsIHRva2VuU3Vic2V0UXVlcmllcyB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkLnNzb1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlbkxpc3RQYXJhbXMsIHR5cGUgVG9rZW5TYXZlUGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwidG9rZW5cIl0pO1xuXG5jb25zdCBERUZBVUxUX1FVT1RBX1RIUkVTSE9MRCA9IDgwO1xuY29uc3QgREVGQVVMVF9XRUlHSFQgPSAxO1xuXG5leHBvcnQgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcXVvdGFfdGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gYXBwbHlDcmVhdGVEZWZhdWx0cyhzcDogVG9rZW5TYXZlUGFyYW1zKTogVG9rZW5TYXZlUGFyYW1zIHtcbiAgaWYgKHNwLmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBzcDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcCxcbiAgICAuLi4oc3AucXVvdGFfdGhyZXNob2xkID09PSB1bmRlZmluZWQgPyB7IHF1b3RhX3RocmVzaG9sZDogREVGQVVMVF9RVU9UQV9USFJFU0hPTEQgfSA6IHt9KSxcbiAgICAuLi4oc3Aud2VpZ2h0ID09PSB1bmRlZmluZWQgPyB7IHdlaWdodDogREVGQVVMVF9XRUlHSFQgfSA6IHt9KSxcbiAgfTtcbn1cblxuY2xhc3MgVG9rZW5Nb2RlbENsYXNzIGV4dGVuZHMgQmFzZU1vZGVsQ2xhc3M8XG4gIFRva2VuU3Vic2V0S2V5LFxuICBUb2tlblN1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiB0b2tlblN1YnNldFF1ZXJpZXMsXG4gIHR5cGVvZiB0b2tlbkxvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRva2VuXCIsIHRva2VuU3Vic2V0UXVlcmllcywgdG9rZW5Mb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiVG9rZW5cIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KHN1YnNldDogVCwgaWQ6IG51bWJlcik6IFByb21pc2U8VG9rZW5TdWJzZXRNYXBwaW5nW1RdPiB7XG4gICAgY29uc3QgeyByb3dzIH0gPSBhd2FpdCB0aGlzLmZpbmRNYW55KHN1YnNldCwgeyBpZCwgbnVtOiAxLCBwYWdlOiAxIH0pO1xuICAgIGlmICghcm93c1swXSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFNEKFwiZXJyb3IuZW50aXR5Tm90Rm91bmRcIikoXCJUb2tlblwiLCBpZCkpO1xuICAgIH1cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgbGlzdFBhcmFtczogVG9rZW5MaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7IC4uLmxpc3RQYXJhbXMsIG51bTogMSwgcGFnZTogMSB9KTtcbiAgICByZXR1cm4gcm93c1swXSA/PyBudWxsO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0sIHJlc291cmNlTmFtZTogXCJUb2tlbnNcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFByb21pc2U8TGlzdFJlc3VsdDxMUCwgVG9rZW5TdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcIm9yZC1hc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBUb2tlbkxpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwidG9rZW5zLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInRva2Vucy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJuYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJ0b2tlbnMubmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm9yZGVyQnkpIHtcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5vcmRlckJ5ID09PSBcIm9yZC1hc2NcIikge1xuICAgICAgICBxYi5vcmRlckJ5KFwidG9rZW5zLm9yZFwiLCBcImFzY1wiKTtcbiAgICAgICAgcWIub3JkZXJCeShcInRva2Vucy5pZFwiLCBcImFzY1wiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aGF1c3RpdmUocGFyYW1zLm9yZGVyQnkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHtcbiAgICAgIEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7IHN1YnNldCwgcWIsIHBhcmFtcywgZW5oYW5jZXJzLCBkZWJ1ZzogZmFsc2UgfSk7XG4gIH1cblxuICBhc3luYyBmaW5kQnlBY2NvdW50SWRlbnRpZmllcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGFjY291bnRJZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMucHJvdmlkZXJcIiwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IGpzb25LZXkgPSBwcm92aWRlciA9PT0gXCJhbnRocm9waWNcIiA/IFwiYWNjb3VudFV1aWRcIiA6IFwiYWNjb3VudElkXCI7XG4gICAgcWIud2hlcmVSYXcoYHRva2Vucy5jcmVkZW50aWFscy0+Picke2pzb25LZXl9JyA9ID9gLCBbYWNjb3VudElkXSk7XG4gICAgY29uc3QgZW5oYW5jZXJzID0gdGhpcy5jcmVhdGVFbmhhbmNlcnMoeyBBOiAocm93KSA9PiAoeyAuLi5yb3cgfSkgfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlU3Vic2V0UXVlcnkoe1xuICAgICAgc3Vic2V0LFxuICAgICAgcWIsXG4gICAgICBwYXJhbXM6IHsgbnVtOiAxMDAsIHBhZ2U6IDEgfSxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0LnJvd3M7XG4gIH1cblxuICBhc3luYyBmaW5kQWN0aXZlQnlQcm92aWRlcjxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICApOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIHFiLndoZXJlKFwidG9rZW5zLnByb3ZpZGVyXCIsIHByb3ZpZGVyKTtcbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7IEE6IChyb3cpID0+ICh7IC4uLnJvdyB9KSB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtczogeyBudW06IDEwMCwgcGFnZTogMSB9LFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQucm93cztcbiAgfVxuXG4gIGFzeW5jIGZpbmRBY3RpdmU8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQpOiBQcm9taXNlPFRva2VuU3Vic2V0TWFwcGluZ1tUXVtdPiB7XG4gICAgY29uc3QgeyBxYiB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG4gICAgcWIud2hlcmUoXCJ0b2tlbnMuYWN0aXZlXCIsIHRydWUpO1xuICAgIGNvbnN0IGVuaGFuY2VycyA9IHRoaXMuY3JlYXRlRW5oYW5jZXJzKHsgQTogKHJvdykgPT4gKHsgLi4ucm93IH0pIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zOiB7IG51bTogMTAwLCBwYWdlOiAxIH0sXG4gICAgICBlbmhhbmNlcnMsXG4gICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5yb3dzO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBUb2tlblNhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJ0b2tlbnNcIiwgYXBwbHlDcmVhdGVEZWZhdWx0cyhzcCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgcmV0dXJuIHRyeC51YlVwc2VydChcInRva2Vuc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUZpZWxkcyhpZDogbnVtYmVyLCBmaWVsZHM6IFRva2VuVXBkYXRlRmllbGRzKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oKHRyeCkgPT4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlKFwiaWRcIiwgaWQpLnVwZGF0ZShmaWVsZHMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDshLjshZgg66eM66OMIO2GoO2BsOydhCDrnbzsmrDtjIXsl5DshJwg7KCc7Jm47ZWc64ukLiBgYWN0aXZlPXRydWVgIOyhsOqxtOu2gCDqsLHsi6DsnbTrr4DroZwg6rO17JygIERCIOulvCDsk7DripRcbiAgICog7Jes65+sIOyduOyKpO2EtOyKpOqwgCDrj5nsi5zsl5Ag6rCZ7J2AIOunjOujjOulvCDqsJDsp4DtlbTrj4QgdHJ1ZSDrpbwg67Cb64qUIO2UhOuhnOyEuOyKpOuKlCDtlZjrgpjrv5DsnbTri6RcbiAgICogKO2YuOy2nOu2gOydmCDslYzrprwg67Cc7IahIOqyjOydtO2KuCkuXG4gICAqXG4gICAqIOuLqCwg64yA7IOB7J20IO2VtOuLuSBwcm92aWRlciDsnZgg66eI7KeA66eJIO2ZnOyEsSDthqDtgbDsnbTrqbQg6rCx7Iug7ZWY7KeAIOyViuqzoCBmYWxzZSDrpbwg67CY7ZmY7ZWc64ukLlxuICAgKiBjbGllbnRfaWQg7Leo7IaM64KYIE9BdXRoIOqzhOyVvSDrs4Dqsr3sspjrn7wg7KCEIO2GoO2BsOydtCDrj5nsi5zsl5Ag7Iuk7Yyo7ZWY64qUIOyDge2ZqeyXkOyEnCDtkoDsnbRcbiAgICog7Ya17Ke466GcIOu5hOuKlCDqsoPsnYQg66eJ64qUIOyViOyghO2MkOydtOuLpC5cbiAgICovXG4gIC8qKlxuICAgKiDqsJnsnYAg6rOE7KCV7J2YIOq4sOyhtCDthqDtgbDsnYQg7KeA7Jqw6rOgIOyDiOuhnCDsoIDsnqXtlZzri6Qo66Gc6re47J24wrfsnqzroZzqt7jsnbgg6rO17Ya1IOqyveuhnCkuXG4gICAqXG4gICAqIEByZXR1cm5zIOyymOydjCDrk6TslrTsmKgg6rOE7KCV7J247KeAIOKAlCDtmLjstpzrtoDsnZgg7Iug6recIOuTseuhnSDslYzrprwg6rKM7J207Yq4LiDsnqzroZzqt7jsnbjsnYBcbiAgICogICDquLDsobQg7Yag7YGw7J2EIOuMgOyytO2VmOuKlCDqsoPsnbTrnbwg7JWM66a0IOyCrOqxtOydtCDslYTri4jri6QuXG4gICAqXG4gICAqICAgcHJvdmlkZXIg7J2R64u17JeQIOqzhOyglSDsi53rs4TsnpDqsIAg7JeG7Jy866m0IGRlZHVwIOyekOyytOqwgCDrtojqsIDriqXtlZjrr4DroZwg6rK96rOg66eMIOuCqOq4sOqzoFxuICAgKiAgIOykkeuztSDsoJzqsbAg7JeG7J20IOyggOyepe2VnOuLpCjso73snYAgcm93IOqwgCDrgqjripTri6QpLiDsnbTrlYzripQg6riw7KG0IO2GoO2BsCDsnKDrrLTrpbwg7JWMIOyImCDsl4bslrRcbiAgICogICDsi6Dqt5zroZwg67O07KeAIOyViuuKlOuLpCDigJQg7J6s66Gc6re47J247J2EIOyLoOq3nOuhnCDsnpjrqrsg7JWM66as64qUIO2OuOuztOuLpCDsobDsmqntlZwg7Y647J20IOuCq+uLpC5cbiAgICovXG4gIGFzeW5jIHJlcGxhY2VCeUFjY291bnQoXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBhY2NvdW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzYXZlUGFyYW1zOiBUb2tlblNhdmVQYXJhbXMsXG4gICk6IFByb21pc2U8eyBpc05ldzogYm9vbGVhbiB9PiB7XG4gICAgbGV0IGlzTmV3ID0gZmFsc2U7XG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IHRoaXMuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXCJBXCIsIHByb3ZpZGVyLCBhY2NvdW50SWQpO1xuICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNOZXcgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYCR7cHJvdmlkZXJ9IGxvZ2luIHdpdGhvdXQgYWNjb3VudCBpZGVudGlmaWVyOiBkZWR1cCBza2lwcGVkIGZvciAke3NhdmVQYXJhbXMubmFtZSA/PyBcInVubmFtZWRcIn1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoW3NhdmVQYXJhbXNdKTtcbiAgICByZXR1cm4geyBpc05ldyB9O1xuICB9XG5cbiAgYXN5bmMgZGVhY3RpdmF0ZUlmQWN0aXZlKGlkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8g7Zmc7ISxIOyXrOu2gOyZgCBcIuuniOyngOuniSDrgqjsnYAg7Yag7YGw7J246rCAXCLrpbwg7ZWcIHN0YXRlbWVudCDslYjsl5DshJwg7YyQ7KCV7ZWc64ukLiDrkZAg7KGw6rG07J2EXG4gICAgLy8g65Sw66GcIOydveqzoCDrgpjspJHsl5Ag6rCx7Iug7ZWY66m0IOq3uCDsgqzsnbTsl5Ag64uk66W4IOyduOyKpO2EtOyKpOqwgCDqsJnsnYAgcHJvdmlkZXIg7J2YIO2GoO2BsOydhFxuICAgIC8vIOu5hO2ZnOyEse2ZlO2VtCDtkoDsnbQg7Ya17Ke466GcIOu5jCDsiJgg7J6I64ukLlxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dDb3VudDogbnVtYmVyIH0+KFxuICAgICAgYFVQREFURSB0b2tlbnMgU0VUIGFjdGl2ZSA9IGZhbHNlXG4gICAgICAgV0hFUkUgaWQgPSA/IEFORCBhY3RpdmUgPSB0cnVlXG4gICAgICAgICBBTkQgKFNFTEVDVCBjb3VudCgqKSBGUk9NIHRva2VucyBwZWVyXG4gICAgICAgICAgICAgIFdIRVJFIHBlZXIucHJvdmlkZXIgPSB0b2tlbnMucHJvdmlkZXIgQU5EIHBlZXIuYWN0aXZlKSA+IDFgLFxuICAgICAgW2lkXSxcbiAgICApO1xuICAgIGlmICgodXBkYXRlZC5yb3dDb3VudCA/PyAwKSA+IDApIHJldHVybiB0cnVlO1xuXG4gICAgLy8g6rCx7Iug65CY7KeAIOyViuydgCDsnbTsnKDripQg65GYIOykkSDtlZjrgpjri6Q6IOydtOuvuCDruYTtmZzshLHsnbTqsbDrgpgo7KCV7IOBIOqyveyfgSDqsrDqs7wpLCDrp4jsp4Drp4lcbiAgICAvLyDtmZzshLEg7Yag7YGw7J206rGw64KYLiDtm4TsnpDripQgc3lzdGVtaWMg7Iuk7YyoIOyLoO2YuOudvCDrgqjqsqjslbwg7ZWY66+A66GcIOydtOuVjOunjCDtlZwg67KIIOuNlCDsnb3ripTri6QuXG4gICAgY29uc3Qgc3Vydml2b3IgPSAoXG4gICAgICBhd2FpdCB3ZGIua25leC5yYXc8eyByb3dzOiB7IHByb3ZpZGVyOiBzdHJpbmcgfVtdIH0+KFxuICAgICAgICBcIlNFTEVDVCBwcm92aWRlciBGUk9NIHRva2VucyBXSEVSRSBpZCA9ID8gQU5EIGFjdGl2ZSA9IHRydWVcIixcbiAgICAgICAgW2lkXSxcbiAgICAgIClcbiAgICApLnJvd3NbMF07XG4gICAgaWYgKHN1cnZpdm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGByZWZ1c2luZyB0byBhdXRvLWRlYWN0aXZhdGUgdG9rZW4gJHtpZH06IGxhc3QgYWN0aXZlICR7c3Vydml2b3IucHJvdmlkZXJ9IHRva2VuIOKAlCBgICtcbiAgICAgICAgICBgc3lzdGVtaWMgcmVmcmVzaCBmYWlsdXJlIHN1c3BlY3RlZCwga2VlcGluZyB0aGUgcG9vbCBub24tZW1wdHlgLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHJlb3JkZXIoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8eyBkb25lOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBhd2FpdCB0cngudGFibGUoXCJ0b2tlbnNcIikud2hlcmUoXCJpZFwiLCBpZHNbaV0hKS51cGRhdGUoeyBvcmQ6IGkgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGRlbChpZHM6IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICByZXR1cm4gdHJ4LnRhYmxlKFwidG9rZW5zXCIpLndoZXJlSW4oXCJ0b2tlbnMuaWRcIiwgaWRzKS5kZWxldGUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVG9rZW5Nb2RlbCA9IG5ldyBUb2tlbk1vZGVsQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQWdCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsT0FBTyxDQUFDO0FBRTNDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0saUJBQWlCO0FBUXZCLFNBQVMsb0JBQW9CLElBQXNDO0NBQ2pFLElBQUksR0FBRyxPQUFPLFFBQVcsT0FBTztDQUNoQyxPQUFPO0VBQ0wsR0FBRztFQUNILEdBQUksR0FBRyxvQkFBb0IsU0FBWSxFQUFFLGlCQUFpQix3QkFBd0IsSUFBSSxDQUFDO0VBQ3ZGLEdBQUksR0FBRyxXQUFXLFNBQVksRUFBRSxRQUFRLGVBQWUsSUFBSSxDQUFDO0NBQzlEO0FBQ0Y7QUFFQSxJQUFNLGtCQUFOLGNBQThCLGVBSzVCO0NBQ0EsY0FBYztFQUNaLE1BQU0sU0FBUyxvQkFBb0Isa0JBQWtCO0NBQ3ZEO0NBRUEsTUFDTSxTQUFtQyxRQUFXLElBQTRDO0VBQzlGLE1BQU0sRUFBRSxTQUFTLE1BQU0sS0FBSyxTQUFTLFFBQVE7R0FBRTtHQUFJLEtBQUs7R0FBRyxNQUFNO0VBQUUsQ0FBQztFQUNwRSxJQUFJLENBQUMsS0FBSyxJQUNSLE1BQU0sSUFBSSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBRXJFLE9BQU8sS0FBSztDQUNkO0NBRUEsTUFBTSxRQUNKLFFBQ0EsWUFDdUM7RUFDdkMsTUFBTSxFQUFFLFNBQVMsTUFBTSxLQUFLLFNBQVMsUUFBUTtHQUFFLEdBQUc7R0FBWSxLQUFLO0dBQUcsTUFBTTtFQUFFLENBQUM7RUFDL0UsT0FBTyxLQUFLLE1BQU07Q0FDcEI7Q0FFQSxNQUNNLFNBQ0osUUFDQSxXQUNnRDtFQUNoRCxNQUFNLFNBQVM7R0FDYixLQUFLO0dBQ0wsTUFBTTtHQUNOLFFBQVE7R0FDUixTQUFTO0dBQ1QsR0FBRztFQUNM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
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { calculateCostUsd } from "../utils/providers/common/model-cost.js";
|
|
2
|
+
//#region src/migrations/20260807133553_manual__backfill_request_log_cost.ts
|
|
3
|
+
const MICRO_USD = 1e6;
|
|
4
|
+
const CHUNK_SIZE = 5e3;
|
|
5
|
+
function isAnthropicRow(row) {
|
|
6
|
+
return row.token_name?.startsWith("anthropic/") === true || row.model_name?.startsWith("claude-") === true || row.model_name?.startsWith("anthropic/claude-") === true;
|
|
7
|
+
}
|
|
8
|
+
function backfilledCostMicroUsd(row) {
|
|
9
|
+
if (!row.model_name) return Math.max(row.cost_usd ?? 0, 0);
|
|
10
|
+
const inputTokens = isAnthropicRow(row) && row.input_tokens < row.cache_read_tokens + row.cache_creation_tokens ? row.input_tokens + row.cache_read_tokens + row.cache_creation_tokens : row.input_tokens;
|
|
11
|
+
const usd = calculateCostUsd(row.model_name.includes("/") ? row.model_name.split("/").pop() : row.model_name, {
|
|
12
|
+
inputTokens,
|
|
13
|
+
outputTokens: row.output_tokens,
|
|
14
|
+
cachedInputTokens: row.cache_read_tokens,
|
|
15
|
+
cacheCreationInputTokens: row.cache_creation_tokens,
|
|
16
|
+
...row.cache_creation_5m_tokens !== null ? { cacheCreationInputTokens5m: row.cache_creation_5m_tokens } : {},
|
|
17
|
+
...row.cache_creation_1h_tokens !== null ? { cacheCreationInputTokens1h: row.cache_creation_1h_tokens } : {}
|
|
18
|
+
});
|
|
19
|
+
return Math.max(Math.round(usd * MICRO_USD), 0);
|
|
20
|
+
}
|
|
21
|
+
async function up(knex) {
|
|
22
|
+
let lastId = 0;
|
|
23
|
+
let processed = 0;
|
|
24
|
+
for (;;) {
|
|
25
|
+
const { rows } = await knex.raw(`SELECT id, token_name, model_name, input_tokens, output_tokens,
|
|
26
|
+
cache_read_tokens, cache_creation_tokens,
|
|
27
|
+
cache_creation_5m_tokens, cache_creation_1h_tokens, cost_usd
|
|
28
|
+
FROM request_logs
|
|
29
|
+
WHERE (cost_source IS NULL OR cost_usd IS NULL) AND id > ?
|
|
30
|
+
ORDER BY id
|
|
31
|
+
LIMIT ?`, [lastId, CHUNK_SIZE]);
|
|
32
|
+
if (rows.length === 0) break;
|
|
33
|
+
const values = rows.map((row) => `(${row.id}, ${backfilledCostMicroUsd(row)})`).join(",");
|
|
34
|
+
await knex.raw(`UPDATE request_logs AS t
|
|
35
|
+
SET cost_usd = v.cost_usd, cost_source = 'backfilled'
|
|
36
|
+
FROM (VALUES ${values}) AS v(id, cost_usd)
|
|
37
|
+
WHERE t.id = v.id`);
|
|
38
|
+
lastId = rows[rows.length - 1].id;
|
|
39
|
+
processed += rows.length;
|
|
40
|
+
}
|
|
41
|
+
console.log(`[backfill] request_logs cost backfilled: ${processed} rows`);
|
|
42
|
+
}
|
|
43
|
+
async function down(knex) {
|
|
44
|
+
await knex.raw(`UPDATE request_logs SET cost_source = NULL WHERE cost_source = 'backfilled'`);
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
export { down, up };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDcxMzM1NTNfbWFudWFsX19iYWNrZmlsbF9yZXF1ZXN0X2xvZ19jb3N0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwODA3MTMzNTUzX21hbnVhbF9fYmFja2ZpbGxfcmVxdWVzdF9sb2dfY29zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGxlZ2FjeSByZXF1ZXN0X2xvZ3Mg7J2YIOu5hOyaqeydhCDtmZXsoJXqsJLsnLzroZwg67Cx7ZWE7ZWc64ukLlxuICpcbiAqIOuwsOqyvTogYGNvc3Rfc291cmNlYCDqsIAg7JeG64qUIHJvdyDripQg7KGw7ZqM7ZWgIOuVjOuniOuLpCDslbHsnbQg7ZiE7J6sIOqwgOqyqe2RnOuhnCDsnqzqs4TsgrDtlbQg7JmU64ukXG4gKiAoYG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvd2ApLiDsnoXroKXsnbQg6rOg7KCV7J206528IOqysOqzvOuPhCDtla3sg4Eg6rCZ7J2A642wLCA5NuunjCDtlokg7YWM7J2067iU7JeQ7IScXG4gKiAyMy4266eMIO2WieydhCDrp6Qg7JqU7LKtIOyVseycvOuhnCDrgYzslrTsmKTripQg67mE7Jqp66eMIOuCqOuKlOuLpC4g7ZWcIOuyiCDqs4TsgrDtlbQg7KCA7J6l7ZWY66m0IOy0neu5hOyaqSDsp5Hqs4TqsIBcbiAqIOuLqOydvCBTUUwgU1VNIOycvOuhnCDrgZ3rgpzri6QuXG4gKlxuICog6rOE7IKw7Iud7J2AIOyVseydmCBgbm9ybWFsaXplZFVzYWdlRm9yQ29zdGAgKyBgY2FsY3VsYXRlQ29zdFVzZGAg66W8IOq3uOuMgOuhnCDsmK7quLQg6rKD7J2064ukLlxuICog65GQIOuhnOyngeydtCDqsIjrnbzsp4DrqbQg67Cx7ZWE65CcIOqwkuqzvCDsi6Dqt5wg7KCA7J6l6rCS7J2YIOq4sOykgOydtCDri6zrnbzsp4Drr4DroZwsIOqwgOqyqe2RnOulvCDrsJTqv4Ag65WM64qUXG4gKiDsnbQg66eI7J206re466CI7J207IWY7J20IOyVhOuLiOudvCDslbEg7L2U65Oc66eMIOuwlOq+uOuptCDrkJzri6Qo7J2066+4IO2ZleygleuQnCDqsJLsnYAg7Jyg7KeA65CY64qUIOqyg+ydtCDqs4Tslb0pLlxuICpcbiAqIOuQmOuPjOumrOq4sDogZG93biDsnYAgYGNvc3Rfc291cmNlPSdiYWNrZmlsbGVkJ2Ag7J24IHJvdyDsnZgg7ZGc7Iud66eMIOygnOqxsO2VtCDsnqzqs4TsgrAg64yA7IOB7Jy866GcXG4gKiDrkJjrj4zrprDri6QuIOybkOuzuCBgY29zdF91c2RgIOuKlCDrs7Xsm5DrkJjsp4Ag7JWK64qU64ukIOKAlCDrkJjrj4zrprQg7IiYIOyXhuuKlCDsk7DquLDri6QuIOuNruydtOuKlCDqsJLsnYBcbiAqIE5VTEwg7J207JeI6rGw64KYLCDsnYzsiJjsmIDqsbDrgpgsIOq1rOuyhOyghCDqsIDqsqntkZzroZwg6rOE7IKw65CcIOqwkuydtOqzoCwg7KGw7ZqMIOqyveuhnOuKlCDsnbTrk6TsnYQg6re464yA66GcXG4gKiDrs7Tsl6zspIAg7KCB7J20IOyXhuuLpCjtla3sg4Eg7ZiE7J6sIOqwgOqyqe2RnOuhnCDsnqzqs4TsgrDtlbQg7ZGc7IucKS4g6re4656Y7IScIO2ZlOuptOyXkCDrs7TsnbTrjZgg7LSd7JWh7J2AXG4gKiDrsLHtlYQg7KCE7ZuE66GcIOuPmeydvO2VmOupsCwg7Iuk7KeIIOyGkOyLpOydgCDsl4bri6QuXG4gKi9cbmltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbi8vIOuniOydtOq3uOugiOydtOyFmCDrn6zrhIjripQgdHNjb25maWcg7J2YIGJ1bmRsZXIg7ZW07ISd7J2EIOyTsOyngCDslYrripQg7Iic7IiYIEVTTSDroZzrjZTrnbwg7ZmV7J6l7J6Q6rCAIO2VhOyalO2VmOuLpC5cbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LmpzXCI7XG5cbmNvbnN0IE1JQ1JPX1VTRCA9IDFfMDAwXzAwMDtcbmNvbnN0IENIVU5LX1NJWkUgPSA1XzAwMDtcblxudHlwZSBMZWdhY3lSb3cgPSB7XG4gIGlkOiBudW1iZXI7XG4gIHRva2VuX25hbWU6IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IG51bWJlciB8IG51bGw7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q6IG51bWJlciB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1Jvdyhyb3c6IExlZ2FjeVJvdyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHJvdy50b2tlbl9uYW1lPy5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKSA9PT0gdHJ1ZSB8fFxuICAgIHJvdy5tb2RlbF9uYW1lPy5zdGFydHNXaXRoKFwiY2xhdWRlLVwiKSA9PT0gdHJ1ZSB8fFxuICAgIHJvdy5tb2RlbF9uYW1lPy5zdGFydHNXaXRoKFwiYW50aHJvcGljL2NsYXVkZS1cIikgPT09IHRydWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gYmFja2ZpbGxlZENvc3RNaWNyb1VzZChyb3c6IExlZ2FjeVJvdyk6IG51bWJlciB7XG4gIGlmICghcm93Lm1vZGVsX25hbWUpIHJldHVybiBNYXRoLm1heChyb3cuY29zdF91c2QgPz8gMCwgMCk7XG5cbiAgLy8gQW50aHJvcGljIOydgCBpbnB1dC9jYWNoZV9yZWFkL2NhY2hlX2NyZWF0aW9uIOydhCDsg4HtmLgg67Cw7YOA7KCB7Jy866GcIOuztOqzoO2VnOuLpC4g6rO86rGwIOyggOyepSDqsr3roZzqsIBcbiAgLy8g7J2066W8IO2Vqey5mOyngCDslYrslYQgaW5wdXRfdG9rZW5zIOqwgCDsnpHqsowg64Ko7J2AIHJvdyDrpbwg67O17JuQ7ZWc64ukLlxuICBjb25zdCBzcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1Jvdyhyb3cpICYmIHJvdy5pbnB1dF90b2tlbnMgPCByb3cuY2FjaGVfcmVhZF90b2tlbnMgKyByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zO1xuICBjb25zdCBpbnB1dFRva2VucyA9IHNwbGl0SW5wdXRcbiAgICA/IHJvdy5pbnB1dF90b2tlbnMgKyByb3cuY2FjaGVfcmVhZF90b2tlbnMgKyByb3cuY2FjaGVfY3JlYXRpb25fdG9rZW5zXG4gICAgOiByb3cuaW5wdXRfdG9rZW5zO1xuXG4gIGNvbnN0IG1vZGVsID0gcm93Lm1vZGVsX25hbWUuaW5jbHVkZXMoXCIvXCIpID8gcm93Lm1vZGVsX25hbWUuc3BsaXQoXCIvXCIpLnBvcCgpISA6IHJvdy5tb2RlbF9uYW1lO1xuICBjb25zdCB1c2QgPSBjYWxjdWxhdGVDb3N0VXNkKG1vZGVsLCB7XG4gICAgaW5wdXRUb2tlbnMsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2Vuczogcm93LmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2Vuczogcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbFxuICAgICAgPyB7IGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihyb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSBudWxsXG4gICAgICA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJvdy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgfVxuICAgICAgOiB7fSksXG4gIH0pO1xuICByZXR1cm4gTWF0aC5tYXgoTWF0aC5yb3VuZCh1c2QgKiBNSUNST19VU0QpLCAwKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGxhc3RJZCA9IDA7XG4gIGxldCBwcm9jZXNzZWQgPSAwO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IGtuZXgucmF3PHsgcm93czogTGVnYWN5Um93W10gfT4oXG4gICAgICBgU0VMRUNUIGlkLCB0b2tlbl9uYW1lLCBtb2RlbF9uYW1lLCBpbnB1dF90b2tlbnMsIG91dHB1dF90b2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zLCBjYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucywgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLCBjb3N0X3VzZFxuICAgICAgICAgRlJPTSByZXF1ZXN0X2xvZ3NcbiAgICAgICAgV0hFUkUgKGNvc3Rfc291cmNlIElTIE5VTEwgT1IgY29zdF91c2QgSVMgTlVMTCkgQU5EIGlkID4gP1xuICAgICAgICBPUkRFUiBCWSBpZFxuICAgICAgICBMSU1JVCA/YCxcbiAgICAgIFtsYXN0SWQsIENIVU5LX1NJWkVdLFxuICAgICk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSBicmVhaztcblxuICAgIC8vIGNodW5rIOuLuSDtlZwg67KI7J2YIFVQREFURSAuLi4gRlJPTSAoVkFMVUVTIC4uLikg66GcIOyZleuzteydhCDspITsnbjri6QuXG4gICAgY29uc3QgdmFsdWVzID0gcm93cy5tYXAoKHJvdykgPT4gYCgke3Jvdy5pZH0sICR7YmFja2ZpbGxlZENvc3RNaWNyb1VzZChyb3cpfSlgKS5qb2luKFwiLFwiKTtcbiAgICBhd2FpdCBrbmV4LnJhdyhcbiAgICAgIGBVUERBVEUgcmVxdWVzdF9sb2dzIEFTIHRcbiAgICAgICAgICBTRVQgY29zdF91c2QgPSB2LmNvc3RfdXNkLCBjb3N0X3NvdXJjZSA9ICdiYWNrZmlsbGVkJ1xuICAgICAgICAgRlJPTSAoVkFMVUVTICR7dmFsdWVzfSkgQVMgdihpZCwgY29zdF91c2QpXG4gICAgICAgIFdIRVJFIHQuaWQgPSB2LmlkYCxcbiAgICApO1xuXG4gICAgbGFzdElkID0gcm93c1tyb3dzLmxlbmd0aCAtIDFdIS5pZDtcbiAgICBwcm9jZXNzZWQgKz0gcm93cy5sZW5ndGg7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgW2JhY2tmaWxsXSByZXF1ZXN0X2xvZ3MgY29zdCBiYWNrZmlsbGVkOiAke3Byb2Nlc3NlZH0gcm93c2ApO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bihrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KGBVUERBVEUgcmVxdWVzdF9sb2dzIFNFVCBjb3N0X3NvdXJjZSA9IE5VTEwgV0hFUkUgY29zdF9zb3VyY2UgPSAnYmFja2ZpbGxlZCdgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUF1QkEsTUFBTSxZQUFZO0FBQ2xCLE1BQU0sYUFBYTtBQWVuQixTQUFTLGVBQWUsS0FBeUI7Q0FDL0MsT0FDRSxJQUFJLFlBQVksV0FBVyxZQUFZLE1BQU0sUUFDN0MsSUFBSSxZQUFZLFdBQVcsU0FBUyxNQUFNLFFBQzFDLElBQUksWUFBWSxXQUFXLG1CQUFtQixNQUFNO0FBRXhEO0FBRUEsU0FBUyx1QkFBdUIsS0FBd0I7Q0FDdEQsSUFBSSxDQUFDLElBQUksWUFBWSxPQUFPLEtBQUssSUFBSSxJQUFJLFlBQVksR0FBRyxDQUFDO0NBTXpELE1BQU0sY0FESixlQUFlLEdBQUcsS0FBSyxJQUFJLGVBQWUsSUFBSSxvQkFBb0IsSUFBSSx3QkFFcEUsSUFBSSxlQUFlLElBQUksb0JBQW9CLElBQUksd0JBQy9DLElBQUk7Q0FHUixNQUFNLE1BQU0saUJBREUsSUFBSSxXQUFXLFNBQVMsR0FBRyxJQUFJLElBQUksV0FBVyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSyxJQUFJLFlBQ2hEO0VBQ2xDO0VBQ0EsY0FBYyxJQUFJO0VBQ2xCLG1CQUFtQixJQUFJO0VBQ3ZCLDBCQUEwQixJQUFJO0VBQzlCLEdBQUksSUFBSSw2QkFBNkIsT0FDakMsRUFBRSw0QkFBNEIsSUFBSSx5QkFBeUIsSUFDM0QsQ0FBQztFQUNMLEdBQUksSUFBSSw2QkFBNkIsT0FDakMsRUFBRSw0QkFBNEIsSUFBSSx5QkFBeUIsSUFDM0QsQ0FBQztDQUNQLENBQUM7Q0FDRCxPQUFPLEtBQUssSUFBSSxLQUFLLE1BQU0sTUFBTSxTQUFTLEdBQUcsQ0FBQztBQUNoRDtBQUVBLGVBQXNCLEdBQUcsTUFBMkI7Q0FDbEQsSUFBSSxTQUFTO0NBQ2IsSUFBSSxZQUFZO0NBRWhCLFNBQVM7RUFDUCxNQUFNLEVBQUUsU0FBUyxNQUFNLEtBQUssSUFDMUI7Ozs7OztrQkFPQSxDQUFDLFFBQVEsVUFBVSxDQUNyQjtFQUNBLElBQUksS0FBSyxXQUFXLEdBQUc7RUFHdkIsTUFBTSxTQUFTLEtBQUssS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLElBQUksdUJBQXVCLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUc7RUFDeEYsTUFBTSxLQUFLLElBQ1Q7O3dCQUVrQixPQUFPOzBCQUUzQjtFQUVBLFNBQVMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFFO0VBQ2hDLGFBQWEsS0FBSztDQUNwQjtDQUVBLFFBQVEsSUFBSSw0Q0FBNEMsVUFBVSxNQUFNO0FBQzFFO0FBRUEsZUFBc0IsS0FBSyxNQUEyQjtDQUNwRCxNQUFNLEtBQUssSUFBSSw2RUFBNkU7QUFDOUYifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/migrations/20260807145144_alter_request_logs_alter1.ts
|
|
2
|
+
async function up(knex) {
|
|
3
|
+
await knex.raw(`CREATE INDEX request_logs_project_name_cost_usd_index ON request_logs USING btree(project_name ASC NULLS LAST, cost_usd ASC NULLS LAST);`);
|
|
4
|
+
}
|
|
5
|
+
async function down(knex) {
|
|
6
|
+
await knex.schema.alterTable("request_logs", (table) => {
|
|
7
|
+
table.dropIndex(["project_name", "cost_usd"], "request_logs_project_name_cost_usd_index");
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { down, up };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MDcxNDUxNDRfYWx0ZXJfcmVxdWVzdF9sb2dzX2FsdGVyMS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWlncmF0aW9ucy8yMDI2MDgwNzE0NTE0NF9hbHRlcl9yZXF1ZXN0X2xvZ3NfYWx0ZXIxLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cChrbmV4OiBLbmV4KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGtuZXgucmF3KFxuICAgIGBDUkVBVEUgSU5ERVggcmVxdWVzdF9sb2dzX3Byb2plY3RfbmFtZV9jb3N0X3VzZF9pbmRleCBPTiByZXF1ZXN0X2xvZ3MgVVNJTkcgYnRyZWUocHJvamVjdF9uYW1lIEFTQyBOVUxMUyBMQVNULCBjb3N0X3VzZCBBU0MgTlVMTFMgTEFTVCk7YCxcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd24oa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwicmVxdWVzdF9sb2dzXCIsICh0YWJsZSkgPT4ge1xuICAgIHRhYmxlLmRyb3BJbmRleChbXCJwcm9qZWN0X25hbWVcIiwgXCJjb3N0X3VzZFwiXSwgXCJyZXF1ZXN0X2xvZ3NfcHJvamVjdF9uYW1lX2Nvc3RfdXNkX2luZGV4XCIpO1xuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUVBLGVBQXNCLEdBQUcsTUFBMkI7Q0FDbEQsTUFBTSxLQUFLLElBQ1QsMElBQ0Y7QUFDRjtBQUVBLGVBQXNCLEtBQUssTUFBMkI7Q0FDcEQsTUFBTSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsVUFBVTtFQUN0RCxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsVUFBVSxHQUFHLDBDQUEwQztDQUMxRixDQUFDO0FBQ0gifQ==
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { TokenModel } from "../../../application/token/token.model.js";
|
|
2
|
+
import { deactivateAuthDeadToken } from "../../../application/qgrid/token-death.js";
|
|
2
3
|
import { OPENAI_CLIENT_ID, OPENAI_TOKEN_URL } from "./openai-constants.js";
|
|
3
4
|
import { getLogger } from "@logtape/logtape";
|
|
4
5
|
//#region src/utils/providers/openai/openai-refresh.ts
|
|
@@ -11,6 +12,11 @@ import { getLogger } from "@logtape/logtape";
|
|
|
11
12
|
* - rotation 감지: 새 refresh_token 있으면 DB 즉시 업데이트
|
|
12
13
|
*/
|
|
13
14
|
const logger = getLogger(["qgrid", "openai-refresh"]);
|
|
15
|
+
const PERMANENT_FAILURE_CODES = /* @__PURE__ */ new Set([
|
|
16
|
+
"refresh_token_expired",
|
|
17
|
+
"refresh_token_reused",
|
|
18
|
+
"refresh_token_invalidated"
|
|
19
|
+
]);
|
|
14
20
|
const inflightRefresh = /* @__PURE__ */ new Map();
|
|
15
21
|
const lastRefreshTime = /* @__PURE__ */ new Map();
|
|
16
22
|
const REFRESH_MIN_INTERVAL_MS = 5e3;
|
|
@@ -67,6 +73,11 @@ async function doRefresh(tokenId) {
|
|
|
67
73
|
errorCode = JSON.parse(body).error;
|
|
68
74
|
} catch {}
|
|
69
75
|
logger.error(`OpenAI refresh FAILED token=${token.name}(id=${tokenId}) status=${resp.status} code=${errorCode ?? "?"} body=${body}`);
|
|
76
|
+
if (errorCode && PERMANENT_FAILURE_CODES.has(errorCode)) await deactivateAuthDeadToken({
|
|
77
|
+
id: tokenId,
|
|
78
|
+
name: token.name,
|
|
79
|
+
provider: "openai"
|
|
80
|
+
}, creds.refreshToken, `openai:${errorCode}`);
|
|
70
81
|
throw new Error(`OpenAI refresh failed: ${resp.status} ${body}`);
|
|
71
82
|
}
|
|
72
83
|
const data = await resp.json();
|
|
@@ -101,4 +112,4 @@ async function doRefresh(tokenId) {
|
|
|
101
112
|
//#endregion
|
|
102
113
|
export { handleChatgptAuthTokensRefresh };
|
|
103
114
|
|
|
104
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlZnJlc2guanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLXJlZnJlc2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUkgY2hhdGdwdEF1dGhUb2tlbnMgcmVmcmVzaCBoYW5kbGVyLlxuICpcbiAqIC0gY29kZXggYXBwLXNlcnZlciDqsIAgNDAxIOuwm+ycvOuptCBgYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoYCBzZXJ2ZXItcmVxdWVzdCDrpbwg67O064OEXG4gKiAtIHFncmlkIOqwgCBEQiDsnZggcmVmcmVzaF90b2tlbiDsnLzroZwg7IOIIGFjY2Vzc190b2tlbiDsnYQg67Cc6riJ67Cb7JWEIOydkeuLtVxuICogLSBwZXItdG9rZW4gaW5mbGlnaHQgcHJvbWlzZSDroZwgY29uY3VycmVudCByZWZyZXNoIGRlZHVwXG4gKiAtIHJvdGF0aW9uIOqwkOyngDog7IOIIHJlZnJlc2hfdG9rZW4g7J6I7Jy866m0IERCIOymieyLnCDsl4XrjbDsnbTtirhcbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBPcGVuQUlDcmVkZW50aWFscyB9IGZyb20gXCIuLi8uLi8uLi9hcHBsaWNhdGlvbi90b2tlbi90b2tlbi50eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktcmVmcmVzaFwiXSk7XG5cbmltcG9ydCB7IE9QRU5BSV9DTElFTlRfSUQsIE9QRU5BSV9UT0tFTl9VUkwgfSBmcm9tIFwiLi9vcGVuYWktY29uc3RhbnRzXCI7XG5cbi8vIHBlci10b2tlbiBpbmZsaWdodCBwcm9taXNlIGRlZHVwICsgbWluaW11bSBpbnRlcnZhbFxuY29uc3QgaW5mbGlnaHRSZWZyZXNoID0gbmV3IE1hcDxudW1iZXIsIFByb21pc2U8UmVmcmVzaFJlc3VsdD4+KCk7XG5jb25zdCBsYXN0UmVmcmVzaFRpbWUgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuY29uc3QgUkVGUkVTSF9NSU5fSU5URVJWQUxfTVMgPSA1XzAwMDtcblxuaW50ZXJmYWNlIFJlZnJlc2hSZXN1bHQge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBjaGF0Z3B0QWNjb3VudElkOiBzdHJpbmc7XG4gIGNoYXRncHRQbGFuVHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgbG9nZ2VyLmluZm8oYHJlZnJlc2ggcmVxdWVzdGVkIGZvciB0b2tlbiAke3Rva2VuSWR9IChwaWQ9JHtwcm9jZXNzLnBpZH0pYCk7XG4gIGNvbnN0IGV4aXN0aW5nID0gaW5mbGlnaHRSZWZyZXNoLmdldCh0b2tlbklkKTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgbG9nZ2VyLmluZm8oYHJlZnJlc2ggZGVkdXAgZm9yIHRva2VuICR7dG9rZW5JZH1gKTtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICBjb25zdCBsYXN0QXQgPSBsYXN0UmVmcmVzaFRpbWUuZ2V0KHRva2VuSWQpID8/IDA7XG4gIGlmIChEYXRlLm5vdygpIC0gbGFzdEF0IDwgUkVGUkVTSF9NSU5fSU5URVJWQUxfTVMpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaCB0b28gc29vbiBmb3IgdG9rZW4gJHt0b2tlbklkfSwgcmVhZGluZyBjdXJyZW50IGNyZWRzIGZyb20gREJgKTtcbiAgICByZXR1cm4gcmVhZEN1cnJlbnRDcmVkcyh0b2tlbklkKTtcbiAgfVxuXG4gIGxhc3RSZWZyZXNoVGltZS5zZXQodG9rZW5JZCwgRGF0ZS5ub3coKSk7XG4gIGNvbnN0IHByb21pc2UgPSBkb1JlZnJlc2godG9rZW5JZCk7XG4gIGluZmxpZ2h0UmVmcmVzaC5zZXQodG9rZW5JZCwgcHJvbWlzZSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpbmZsaWdodFJlZnJlc2guZGVsZXRlKHRva2VuSWQpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDdXJyZW50Q3JlZHModG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxSZWZyZXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiB0b2tlbklkIH0pO1xuICBpZiAoIXRva2VuIHx8IHRva2VuLnByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB0aHJvdyBuZXcgRXJyb3IoYHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kYCk7XG4gIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHM7XG4gIHJldHVybiB7XG4gICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgIGNoYXRncHRBY2NvdW50SWQ6IGNyZWRzLmFjY291bnRJZCxcbiAgICBjaGF0Z3B0UGxhblR5cGU6IGNyZWRzLnBsYW5UeXBlLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb1JlZnJlc2godG9rZW5JZDogbnVtYmVyKTogUHJvbWlzZTxSZWZyZXNoUmVzdWx0PiB7XG4gIGNvbnN0IHRva2VuID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkOiB0b2tlbklkIH0pO1xuICBpZiAoIXRva2VuIHx8IHRva2VuLnByb3ZpZGVyICE9PSBcIm9wZW5haVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbiAke3Rva2VuSWR9IG5vdCBmb3VuZCBvciBub3Qgb3BlbmFpYCk7XG4gIH1cblxuICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzIGFzIE9wZW5BSUNyZWRlbnRpYWxzO1xuICBpZiAoIWNyZWRzLnJlZnJlc2hUb2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgdG9rZW4gJHt0b2tlbklkfSBoYXMgbm8gcmVmcmVzaFRva2VuYCk7XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgcmVmcmVzaGluZyB0b2tlbiAke3Rva2VuLm5hbWV9IChpZD0ke3Rva2VuSWR9KWApO1xuXG4gIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaChPUEVOQUlfVE9LRU5fVVJMLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgfSxcbiAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGdyYW50X3R5cGU6IFwicmVmcmVzaF90b2tlblwiLFxuICAgICAgY2xpZW50X2lkOiBPUEVOQUlfQ0xJRU5UX0lELFxuICAgICAgcmVmcmVzaF90b2tlbjogY3JlZHMucmVmcmVzaFRva2VuLFxuICAgIH0pLFxuICB9KTtcblxuICBpZiAoIXJlc3Aub2spIHtcbiAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gICAgLy8gNDAxIOuzuOusuOydmCBlcnJvciDsvZTrk5zqsIAg7Yag7YGwIOyCrOunneydmCDqsrDsoJXsoIEg7IKs7J247J2064ukLlxuICAgIC8vICAgcmVmcmVzaF90b2tlbl9leHBpcmVkICAgICDihpIgcmVmcmVzaF90b2tlbiDsnpDssrQg66eM66OMXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX3JldXNlZCAgICAgIOKGkiDsnbTrr7gg7IKs7Jqp65CcKO2ajOyghCDtj5DquLDrkJwpIHJlZnJlc2hfdG9rZW4g7J6s7IKs7JqpIOKGkiDtjKjrsIDrpqwg66y07Zqo7ZmUXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX2ludmFsaWRhdGVkIOKGkiDshJzrsoTsuKEgcmV2b2tlXG4gICAgLy8g7JyEIDPqsJzripQg66qo65GQIOyYgeq1rCDsi6TtjKguIOyerOuTseuhnSDsmbgg67O16rWsIOu2iOqwgC5cbiAgICBsZXQgZXJyb3JDb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGVycm9yQ29kZSA9IChKU09OLnBhcnNlKGJvZHkpIGFzIHsgZXJyb3I/OiBzdHJpbmcgfSkuZXJyb3I7XG4gICAgfSBjYXRjaCB7fVxuICAgIGxvZ2dlci5lcnJvcihcbiAgICAgIGBPcGVuQUkgcmVmcmVzaCBGQUlMRUQgdG9rZW49JHt0b2tlbi5uYW1lfShpZD0ke3Rva2VuSWR9KSBzdGF0dXM9JHtyZXNwLnN0YXR1c30gYCArXG4gICAgICAgIGBjb2RlPSR7ZXJyb3JDb2RlID8/IFwiP1wifSBib2R5PSR7Ym9keX1gLFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgcmVmcmVzaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICR7Ym9keX1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW4/OiBudW1iZXI7XG4gICAgaWRfdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3QgbmV3UmVmcmVzaFRva2VuID0gZGF0YS5yZWZyZXNoX3Rva2VuID8/IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgY29uc3Qgcm90YXRlZCA9XG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSBudWxsICYmXG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSB1bmRlZmluZWQgJiZcbiAgICBkYXRhLnJlZnJlc2hfdG9rZW4gIT09IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgaWYgKHJvdGF0ZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaF90b2tlbiByb3RhdGVkIGZvciB0b2tlbiAke3Rva2VuLm5hbWV9YCk7XG4gIH1cblxuICBjb25zdCB1cGRhdGVkQ3JlZHM6IE9wZW5BSUNyZWRlbnRpYWxzID0ge1xuICAgIC4uLmNyZWRzLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbixcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogZGF0YS5leHBpcmVzX2luXG4gICAgICA/IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwXG4gICAgICA6IGNyZWRzLmFjY2Vzc1Rva2VuRXhwaXJlc0F0LFxuICAgIC4uLihkYXRhLmlkX3Rva2VuID8geyBpZFRva2VuOiBkYXRhLmlkX3Rva2VuIH0gOiB7fSksXG4gIH07XG5cbiAgLy8g7ZqM7KCEKHJvdGF0ZWQp7J20IOydvOyWtOuCrOuKlOuNsCDsnbQgc2F2ZSDqsIAg7Iuk7Yyo7ZWY66m0LCBPcGVuQUkg7Kq9IOyYmyByZWZyZXNoX3Rva2VuIOydgCDsnbTrr7hcbiAgLy8g7Y+Q6riw65CcIOyDge2DnOyXkOyEnCBEQiDsl5DripQg7JibIO2GoO2BsOydtCDrgqjripTri6Qg4oaSIOuLpOydjCByZWZyZXNoIOqwgCByZWZyZXNoX3Rva2VuX3JldXNlZCDroZxcbiAgLy8g7JiB6rWsIOyCrOunnS4g7J20IOq1rOqwhCDsi6TtjKjripQg7Yag7YGwIOyCrOunneydmCDsp4HsoJEg7JuQ7J247J2066+A66GcIOuwmOuTnOyLnCDtgazqsowg64Ko6ri064ukLlxuICB0cnkge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbklkLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWRDcmVkcyxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgT3BlbkFJIHJlZnJlc2g6IERCIHNhdmUgRkFJTEVEIGFmdGVyIHJvdGF0aW9uKHJvdGF0ZWQ9JHtyb3RhdGVkfSkgYCArXG4gICAgICAgIGB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIOKAlCDsmJsgcmVmcmVzaF90b2tlbiDtj5DquLDrkKgsIERCIOuvuOuwmOyYgSDihpIg7Yag7YGwIOyCrOunnSDsnITtl5guIGVycj0ke1N0cmluZyhlKX1gLFxuICAgICk7XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGB0b2tlbiAke3Rva2VuLm5hbWV9IHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgKHJvdGF0ZWQ9JHtyb3RhdGVkfSlgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICBjaGF0Z3B0QWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgY2hhdGdwdFBsYW5UeXBlOiBjcmVkcy5wbGFuVHlwZSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBYUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGdCQUFnQixDQUFDO0FBS3BELE1BQU0sa0NBQWtCLElBQUksSUFBb0M7QUFDaEUsTUFBTSxrQ0FBa0IsSUFBSSxJQUFvQjtBQUNoRCxNQUFNLDBCQUEwQjtBQVFoQyxlQUFzQiwrQkFBK0IsU0FBeUM7Q0FDNUYsT0FBTyxLQUFLLCtCQUErQixRQUFRLFFBQVEsUUFBUSxJQUFJLEVBQUU7Q0FDekUsTUFBTSxXQUFXLGdCQUFnQixJQUFJLE9BQU87Q0FDNUMsSUFBSSxVQUFVO0VBQ1osT0FBTyxLQUFLLDJCQUEyQixTQUFTO0VBQ2hELE9BQU87Q0FDVDtDQUVBLE1BQU0sU0FBUyxnQkFBZ0IsSUFBSSxPQUFPLEtBQUs7Q0FDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxTQUFTLHlCQUF5QjtFQUNqRCxPQUFPLEtBQUssOEJBQThCLFFBQVEs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
|
|
115
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXJlZnJlc2guanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLXJlZnJlc2gudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuQUkgY2hhdGdwdEF1dGhUb2tlbnMgcmVmcmVzaCBoYW5kbGVyLlxuICpcbiAqIC0gY29kZXggYXBwLXNlcnZlciDqsIAgNDAxIOuwm+ycvOuptCBgYWNjb3VudC9jaGF0Z3B0QXV0aFRva2Vucy9yZWZyZXNoYCBzZXJ2ZXItcmVxdWVzdCDrpbwg67O064OEXG4gKiAtIHFncmlkIOqwgCBEQiDsnZggcmVmcmVzaF90b2tlbiDsnLzroZwg7IOIIGFjY2Vzc190b2tlbiDsnYQg67Cc6riJ67Cb7JWEIOydkeuLtVxuICogLSBwZXItdG9rZW4gaW5mbGlnaHQgcHJvbWlzZSDroZwgY29uY3VycmVudCByZWZyZXNoIGRlZHVwXG4gKiAtIHJvdGF0aW9uIOqwkOyngDog7IOIIHJlZnJlc2hfdG9rZW4g7J6I7Jy866m0IERCIOymieyLnCDsl4XrjbDsnbTtirhcbiAqL1xuaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4gfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tZGVhdGhcIjtcbmltcG9ydCB7IFRva2VuTW9kZWwgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4ubW9kZWxcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJQ3JlZGVudGlhbHMgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCIsIFwib3BlbmFpLXJlZnJlc2hcIl0pO1xuXG5pbXBvcnQgeyBPUEVOQUlfQ0xJRU5UX0lELCBPUEVOQUlfVE9LRU5fVVJMIH0gZnJvbSBcIi4vb3BlbmFpLWNvbnN0YW50c1wiO1xuXG4vLyDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwgcmVmcmVzaCDsi6TtjKgg7L2U65OcLiDslrTripAg6rKD7J2065OgIO2GoO2BsOydtCDso73sl4jri6TripQg7ZmV7KCVIOyLoO2YuOuLpC5cbmNvbnN0IFBFUk1BTkVOVF9GQUlMVVJFX0NPREVTID0gbmV3IFNldChbXG4gIFwicmVmcmVzaF90b2tlbl9leHBpcmVkXCIsXG4gIFwicmVmcmVzaF90b2tlbl9yZXVzZWRcIixcbiAgXCJyZWZyZXNoX3Rva2VuX2ludmFsaWRhdGVkXCIsXG5dKTtcblxuLy8gcGVyLXRva2VuIGluZmxpZ2h0IHByb21pc2UgZGVkdXAgKyBtaW5pbXVtIGludGVydmFsXG5jb25zdCBpbmZsaWdodFJlZnJlc2ggPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxSZWZyZXNoUmVzdWx0Pj4oKTtcbmNvbnN0IGxhc3RSZWZyZXNoVGltZSA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5jb25zdCBSRUZSRVNIX01JTl9JTlRFUlZBTF9NUyA9IDVfMDAwO1xuXG5pbnRlcmZhY2UgUmVmcmVzaFJlc3VsdCB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGNoYXRncHRBY2NvdW50SWQ6IHN0cmluZztcbiAgY2hhdGdwdFBsYW5UeXBlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoKHRva2VuSWQ6IG51bWJlcik6IFByb21pc2U8UmVmcmVzaFJlc3VsdD4ge1xuICBsb2dnZXIuaW5mbyhgcmVmcmVzaCByZXF1ZXN0ZWQgZm9yIHRva2VuICR7dG9rZW5JZH0gKHBpZD0ke3Byb2Nlc3MucGlkfSlgKTtcbiAgY29uc3QgZXhpc3RpbmcgPSBpbmZsaWdodFJlZnJlc2guZ2V0KHRva2VuSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaCBkZWR1cCBmb3IgdG9rZW4gJHt0b2tlbklkfWApO1xuICAgIHJldHVybiBleGlzdGluZztcbiAgfVxuXG4gIGNvbnN0IGxhc3RBdCA9IGxhc3RSZWZyZXNoVGltZS5nZXQodG9rZW5JZCkgPz8gMDtcbiAgaWYgKERhdGUubm93KCkgLSBsYXN0QXQgPCBSRUZSRVNIX01JTl9JTlRFUlZBTF9NUykge1xuICAgIGxvZ2dlci5pbmZvKGByZWZyZXNoIHRvbyBzb29uIGZvciB0b2tlbiAke3Rva2VuSWR9LCByZWFkaW5nIGN1cnJlbnQgY3JlZHMgZnJvbSBEQmApO1xuICAgIHJldHVybiByZWFkQ3VycmVudENyZWRzKHRva2VuSWQpO1xuICB9XG5cbiAgbGFzdFJlZnJlc2hUaW1lLnNldCh0b2tlbklkLCBEYXRlLm5vdygpKTtcbiAgY29uc3QgcHJvbWlzZSA9IGRvUmVmcmVzaCh0b2tlbklkKTtcbiAgaW5mbGlnaHRSZWZyZXNoLnNldCh0b2tlbklkLCBwcm9taXNlKTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGZpbmFsbHkge1xuICAgIGluZmxpZ2h0UmVmcmVzaC5kZWxldGUodG9rZW5JZCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEN1cnJlbnRDcmVkcyh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHRva2VuSWQgfSk7XG4gIGlmICghdG9rZW4gfHwgdG9rZW4ucHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHRocm93IG5ldyBFcnJvcihgdG9rZW4gJHt0b2tlbklkfSBub3QgZm91bmRgKTtcbiAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscztcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogY3JlZHMuYWNjZXNzVG9rZW4sXG4gICAgY2hhdGdwdEFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgIGNoYXRncHRQbGFuVHlwZTogY3JlZHMucGxhblR5cGUsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRvUmVmcmVzaCh0b2tlbklkOiBudW1iZXIpOiBQcm9taXNlPFJlZnJlc2hSZXN1bHQ+IHtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQ6IHRva2VuSWQgfSk7XG4gIGlmICghdG9rZW4gfHwgdG9rZW4ucHJvdmlkZXIgIT09IFwib3BlbmFpXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kIG9yIG5vdCBvcGVuYWlgKTtcbiAgfVxuXG4gIGNvbnN0IGNyZWRzID0gdG9rZW4uY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHM7XG4gIGlmICghY3JlZHMucmVmcmVzaFRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0b2tlbiAke3Rva2VuSWR9IGhhcyBubyByZWZyZXNoVG9rZW5gKTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGByZWZyZXNoaW5nIHRva2VuICR7dG9rZW4ubmFtZX0gKGlkPSR7dG9rZW5JZH0pYCk7XG5cbiAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKE9QRU5BSV9UT0tFTl9VUkwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiB9LFxuICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgZ3JhbnRfdHlwZTogXCJyZWZyZXNoX3Rva2VuXCIsXG4gICAgICBjbGllbnRfaWQ6IE9QRU5BSV9DTElFTlRfSUQsXG4gICAgICByZWZyZXNoX3Rva2VuOiBjcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzcC5vaykge1xuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLnRleHQoKS5jYXRjaCgoKSA9PiBcIlwiKTtcbiAgICAvLyA0MDEg67O466y47J2YIGVycm9yIOy9lOuTnOqwgCDthqDtgbAg7IKs66ed7J2YIOqysOygleyggSDsgqzsnbjsnbTri6QuXG4gICAgLy8gICByZWZyZXNoX3Rva2VuX2V4cGlyZWQgICAgIOKGkiByZWZyZXNoX3Rva2VuIOyekOyytCDrp4zro4xcbiAgICAvLyAgIHJlZnJlc2hfdG9rZW5fcmV1c2VkICAgICAg4oaSIOydtOuvuCDsgqzsmqnrkJwo7ZqM7KCEIO2PkOq4sOuQnCkgcmVmcmVzaF90b2tlbiDsnqzsgqzsmqkg4oaSIO2MqOuwgOumrCDrrLTtmqjtmZRcbiAgICAvLyAgIHJlZnJlc2hfdG9rZW5faW52YWxpZGF0ZWQg4oaSIOyEnOuyhOy4oSByZXZva2VcbiAgICAvLyDsnIQgM+qwnOuKlCDrqqjrkZAg7JiB6rWsIOyLpO2MqC4g7J6s65Ox66GdIOyZuCDrs7Xqtawg67aI6rCALlxuICAgIGxldCBlcnJvckNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgZXJyb3JDb2RlID0gKEpTT04ucGFyc2UoYm9keSkgYXMgeyBlcnJvcj86IHN0cmluZyB9KS5lcnJvcjtcbiAgICB9IGNhdGNoIHt9XG4gICAgbG9nZ2VyLmVycm9yKFxuICAgICAgYE9wZW5BSSByZWZyZXNoIEZBSUxFRCB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIHN0YXR1cz0ke3Jlc3Auc3RhdHVzfSBgICtcbiAgICAgICAgYGNvZGU9JHtlcnJvckNvZGUgPz8gXCI/XCJ9IGJvZHk9JHtib2R5fWAsXG4gICAgKTtcbiAgICAvLyDsmIHqtawg7Iuk7Yyo64qUIGVycm9yQ29kZSDroZzrp4wg7YyQ7KCV7ZWc64ukIOKAlCBzdGF0dXMg66W8IO2VqOq7mCDsmpTqtaztlZjrqbQgcHJvdmlkZXIg6rCAXG4gICAgLy8g7IOB7YOc7L2U65Oc66W8IOuwlOq/gCDrlYwg7YyQ7KCV7J20IOyhsOyaqe2eiCDrqY7ripTri6QuXG4gICAgaWYgKGVycm9yQ29kZSAmJiBQRVJNQU5FTlRfRkFJTFVSRV9DT0RFUy5oYXMoZXJyb3JDb2RlKSkge1xuICAgICAgYXdhaXQgZGVhY3RpdmF0ZUF1dGhEZWFkVG9rZW4oXG4gICAgICAgIHsgaWQ6IHRva2VuSWQsIG5hbWU6IHRva2VuLm5hbWUsIHByb3ZpZGVyOiBcIm9wZW5haVwiIH0sXG4gICAgICAgIGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgYG9wZW5haToke2Vycm9yQ29kZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPcGVuQUkgcmVmcmVzaCBmYWlsZWQ6ICR7cmVzcC5zdGF0dXN9ICR7Ym9keX1gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzcC5qc29uKCkpIGFzIHtcbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICByZWZyZXNoX3Rva2VuPzogc3RyaW5nO1xuICAgIGV4cGlyZXNfaW4/OiBudW1iZXI7XG4gICAgaWRfdG9rZW4/OiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3QgbmV3UmVmcmVzaFRva2VuID0gZGF0YS5yZWZyZXNoX3Rva2VuID8/IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgY29uc3Qgcm90YXRlZCA9XG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSBudWxsICYmXG4gICAgZGF0YS5yZWZyZXNoX3Rva2VuICE9PSB1bmRlZmluZWQgJiZcbiAgICBkYXRhLnJlZnJlc2hfdG9rZW4gIT09IGNyZWRzLnJlZnJlc2hUb2tlbjtcbiAgaWYgKHJvdGF0ZWQpIHtcbiAgICBsb2dnZXIuaW5mbyhgcmVmcmVzaF90b2tlbiByb3RhdGVkIGZvciB0b2tlbiAke3Rva2VuLm5hbWV9YCk7XG4gIH1cblxuICBjb25zdCB1cGRhdGVkQ3JlZHM6IE9wZW5BSUNyZWRlbnRpYWxzID0ge1xuICAgIC4uLmNyZWRzLFxuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICByZWZyZXNoVG9rZW46IG5ld1JlZnJlc2hUb2tlbixcbiAgICBhY2Nlc3NUb2tlbkV4cGlyZXNBdDogZGF0YS5leHBpcmVzX2luXG4gICAgICA/IERhdGUubm93KCkgKyBkYXRhLmV4cGlyZXNfaW4gKiAxMDAwXG4gICAgICA6IGNyZWRzLmFjY2Vzc1Rva2VuRXhwaXJlc0F0LFxuICAgIC4uLihkYXRhLmlkX3Rva2VuID8geyBpZFRva2VuOiBkYXRhLmlkX3Rva2VuIH0gOiB7fSksXG4gIH07XG5cbiAgLy8g7ZqM7KCEKHJvdGF0ZWQp7J20IOydvOyWtOuCrOuKlOuNsCDsnbQgc2F2ZSDqsIAg7Iuk7Yyo7ZWY66m0LCBPcGVuQUkg7Kq9IOyYmyByZWZyZXNoX3Rva2VuIOydgCDsnbTrr7hcbiAgLy8g7Y+Q6riw65CcIOyDge2DnOyXkOyEnCBEQiDsl5DripQg7JibIO2GoO2BsOydtCDrgqjripTri6Qg4oaSIOuLpOydjCByZWZyZXNoIOqwgCByZWZyZXNoX3Rva2VuX3JldXNlZCDroZxcbiAgLy8g7JiB6rWsIOyCrOunnS4g7J20IOq1rOqwhCDsi6TtjKjripQg7Yag7YGwIOyCrOunneydmCDsp4HsoJEg7JuQ7J247J2066+A66GcIOuwmOuTnOyLnCDtgazqsowg64Ko6ri064ukLlxuICB0cnkge1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbklkLFxuICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWRDcmVkcyxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZXJyb3IoXG4gICAgICBgT3BlbkFJIHJlZnJlc2g6IERCIHNhdmUgRkFJTEVEIGFmdGVyIHJvdGF0aW9uKHJvdGF0ZWQ9JHtyb3RhdGVkfSkgYCArXG4gICAgICAgIGB0b2tlbj0ke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW5JZH0pIOKAlCDsmJsgcmVmcmVzaF90b2tlbiDtj5DquLDrkKgsIERCIOuvuOuwmOyYgSDihpIg7Yag7YGwIOyCrOunnSDsnITtl5guIGVycj0ke1N0cmluZyhlKX1gLFxuICAgICk7XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxvZ2dlci5pbmZvKGB0b2tlbiAke3Rva2VuLm5hbWV9IHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgKHJvdGF0ZWQ9JHtyb3RhdGVkfSlgKTtcblxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiBkYXRhLmFjY2Vzc190b2tlbixcbiAgICBjaGF0Z3B0QWNjb3VudElkOiBjcmVkcy5hY2NvdW50SWQsXG4gICAgY2hhdGdwdFBsYW5UeXBlOiBjcmVkcy5wbGFuVHlwZSxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU0sU0FBUyxVQUFVLENBQUMsU0FBUyxnQkFBZ0IsQ0FBQztBQUtwRCxNQUFNLDBDQUEwQixJQUFJLElBQUk7Q0FDdEM7Q0FDQTtDQUNBO0FBQ0YsQ0FBQztBQUdELE1BQU0sa0NBQWtCLElBQUksSUFBb0M7QUFDaEUsTUFBTSxrQ0FBa0IsSUFBSSxJQUFvQjtBQUNoRCxNQUFNLDBCQUEwQjtBQVFoQyxlQUFzQiwrQkFBK0IsU0FBeUM7Q0FDNUYsT0FBTyxLQUFLLCtCQUErQixRQUFRLFFBQVEsUUFBUSxJQUFJLEVBQUU7Q0FDekUsTUFBTSxXQUFXLGdCQUFnQixJQUFJLE9BQU87Q0FDNUMsSUFBSSxVQUFVO0VBQ1osT0FBTyxLQUFLLDJCQUEyQixTQUFTO0VBQ2hELE9BQU87Q0FDVDtDQUVBLE1BQU0sU0FBUyxnQkFBZ0IsSUFBSSxPQUFPLEtBQUs7Q0FDL0MsSUFBSSxLQUFLLElBQUksSUFBSSxTQUFTLHlCQUF5QjtFQUNqRCxPQUFPLEtBQUssOEJBQThCLFFBQVEsZ0NBQWdDO0VBQ2xGLE9BQU8saUJBQWlCLE9BQU87Q0FDakM7Q0FFQSxnQkFBZ0IsSUFBSSxTQUFTLEtBQUssSUFBSSxDQUFDO0NBQ3ZDLE1BQU0s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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getLogger } from "@logtape/logtape";
|
|
2
|
+
//#region src/utils/slack-notify.ts
|
|
3
|
+
/**
|
|
4
|
+
* Slack 알림 (chat.postMessage).
|
|
5
|
+
*
|
|
6
|
+
* fail-open: env 미설정이면 조용히 no-op 이고, 전송 실패는 warn 로그로만 남긴다.
|
|
7
|
+
* 알림 경로가 토큰 라우팅이나 오류 전파를 지연·차단해서는 안 된다.
|
|
8
|
+
*/
|
|
9
|
+
const logger = getLogger(["qgrid", "slack"]);
|
|
10
|
+
const SLACK_POST_MESSAGE_URL = "https://slack.com/api/chat.postMessage";
|
|
11
|
+
const SLACK_TIMEOUT_MS = 5e3;
|
|
12
|
+
/** 상태를 색으로 먼저 읽히게 하는 attachment 색상 바. */
|
|
13
|
+
const SLACK_COLOR = {
|
|
14
|
+
good: "#2eb886",
|
|
15
|
+
bad: "#e01e5a"
|
|
16
|
+
};
|
|
17
|
+
async function notifySlack(notification) {
|
|
18
|
+
const botToken = process.env.SLACK_BOT_TOKEN;
|
|
19
|
+
const channel = process.env.SLACK_CHANNEL_ID;
|
|
20
|
+
const { title, subject, context, color } = notification;
|
|
21
|
+
if (!botToken || !channel) {
|
|
22
|
+
logger.debug(`slack not configured, skipping notification: ${title} ${subject ?? ""}`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const blocks = [{
|
|
26
|
+
type: "section",
|
|
27
|
+
text: {
|
|
28
|
+
type: "mrkdwn",
|
|
29
|
+
text: subject ? `*${title}* \`${subject}\`` : `*${title}*`
|
|
30
|
+
}
|
|
31
|
+
}];
|
|
32
|
+
if (context) blocks.push({
|
|
33
|
+
type: "context",
|
|
34
|
+
elements: [{
|
|
35
|
+
type: "mrkdwn",
|
|
36
|
+
text: context
|
|
37
|
+
}]
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
const res = await fetch(SLACK_POST_MESSAGE_URL, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
44
|
+
Authorization: `Bearer ${botToken}`
|
|
45
|
+
},
|
|
46
|
+
body: JSON.stringify({
|
|
47
|
+
channel,
|
|
48
|
+
text: subject ? `${title} — ${subject}` : title,
|
|
49
|
+
attachments: [{
|
|
50
|
+
...color ? { color } : {},
|
|
51
|
+
blocks
|
|
52
|
+
}]
|
|
53
|
+
}),
|
|
54
|
+
signal: AbortSignal.timeout(SLACK_TIMEOUT_MS)
|
|
55
|
+
});
|
|
56
|
+
const body = await res.json().catch(() => null);
|
|
57
|
+
if (!body?.ok) logger.warn(`slack notification rejected: ${body?.error ?? `http ${res.status}`}`);
|
|
58
|
+
} catch (e) {
|
|
59
|
+
logger.warn(`slack notification failed: ${e.message}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { SLACK_COLOR, notifySlack };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zbGFjay1ub3RpZnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTbGFjayDslYzrprwgKGNoYXQucG9zdE1lc3NhZ2UpLlxuICpcbiAqIGZhaWwtb3BlbjogZW52IOuvuOyEpOygleydtOuptCDsobDsmqntnoggbm8tb3Ag7J206rOgLCDsoITshqEg7Iuk7Yyo64qUIHdhcm4g66Gc6re466Gc66eMIOuCqOq4tOuLpC5cbiAqIOyVjOumvCDqsr3roZzqsIAg7Yag7YGwIOudvOyasO2MheydtOuCmCDsmKTrpZgg7KCE7YyM66W8IOyngOyXsMK37LCo64uo7ZW07ISc64qUIOyViCDrkJzri6QuXG4gKi9cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcInNsYWNrXCJdKTtcblxuY29uc3QgU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCA9IFwiaHR0cHM6Ly9zbGFjay5jb20vYXBpL2NoYXQucG9zdE1lc3NhZ2VcIjtcbmNvbnN0IFNMQUNLX1RJTUVPVVRfTVMgPSA1XzAwMDtcblxuLyoqIOyDge2DnOulvCDsg4nsnLzroZwg66i87KCAIOydve2eiOqyjCDtlZjripQgYXR0YWNobWVudCDsg4nsg4Eg67CULiAqL1xuZXhwb3J0IGNvbnN0IFNMQUNLX0NPTE9SID0ge1xuICBnb29kOiBcIiMyZWI4ODZcIixcbiAgYmFkOiBcIiNlMDFlNWFcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNsYWNrTm90aWZpY2F0aW9uID0ge1xuICAvKiog7ZWcIOykhCDsoJzrqqkuIOustOyKqCDsnbzsnbQg7J287Ja064Ks64qU7KeA66eMIOuLtOuKlOuLpC4gKi9cbiAgdGl0bGU6IHN0cmluZztcbiAgLyoqIOygnOuqqSDsmIYg7L2U65OcIOyKpO2DgOydvOuhnCDrtpnripQg64yA7IOBIOyLneuzhOyekC4gKi9cbiAgc3ViamVjdD86IHN0cmluZztcbiAgLyoqIOygnOuqqSDslYTrnpgg7J6R7J2AIOq4gOyUqOuhnCDrgrTroKTqsIDripQg67aA6rCAIOygleuztCDigJQg7J297KeAIOyViuyVhOuPhCDrkJjripQg6rKD65OkLiAqL1xuICBjb250ZXh0Pzogc3RyaW5nO1xuICBjb2xvcj86ICh0eXBlb2YgU0xBQ0tfQ09MT1IpW2tleW9mIHR5cGVvZiBTTEFDS19DT0xPUl07XG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm90aWZ5U2xhY2sobm90aWZpY2F0aW9uOiBTbGFja05vdGlmaWNhdGlvbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBib3RUb2tlbiA9IHByb2Nlc3MuZW52LlNMQUNLX0JPVF9UT0tFTjtcbiAgY29uc3QgY2hhbm5lbCA9IHByb2Nlc3MuZW52LlNMQUNLX0NIQU5ORUxfSUQ7XG4gIGNvbnN0IHsgdGl0bGUsIHN1YmplY3QsIGNvbnRleHQsIGNvbG9yIH0gPSBub3RpZmljYXRpb247XG4gIGlmICghYm90VG9rZW4gfHwgIWNoYW5uZWwpIHtcbiAgICBsb2dnZXIuZGVidWcoYHNsYWNrIG5vdCBjb25maWd1cmVkLCBza2lwcGluZyBub3RpZmljYXRpb246ICR7dGl0bGV9ICR7c3ViamVjdCA/PyBcIlwifWApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJsb2NrczogdW5rbm93bltdID0gW1xuICAgIHtcbiAgICAgIHR5cGU6IFwic2VjdGlvblwiLFxuICAgICAgdGV4dDogeyB0eXBlOiBcIm1ya2R3blwiLCB0ZXh0OiBzdWJqZWN0ID8gYCoke3RpdGxlfSogIFxcYCR7c3ViamVjdH1cXGBgIDogYCoke3RpdGxlfSpgIH0sXG4gICAgfSxcbiAgXTtcbiAgaWYgKGNvbnRleHQpIHtcbiAgICBibG9ja3MucHVzaCh7IHR5cGU6IFwiY29udGV4dFwiLCBlbGVtZW50czogW3sgdHlwZTogXCJtcmtkd25cIiwgdGV4dDogY29udGV4dCB9XSB9KTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goU0xBQ0tfUE9TVF9NRVNTQUdFX1VSTCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04XCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtib3RUb2tlbn1gLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgLy8g7JWM66a8IOuvuOumrOuztOq4sMK37KCR6re87ISx7JqpIOuMgOyytCDthY3siqTtirguIGJsb2NrcyDrp4wg67O064K066m0IO2RuOyLnCDslYzrprzsnbQg67mI7Lm47Jy866GcIOucrOuLpC5cbiAgICAgICAgdGV4dDogc3ViamVjdCA/IGAke3RpdGxlfSDigJQgJHtzdWJqZWN0fWAgOiB0aXRsZSxcbiAgICAgICAgYXR0YWNobWVudHM6IFt7IC4uLihjb2xvciA/IHsgY29sb3IgfSA6IHt9KSwgYmxvY2tzIH1dLFxuICAgICAgfSksXG4gICAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoU0xBQ0tfVElNRU9VVF9NUyksXG4gICAgfSk7XG5cbiAgICAvLyBib3Qg66+47LSI64yAKG5vdF9pbl9jaGFubmVsKcK37J6Y66q765CcIOyxhOuEkCDrk7Eg6rCA7J6lIO2dlO2VnCDsmKTshKTsoJXsnYAgSFRUUCAyMDAgKyBvazpmYWxzZSDroZwg7Jio64ukLlxuICAgIC8vIHN0YXR1cyDrp4wg67O066m0IOyhsOyaqe2eiCDshLHqs7Ug7LKY66as64+8IOyVjOumvOydtCDthrXsp7jroZwg7IKs65287KeE64ukLlxuICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzLmpzb24oKS5jYXRjaCgoKSA9PiBudWxsKSkgYXMgeyBvaz86IGJvb2xlYW47IGVycm9yPzogc3RyaW5nIH0gfCBudWxsO1xuICAgIGlmICghYm9keT8ub2spIHtcbiAgICAgIGxvZ2dlci53YXJuKGBzbGFjayBub3RpZmljYXRpb24gcmVqZWN0ZWQ6ICR7Ym9keT8uZXJyb3IgPz8gYGh0dHAgJHtyZXMuc3RhdHVzfWB9YCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nZ2VyLndhcm4oYHNsYWNrIG5vdGlmaWNhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsT0FBTyxDQUFDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sbUJBQW1COztBQUd6QixNQUFhLGNBQWM7Q0FDekIsTUFBTTtDQUNOLEtBQUs7QUFDUDtBQVlBLGVBQXNCLFlBQVksY0FBZ0Q7Q0FDaEYsTUFBTSxXQUFXLFFBQVEsSUFBSTtDQUM3QixNQUFNLFVBQVUsUUFBUSxJQUFJO0NBQzVCLE1BQU0sRUFBRSxPQUFPLFNBQVMsU0FBUyxVQUFVO0NBQzNDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUztFQUN6QixPQUFPLE1BQU0sZ0RBQWdELE1BQU0sR0FBRyxXQUFXLElBQUk7RUFDckY7Q0FDRjtDQUVBLE1BQU0sU0FBb0IsQ0FDeEI7RUFDRSxNQUFNO0VBQ04sTUFBTTtHQUFFLE1BQU07R0FBVSxNQUFNLFVBQVUsSUFBSSxNQUFNLE9BQU8sUUFBUSxNQUFNLElBQUksTUFBTTtFQUFHO0NBQ3RGLENBQ0Y7Q0FDQSxJQUFJLFNBQ0YsT0FBTyxLQUFLO0VBQUUsTUFBTTtFQUFXLFVBQVUsQ0FBQztHQUFFLE1BQU07R0FBVSxNQUFNO0VBQVEsQ0FBQztDQUFFLENBQUM7Q0FHaEYsSUFBSTtFQUNGLE1BQU0sTUFBTSxNQUFNLE1BQU0sd0JBQXdCO0dBQzlDLFFBQVE7R0FDUixTQUFTO0lBQ1AsZ0JBQWdCO0lBQ2hCLGVBQWUsVUFBVTtHQUMzQjtHQUNBLE1BQU0sS0FBSyxVQUFVO0lBQ25CO0lBRUEsTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLFlBQVk7SUFDMUMsYUFBYSxDQUFDO0tBQUUsR0FBSSxRQUFRLEVBQUUsTUFBTSxJQUFJLENBQUM7S0FBSTtJQUFPLENBQUM7R0FDdkQsQ0FBQztHQUNELFFBQVEsWUFBWSxRQUFRLGdCQUFnQjtFQUM5QyxDQUFDO0VBSUQsTUFBTSxPQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxZQUFZLElBQUk7RUFDL0MsSUFBSSxDQUFDLE1BQU0sSUFDVCxPQUFPLEtBQUssZ0NBQWdDLE1BQU0sU0FBUyxRQUFRLElBQUksVUFBVTtDQUVyRixTQUFTLEdBQUc7RUFDVixPQUFPLEtBQUssOEJBQStCLEVBQVksU0FBUztDQUNsRTtBQUNGIn0=
|
|
@@ -117,6 +117,25 @@ export async function exchangeCodeForTokens(
|
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
/**
|
|
121
|
+
* refresh 실패를 status 와 함께 전달한다. 호출부가 문자열 메시지를 파싱하지 않고
|
|
122
|
+
* 영구 실패(400/401)를 판별할 수 있어야 하기 때문이다.
|
|
123
|
+
*/
|
|
124
|
+
export class RefreshFailedError extends Error {
|
|
125
|
+
override readonly name = "RefreshFailedError";
|
|
126
|
+
constructor(
|
|
127
|
+
readonly status: number,
|
|
128
|
+
readonly body: string,
|
|
129
|
+
) {
|
|
130
|
+
super(`Token refresh failed (${status}): ${body}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** 재로그인 외 복구 불가한 인증 실패인지. 일시 오류(5xx·네트워크)는 제외된다. */
|
|
134
|
+
get isAuthDead(): boolean {
|
|
135
|
+
return this.status === 400 || this.status === 401;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
120
139
|
export async function refreshAccessToken(refreshToken: string): Promise<OAuthTokens> {
|
|
121
140
|
const res = await fetch(TOKEN_URL, {
|
|
122
141
|
method: "POST",
|
|
@@ -130,7 +149,7 @@ export async function refreshAccessToken(refreshToken: string): Promise<OAuthTok
|
|
|
130
149
|
});
|
|
131
150
|
if (!res.ok) {
|
|
132
151
|
const text = await res.text();
|
|
133
|
-
throw new
|
|
152
|
+
throw new RefreshFailedError(res.status, text);
|
|
134
153
|
}
|
|
135
154
|
const data = (await res.json()) as {
|
|
136
155
|
access_token: string;
|
|
@@ -37,6 +37,21 @@ vi.mock("../token/token.model", () => ({
|
|
|
37
37
|
save: tokenSaveMock,
|
|
38
38
|
del: tokenDelMock,
|
|
39
39
|
findByAccountIdentifier: findByAccountMock,
|
|
40
|
+
// 실제 구현과 같은 순서(dedup → save)로 동작시켜 저장 payload 검증이 유지되게 한다.
|
|
41
|
+
replaceByAccount: async (
|
|
42
|
+
_provider: string,
|
|
43
|
+
accountId: string | undefined,
|
|
44
|
+
saveParams: unknown,
|
|
45
|
+
) => {
|
|
46
|
+
let isNew = false;
|
|
47
|
+
if (accountId) {
|
|
48
|
+
const olds = (await findByAccountMock()) as unknown as { id: number; active: boolean }[];
|
|
49
|
+
if (olds.length > 0) await tokenDelMock();
|
|
50
|
+
else isNew = true;
|
|
51
|
+
}
|
|
52
|
+
await (tokenSaveMock as unknown as (rows: unknown[]) => Promise<number[]>)([saveParams]);
|
|
53
|
+
return { isNew };
|
|
54
|
+
},
|
|
40
55
|
},
|
|
41
56
|
}));
|
|
42
57
|
|
|
@@ -106,7 +121,7 @@ describe("QgridFrame.oauthComplete code flow", () => {
|
|
|
106
121
|
|
|
107
122
|
it("exchanges a pasted code#state against the stored pending state and saves the token", async () => {
|
|
108
123
|
mockHttpContext({ origin: "https://qgrid.example.com" });
|
|
109
|
-
const { authUrl } = await QgridFrame.oauthStart("
|
|
124
|
+
const { authUrl } = await QgridFrame.oauthStart("test-token-2");
|
|
110
125
|
const state = authUrlParam(authUrl, "state")!;
|
|
111
126
|
|
|
112
127
|
exchangeMock.mockResolvedValueOnce({
|
|
@@ -119,7 +134,7 @@ describe("QgridFrame.oauthComplete code flow", () => {
|
|
|
119
134
|
|
|
120
135
|
await expect(QgridFrame.oauthComplete(` the-code#${state} `)).resolves.toEqual({
|
|
121
136
|
added: true,
|
|
122
|
-
name: "
|
|
137
|
+
name: "test-token-2",
|
|
123
138
|
});
|
|
124
139
|
|
|
125
140
|
expect(exchangeMock).toHaveBeenCalledWith(
|
|
@@ -131,7 +146,7 @@ describe("QgridFrame.oauthComplete code flow", () => {
|
|
|
131
146
|
expect(tokenSaveMock).toHaveBeenCalledWith([
|
|
132
147
|
expect.objectContaining({
|
|
133
148
|
provider: "anthropic",
|
|
134
|
-
name: "
|
|
149
|
+
name: "test-token-2",
|
|
135
150
|
credentials: expect.objectContaining({ accessToken: "at", accountUuid: "acc-1" }),
|
|
136
151
|
}),
|
|
137
152
|
]);
|