Skip to content

Commit 9f49188

Browse files
committed
feat(networks): add sessionSigs support
1 parent 3df541d commit 9f49188

File tree

6 files changed

+170
-74
lines changed

6 files changed

+170
-74
lines changed

packages/networks/src/networks/vNaga/shared/factories/BaseModuleFactory.ts

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -575,11 +575,25 @@ export function createBaseModule<T, M>(config: BaseModuleConfig<T, M>) {
575575
): Promise<RequestItem<z.infer<typeof EncryptedVersion1Schema>>[]> => {
576576
_logger.info({ params }, 'pkpSign:createRequest: Creating request');
577577

578-
// Generate session sigs
579-
const sessionSigs = await issueSessionFromContext({
580-
pricingContext: PricingContextSchema.parse(params.pricingContext),
581-
authContext: params.authContext,
582-
});
578+
// Generate or reuse session sigs
579+
let sessionSigs: Record<string, AuthSig>;
580+
if (params.sessionSigs && Object.keys(params.sessionSigs).length > 0) {
581+
sessionSigs = params.sessionSigs;
582+
} else {
583+
if (!params.authContext) {
584+
throw new Error(
585+
'authContext is required when sessionSigs are not provided for pkpSign.'
586+
);
587+
}
588+
const pricingContext = PricingContextSchema.parse(
589+
params.pricingContext
590+
);
591+
sessionSigs = await issueSessionFromContext({
592+
pricingContext,
593+
authContext: params.authContext,
594+
delegationAuthSig: params.delegationAuthSig,
595+
});
596+
}
583597

584598
_logger.info('pkpSign:createRequest: Session sigs generated');
585599

@@ -688,6 +702,11 @@ export function createBaseModule<T, M>(config: BaseModuleConfig<T, M>) {
688702
_logger.info({ params }, 'decrypt:createRequest: Creating request');
689703

690704
// Generate session sigs for decrypt
705+
if (!params.authContext) {
706+
throw new Error(
707+
'authContext is required when generating sessionSigs for decrypt.'
708+
);
709+
}
691710
const sessionSigs = await issueSessionFromContext({
692711
pricingContext: PricingContextSchema.parse(params.pricingContext),
693712
authContext: params.authContext,
@@ -1048,11 +1067,24 @@ export function createBaseModule<T, M>(config: BaseModuleConfig<T, M>) {
10481067
// Store response strategy for later use in handleResponse
10491068
executeJsResponseStrategy = params.responseStrategy;
10501069

1051-
// Generate session sigs
1052-
const sessionSigs = await issueSessionFromContext({
1053-
pricingContext: PricingContextSchema.parse(params.pricingContext),
1054-
authContext: params.authContext,
1055-
});
1070+
let sessionSigs: Record<string, AuthSig>;
1071+
if (params.sessionSigs && Object.keys(params.sessionSigs).length > 0) {
1072+
sessionSigs = params.sessionSigs;
1073+
} else {
1074+
if (!params.authContext) {
1075+
throw new Error(
1076+
'authContext is required when sessionSigs are not provided for executeJs.'
1077+
);
1078+
}
1079+
const pricingContext = PricingContextSchema.parse(
1080+
params.pricingContext
1081+
);
1082+
sessionSigs = await issueSessionFromContext({
1083+
pricingContext,
1084+
authContext: params.authContext,
1085+
delegationAuthSig: params.delegationAuthSig,
1086+
});
1087+
}
10561088

10571089
// Generate requests
10581090
const _requestId = createRequestId();

packages/networks/src/networks/vNaga/shared/managers/api-manager/APIFactory.ts

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
GenericEncryptedPayloadSchema,
66
GenericResultBuilder,
77
} from '@lit-protocol/schemas';
8-
import { RequestItem, NagaJitContext } from '@lit-protocol/types';
8+
import { AuthSig, NagaJitContext, RequestItem } from '@lit-protocol/types';
99

1010
import { E2EERequestManager } from './e2ee-request-manager/E2EERequestManager';
1111
import { composeLitUrl } from '../endpoints-manager/composeLitUrl';
@@ -37,11 +37,20 @@ export function createPKPSignAPI<T, M>(networkConfig: INetworkConfig<T, M>) {
3737
): Promise<RequestItem<z.infer<typeof EncryptedVersion1Schema>>[]> => {
3838
_logger.info({ params }, 'pkpSign:createRequest: Creating request');
3939

40-
// Generate session sigs
41-
const sessionSigs = await issueSessionFromContext({
42-
pricingContext: PricingContextSchema.parse(params.pricingContext),
43-
authContext: params.authContext,
44-
});
40+
// Generate or reuse session sigs
41+
let sessionSigs: Record<string, AuthSig>;
42+
if ('sessionSigs' in params && params.sessionSigs) {
43+
sessionSigs = params.sessionSigs;
44+
} else {
45+
const pricingContext = PricingContextSchema.parse(
46+
params.pricingContext
47+
);
48+
sessionSigs = await issueSessionFromContext({
49+
pricingContext,
50+
authContext: params.authContext,
51+
delegationAuthSig: params.delegationAuthSig,
52+
});
53+
}
4554

4655
_logger.info('pkpSign:createRequest: Session sigs generated');
4756

@@ -222,11 +231,19 @@ export function createExecuteJsAPI<T, M>(networkConfig: INetworkConfig<T, M>) {
222231
createRequest: async (params: ExecuteJsCreateRequestParams) => {
223232
_logger.info({ params }, 'executeJs:createRequest: Creating request');
224233

225-
// Generate session sigs
226-
const sessionSigs = await issueSessionFromContext({
227-
pricingContext: PricingContextSchema.parse(params.pricingContext),
228-
authContext: params.authContext,
229-
});
234+
let sessionSigs: Record<string, AuthSig>;
235+
if ('sessionSigs' in params && params.sessionSigs) {
236+
sessionSigs = params.sessionSigs;
237+
} else {
238+
const pricingContext = PricingContextSchema.parse(
239+
params.pricingContext
240+
);
241+
sessionSigs = await issueSessionFromContext({
242+
pricingContext,
243+
authContext: params.authContext,
244+
delegationAuthSig: params.delegationAuthSig,
245+
});
246+
}
230247

231248
const _requestId = createRequestId();
232249
const requests: RequestItem<z.infer<typeof EncryptedVersion1Schema>>[] =
Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
1-
import {
2-
PKPAuthContextSchema,
3-
EoaAuthContextSchema,
4-
} from '@lit-protocol/schemas';
5-
import { LitActionResponseStrategy, NagaJitContext } from '@lit-protocol/types';
1+
import { PKPAuthContextSchema, EoaAuthContextSchema } from '@lit-protocol/schemas';
2+
import { AuthSig, LitActionResponseStrategy, NagaJitContext } from '@lit-protocol/types';
63
import { z } from 'zod';
74
import { PricingContextSchema } from '../../pricing-manager/schema';
85
import { ConnectionInfo } from '../../LitChainClient/types';
96

10-
export type ExecuteJsCreateRequestParams = {
7+
type ExecuteJsCreateRequestParamsBase = {
118
pricingContext: z.input<typeof PricingContextSchema>;
12-
authContext: z.input<
13-
typeof PKPAuthContextSchema | typeof EoaAuthContextSchema
14-
>;
159
executionContext: {
1610
code?: string;
1711
ipfsId?: string;
@@ -23,3 +17,23 @@ export type ExecuteJsCreateRequestParams = {
2317
responseStrategy?: LitActionResponseStrategy;
2418
jitContext: NagaJitContext;
2519
};
20+
21+
export type ExecuteJsCreateRequestParamsWithAuthContext =
22+
ExecuteJsCreateRequestParamsBase & {
23+
authContext: z.input<
24+
typeof PKPAuthContextSchema | typeof EoaAuthContextSchema
25+
>;
26+
sessionSigs?: never;
27+
delegationAuthSig?: AuthSig;
28+
};
29+
30+
export type ExecuteJsCreateRequestParamsWithSessionSigs =
31+
ExecuteJsCreateRequestParamsBase & {
32+
sessionSigs: Record<string, AuthSig>;
33+
authContext?: undefined;
34+
delegationAuthSig?: AuthSig;
35+
};
36+
37+
export type ExecuteJsCreateRequestParams =
38+
| ExecuteJsCreateRequestParamsWithAuthContext
39+
| ExecuteJsCreateRequestParamsWithSessionSigs;
Lines changed: 70 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,91 @@
11
import {
22
PKPAuthContextSchema,
33
EoaAuthContextSchema,
4+
AuthSigSchema,
45
} from '@lit-protocol/schemas';
56
import { LitActionResponseStrategy } from '@lit-protocol/types';
67
import { z } from 'zod';
78

8-
/**
9-
* ExecuteJs Input Schema
10-
* Based on JsonExecutionSdkParams but following the naga-dev module pattern
11-
*/
12-
export const ExecuteJsInputSchema = z
13-
.object({
14-
/**
15-
* JS code to run on the nodes
16-
*/
17-
code: z.string().optional(),
9+
const SessionSigsSchema = z.record(z.string(), AuthSigSchema);
1810

19-
/**
20-
* The IPFS ID of some JS code to run on the nodes
21-
*/
22-
ipfsId: z.string().optional(),
11+
const ExecuteJsSharedFieldsSchema = z.object({
12+
/**
13+
* JS code to run on the nodes
14+
*/
15+
code: z.string().optional(),
2316

24-
/**
25-
* An object that contains params to expose to the Lit Action.
26-
* These will be injected to the JS runtime before your code runs.
27-
*/
28-
jsParams: z
29-
.union([
30-
z.any(),
31-
z
32-
.object({
33-
publicKey: z.string().optional(),
34-
sigName: z.string().optional(),
35-
})
36-
.catchall(z.any()),
37-
])
38-
.optional(),
17+
/**
18+
* The IPFS ID of some JS code to run on the nodes
19+
*/
20+
ipfsId: z.string().optional(),
3921

40-
/**
41-
* Authentication context - either PKP or EOA based
42-
*/
43-
authContext: z.union([PKPAuthContextSchema, EoaAuthContextSchema]),
22+
/**
23+
* An object that contains params to expose to the Lit Action.
24+
* These will be injected to the JS runtime before your code runs.
25+
*/
26+
jsParams: z
27+
.union([
28+
z.any(),
29+
z
30+
.object({
31+
publicKey: z.string().optional(),
32+
sigName: z.string().optional(),
33+
})
34+
.catchall(z.any()),
35+
])
36+
.optional(),
4437

45-
/**
46-
* User's maximum price they're willing to pay for the request
47-
*/
48-
userMaxPrice: z.bigint().optional(),
38+
/**
39+
* User's maximum price they're willing to pay for the request
40+
*/
41+
userMaxPrice: z.bigint().optional(),
42+
43+
/**
44+
* Only run the action on a single node; this will only work if all code in your action is non-interactive
45+
*/
46+
useSingleNode: z.boolean().optional(),
47+
48+
/**
49+
* Response strategy for processing Lit Action responses
50+
*/
51+
responseStrategy: z.custom<LitActionResponseStrategy>().optional(),
52+
});
53+
54+
const ExecuteJsInputWithAuthContextSchema = ExecuteJsSharedFieldsSchema.extend({
55+
/**
56+
* Authentication context - either PKP or EOA based
57+
*/
58+
authContext: z.union([PKPAuthContextSchema, EoaAuthContextSchema]),
59+
60+
/**
61+
* Session signatures must not be supplied when an auth context is provided.
62+
*/
63+
sessionSigs: z.never().optional(),
64+
});
4965

66+
const ExecuteJsInputWithSessionSigsSchema =
67+
ExecuteJsSharedFieldsSchema.extend({
5068
/**
51-
* Only run the action on a single node; this will only work if all code in your action is non-interactive
69+
* Pre-generated session signatures; when provided, authContext must be omitted.
5270
*/
53-
useSingleNode: z.boolean().optional(),
71+
sessionSigs: SessionSigsSchema,
5472

5573
/**
56-
* Response strategy for processing Lit Action responses
74+
* authContext is intentionally unsupported in this branch.
5775
*/
58-
responseStrategy: z.custom<LitActionResponseStrategy>().optional(),
59-
})
76+
authContext: z.undefined().optional(),
77+
});
78+
79+
export const ExecuteJsInputSchema = z
80+
.union([
81+
ExecuteJsInputWithAuthContextSchema,
82+
ExecuteJsInputWithSessionSigsSchema,
83+
])
6084
.refine((data) => data.code || data.ipfsId, {
6185
message: "Either 'code' or 'ipfsId' must be provided",
6286
path: ['code'],
6387
});
88+
89+
export type ExecuteJsInput =
90+
| z.infer<typeof ExecuteJsInputWithAuthContextSchema>
91+
| z.infer<typeof ExecuteJsInputWithSessionSigsSchema>;

packages/networks/src/networks/vNaga/shared/managers/api-manager/pkpSign/pkpSign.CreateRequestParams.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
PKPAuthContextSchema,
66
SigningChainSchema,
77
} from '@lit-protocol/schemas';
8-
import { NagaJitContext } from '@lit-protocol/types';
8+
import { NagaJitContext, AuthSig, SessionSigsMap } from '@lit-protocol/types';
99
import { z } from 'zod';
1010
import { ConnectionInfo } from '../../LitChainClient/types';
1111
import { PricingContextSchema } from '../../pricing-manager/schema';
@@ -30,4 +30,6 @@ export type PKPSignCreateRequestParams = {
3030
version: string;
3131
chain: z.infer<typeof SigningChainSchema>;
3232
jitContext: NagaJitContext;
33+
sessionSigs?: SessionSigsMap;
34+
delegationAuthSig?: AuthSig;
3335
};

packages/networks/src/networks/vNaga/shared/managers/session-manager/issueSessionFromContext.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
AuthConfigSchema,
66
} from '@lit-protocol/schemas';
77
import {
8+
AuthSig,
89
LitResourceAbilityRequest,
910
SessionSigningTemplate,
1011
SessionSigsMap,
@@ -59,9 +60,11 @@ export const issueSessionFromContext = async (params: {
5960
typeof PKPAuthContextSchema | typeof EoaAuthContextSchema
6061
>;
6162
pricingContext: PricingContext;
63+
delegationAuthSig?: AuthSig;
6264
// latestBlockhash: string;
6365
}): Promise<SessionSigsMap> => {
64-
const authSig = await params.authContext.authNeededCallback();
66+
const authSig =
67+
params.delegationAuthSig || (await params.authContext.authNeededCallback());
6568
const _authConfig = AuthConfigSchema.parse(params.authContext.authConfig);
6669

6770
const capabilities = [

0 commit comments

Comments
 (0)