allow slashes in state keys
This commit is contained in:
		
							parent
							
								
									33dd73f809
								
							
						
					
					
						commit
						0caaa0940b
					
				
					 3 changed files with 25 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -121,7 +121,8 @@ async function sendState(roomID, type, stateKey, content, mxid) {
 | 
			
		|||
	assert.ok(type)
 | 
			
		||||
	assert.ok(typeof stateKey === "string")
 | 
			
		||||
	/** @type {Ty.R.EventSent} */
 | 
			
		||||
	const root = await mreq.mreq("PUT", path(`/client/v3/rooms/${roomID}/state/${type}/${stateKey}`, mxid), content)
 | 
			
		||||
	// encodeURIComponent is necessary because state key can contain some special characters like / but you must encode them so they fit in a single component of the URI
 | 
			
		||||
	const root = await mreq.mreq("PUT", path(`/client/v3/rooms/${roomID}/state/${type}/${encodeURIComponent(stateKey)}`, mxid), content)
 | 
			
		||||
	return root.event_id
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,9 +19,10 @@ function kstateToState(kstate) {
 | 
			
		|||
	const events = []
 | 
			
		||||
	kstateStripConditionals(kstate)
 | 
			
		||||
	for (const [k, content] of Object.entries(kstate)) {
 | 
			
		||||
		const [type, state_key] = k.split("/")
 | 
			
		||||
		assert.ok(typeof type === "string")
 | 
			
		||||
		assert.ok(typeof state_key === "string")
 | 
			
		||||
		const slashIndex = k.indexOf("/")
 | 
			
		||||
		assert(slashIndex > 0)
 | 
			
		||||
		const type = k.slice(0, slashIndex)
 | 
			
		||||
		const state_key = k.slice(slashIndex + 1)
 | 
			
		||||
		events.push({type, state_key, content})
 | 
			
		||||
	}
 | 
			
		||||
	return events
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +44,7 @@ function diffKState(actual, target) {
 | 
			
		|||
	const diff = {}
 | 
			
		||||
	// go through each key that it should have
 | 
			
		||||
	for (const key of Object.keys(target)) {
 | 
			
		||||
		if (!key.includes("/")) throw new Error(`target kstate's key "${key}" does not contain a slash separator; if a blank state_key was intended, add a trailing slash to the kstate key.`)
 | 
			
		||||
		if (!key.includes("/")) throw new Error(`target kstate's key "${key}" does not contain a slash separator; if a blank state_key was intended, add a trailing slash to the kstate key.\ncontext: ${JSON.stringify(target)}`)
 | 
			
		||||
 | 
			
		||||
		if (key === "m.room.power_levels/") {
 | 
			
		||||
			// Special handling for power levels, we want to deep merge the actual and target into the final state.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,8 @@ test("kstate strip: keeps true conditions while removing $if", t => {
 | 
			
		|||
test("kstate2state: general", t => {
 | 
			
		||||
	t.deepEqual(kstateToState({
 | 
			
		||||
		"m.room.name/": {name: "test name"},
 | 
			
		||||
		"m.room.member/@cadence:cadence.moe": {membership: "join"}
 | 
			
		||||
		"m.room.member/@cadence:cadence.moe": {membership: "join"},
 | 
			
		||||
		"uk.half-shot.bridge/org.matrix.appservice-irc://irc/epicord.net/#general": {creator: "@cadence:cadence.moe"}
 | 
			
		||||
	}), [
 | 
			
		||||
		{
 | 
			
		||||
			type: "m.room.name",
 | 
			
		||||
| 
						 | 
				
			
			@ -38,6 +39,13 @@ test("kstate2state: general", t => {
 | 
			
		|||
			content: {
 | 
			
		||||
				membership: "join"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			type: "uk.half-shot.bridge",
 | 
			
		||||
			state_key: "org.matrix.appservice-irc://irc/epicord.net/#general",
 | 
			
		||||
			content: {
 | 
			
		||||
				creator: "@cadence:cadence.moe"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	])
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			@ -57,10 +65,18 @@ test("state2kstate: general", t => {
 | 
			
		|||
			content: {
 | 
			
		||||
				membership: "join"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			type: "uk.half-shot.bridge",
 | 
			
		||||
			state_key: "org.matrix.appservice-irc://irc/epicord.net/#general",
 | 
			
		||||
			content: {
 | 
			
		||||
				creator: "@cadence:cadence.moe"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	]), {
 | 
			
		||||
		"m.room.name/": {name: "test name"},
 | 
			
		||||
		"m.room.member/@cadence:cadence.moe": {membership: "join"}
 | 
			
		||||
		"m.room.member/@cadence:cadence.moe": {membership: "join"},
 | 
			
		||||
		"uk.half-shot.bridge/org.matrix.appservice-irc://irc/epicord.net/#general": {creator: "@cadence:cadence.moe"}
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue